1 .text
2 
3 .type	__KeccakF1600,@function
4 .align	32
5 __KeccakF1600:
6 	stg	%r14,8*14(%r15)
7 	lg	%r0,160(%r2)
8 	lg	%r1,168(%r2)
9 	lg	%r5,176(%r2)
10 	lg	%r6,184(%r2)
11 	lg	%r7,192(%r2)
12 	larl	%r4,iotas
13 	j	.Loop
14 
15 .align	16
16 .Loop:
17 	lg	%r8,0(%r2)
18 	lg	%r9,48(%r2)
19 	lg	%r10,96(%r2)
20 	lg	%r11,144(%r2)
21 
22 	xgr	%r0,%r8
23 	xg	%r1,8(%r2)
24 	xg	%r5,16(%r2)
25 	xg	%r6,24(%r2)
26 	lgr	%r12,%r7
27 	xg	%r7,32(%r2)
28 
29 	xg	%r0,40(%r2)
30 	xgr	%r1,%r9
31 	xg	%r5,56(%r2)
32 	xg	%r6,64(%r2)
33 	xg	%r7,72(%r2)
34 
35 	xg	%r0,80(%r2)
36 	xg	%r1,88(%r2)
37 	xgr	%r5,%r10
38 	xg	%r6,104(%r2)
39 	xg	%r7,112(%r2)
40 
41 	xg	%r0,120(%r2)
42 	xg	%r1,128(%r2)
43 	xg	%r5,136(%r2)
44 	xgr	%r6,%r11
45 	xg	%r7,152(%r2)
46 
47 	lgr	%r13,%r5
48 	rllg	%r5,%r5,1
49 	xgr	%r5,%r0		# D[1] = ROL64(C[2], 1) ^ C[0]
50 
51 	rllg	%r0,%r0,1
52 	xgr	%r0,%r6		# D[4] = ROL64(C[0], 1) ^ C[3]
53 
54 	rllg	%r6,%r6,1
55 	xgr	%r6,%r1		# D[2] = ROL64(C[3], 1) ^ C[1]
56 
57 	rllg	%r1,%r1,1
58 	xgr	%r1,%r7		# D[0] = ROL64(C[1], 1) ^ C[4]
59 
60 	rllg	%r7,%r7,1
61 	xgr	%r7,%r13		# D[3] = ROL64(C[4], 1) ^ C[2]
62 	xgr	%r9,%r5
63 	xgr	%r10,%r6
64 	xgr	%r11,%r7
65 	 rllg	%r9,%r9,44
66 	xgr	%r12,%r0
67 	 rllg	%r10,%r10,43
68 	xgr	%r8,%r1
69 
70 	lgr	%r13,%r9
71 	ogr	%r9,%r10
72 	 rllg	%r11,%r11,21
73 	xgr	%r9,%r8		#	    C[0] ^ ( C[1] | C[2])
74 	 rllg	%r12,%r12,14
75 	xg	%r9,0(%r4)
76 	la	%r4,8(%r4)
77 	stg	%r9,0(%r3)	# R[0][0] = C[0] ^ ( C[1] | C[2]) ^ iotas[i]
78 
79 	lgr	%r14,%r12
80 	ngr	%r12,%r11
81 	 lghi	%r9,-1		# no 'not' instruction :-(
82 	xgr	%r12,%r10		#	    C[2] ^ ( C[4] & C[3])
83 	 xgr	%r10,%r9		# not	%r10
84 	stg	%r12,16(%r3)	# R[0][2] = C[2] ^ ( C[4] & C[3])
85 	 ogr	%r10,%r11
86 	 xgr	%r10,%r13		#	    C[1] ^ (~C[2] | C[3])
87 
88 	ngr	%r13,%r8
89 	 stg	%r10,8(%r3)	# R[0][1] = C[1] ^ (~C[2] | C[3])
90 	xgr	%r13,%r14		#	    C[4] ^ ( C[1] & C[0])
91 	 ogr	%r14,%r8
92 	stg	%r13,32(%r3)	# R[0][4] = C[4] ^ ( C[1] & C[0])
93 	 xgr	%r14,%r11		#	    C[3] ^ ( C[4] | C[0])
94 	 stg	%r14,24(%r3)	# R[0][3] = C[3] ^ ( C[4] | C[0])
95 
96 
97 	lg	%r8,24(%r2)
98 	lg	%r12,176(%r2)
99 	lg	%r11,128(%r2)
100 	lg	%r9,72(%r2)
101 	lg	%r10,80(%r2)
102 
103 	xgr	%r8,%r7
104 	xgr	%r12,%r6
105 	 rllg	%r8,%r8,28
106 	xgr	%r11,%r5
107 	 rllg	%r12,%r12,61
108 	xgr	%r9,%r0
109 	 rllg	%r11,%r11,45
110 	xgr	%r10,%r1
111 
112 	lgr	%r13,%r8
113 	ogr	%r8,%r12
114 	 rllg	%r9,%r9,20
115 	xgr	%r8,%r11		#	    C[3] ^ (C[0] |  C[4])
116 	 rllg	%r10,%r10,3
117 	stg	%r8,64(%r3)	# R[1][3] = C[3] ^ (C[0] |  C[4])
118 
119 	lgr	%r14,%r9
120 	ngr	%r9,%r13
121 	 lghi	%r8,-1		# no 'not' instruction :-(
122 	xgr	%r9,%r12		#	    C[4] ^ (C[1] &  C[0])
123 	 xgr	%r12,%r8		# not	%r12
124 	stg	%r9,72(%r3)	# R[1][4] = C[4] ^ (C[1] &  C[0])
125 
126 	 ogr	%r12,%r11
127 	 xgr	%r12,%r10		#	    C[2] ^ (~C[4] | C[3])
128 
129 	ngr	%r11,%r10
130 	 stg	%r12,56(%r3)	# R[1][2] = C[2] ^ (~C[4] | C[3])
131 	xgr	%r11,%r14		#	    C[1] ^ (C[3] &  C[2])
132 	 ogr	%r14,%r10
133 	stg	%r11,48(%r3)	# R[1][1] = C[1] ^ (C[3] &  C[2])
134 	 xgr	%r14,%r13		#	    C[0] ^ (C[1] |  C[2])
135 	 stg	%r14,40(%r3)	# R[1][0] = C[0] ^ (C[1] |  C[2])
136 
137 
138 	lg	%r10,104(%r2)
139 	lg	%r11,152(%r2)
140 	lg	%r9,56(%r2)
141 	lg	%r12,160(%r2)
142 	lg	%r8,8(%r2)
143 
144 	xgr	%r10,%r7
145 	xgr	%r11,%r0
146 	 rllg	%r10,%r10,25
147 	xgr	%r9,%r6
148 	 rllg	%r11,%r11,8
149 	xgr	%r12,%r1
150 	 rllg	%r9,%r9,6
151 	xgr	%r8,%r5
152 
153 	lgr	%r13,%r10
154 	ngr	%r10,%r11
155 	 rllg	%r12,%r12,18
156 	xgr	%r10,%r9		#	     C[1] ^ ( C[2] & C[3])
157 	lghi	%r14,-1		# no 'not' instruction :-(
158 	stg	%r10,88(%r3)	# R[2][1] =  C[1] ^ ( C[2] & C[3])
159 
160 	xgr	%r11,%r14		# not	%r11
161 	lgr	%r14,%r12
162 	ngr	%r12,%r11
163 	 rllg	%r8,%r8,1
164 	xgr	%r12,%r13		#	     C[2] ^ ( C[4] & ~C[3])
165 	 ogr	%r13,%r9
166 	stg	%r12,96(%r3)	# R[2][2] =  C[2] ^ ( C[4] & ~C[3])
167 	 xgr	%r13,%r8		#	     C[0] ^ ( C[2] | C[1])
168 
169 	ngr	%r9,%r8
170 	 stg	%r13,80(%r3)	# R[2][0] =  C[0] ^ ( C[2] | C[1])
171 	xgr	%r9,%r14		#	     C[4] ^ ( C[1] & C[0])
172 	 ogr	%r8,%r14
173 	stg	%r9,112(%r3)	# R[2][4] =  C[4] ^ ( C[1] & C[0])
174 	 xgr	%r8,%r11		#	    ~C[3] ^ ( C[0] | C[4])
175 	 stg	%r8,104(%r3)	# R[2][3] = ~C[3] ^ ( C[0] | C[4])
176 
177 
178 	lg	%r10,88(%r2)
179 	lg	%r11,136(%r2)
180 	lg	%r9,40(%r2)
181 	lg	%r12,184(%r2)
182 	lg	%r8,32(%r2)
183 
184 	xgr	%r10,%r5
185 	xgr	%r11,%r6
186 	 rllg	%r10,%r10,10
187 	xgr	%r9,%r1
188 	 rllg	%r11,%r11,15
189 	xgr	%r12,%r7
190 	 rllg	%r9,%r9,36
191 	xgr	%r8,%r0
192 	 rllg	%r12,%r12,56
193 
194 	lgr	%r13,%r10
195 	ogr	%r10,%r11
196 	lghi	%r14,-1		# no 'not' instruction :-(
197 	xgr	%r10,%r9		#	     C[1] ^ ( C[2] | C[3])
198 	xgr	%r11,%r14		# not	%r11
199 	stg	%r10,128(%r3)	# R[3][1] =  C[1] ^ ( C[2] | C[3])
200 
201 	lgr	%r14,%r12
202 	ogr	%r12,%r11
203 	 rllg	%r8,%r8,27
204 	xgr	%r12,%r13		#	     C[2] ^ ( C[4] | ~C[3])
205 	 ngr	%r13,%r9
206 	stg	%r12,136(%r3)	# R[3][2] =  C[2] ^ ( C[4] | ~C[3])
207 	 xgr	%r13,%r8		#	     C[0] ^ ( C[2] & C[1])
208 
209 	ogr	%r9,%r8
210 	 stg	%r13,120(%r3)	# R[3][0] =  C[0] ^ ( C[2] & C[1])
211 	xgr	%r9,%r14		#	     C[4] ^ ( C[1] | C[0])
212 	 ngr	%r8,%r14
213 	stg	%r9,152(%r3)	# R[3][4] =  C[4] ^ ( C[1] | C[0])
214 	 xgr	%r8,%r11		#	    ~C[3] ^ ( C[0] & C[4])
215 	 stg	%r8,144(%r3)	# R[3][3] = ~C[3] ^ ( C[0] & C[4])
216 
217 
218 	xg	%r6,16(%r2)
219 	xg	%r7,64(%r2)
220 	xg	%r5,168(%r2)
221 	xg	%r0,112(%r2)
222 	xgr	%r3,%r2		# xchg	%r3,%r2
223 	 rllg	%r6,%r6,62
224 	xg	%r1,120(%r2)
225 	 rllg	%r7,%r7,55
226 	xgr	%r2,%r3
227 	 rllg	%r5,%r5,2
228 	xgr	%r3,%r2
229 	 rllg	%r0,%r0,39
230 	lgr	%r13,%r6
231 	ngr	%r6,%r7
232 	lghi	%r14,-1		# no 'not' instruction :-(
233 	xgr	%r6,%r5		#	     C[4] ^ ( C[0] & C[1])
234 	xgr	%r7,%r14		# not	%r7
235 	stg	%r6,192(%r2)	# R[4][4] =  C[4] ^ ( C[0] & C[1])
236 
237 	lgr	%r14,%r0
238 	ngr	%r0,%r7
239 	 rllg	%r1,%r1,41
240 	xgr	%r0,%r13		#	     C[0] ^ ( C[2] & ~C[1])
241 	 ogr	%r13,%r5
242 	stg	%r0,160(%r2)	# R[4][0] =  C[0] ^ ( C[2] & ~C[1])
243 	 xgr	%r13,%r1		#	     C[3] ^ ( C[0] | C[4])
244 
245 	ngr	%r5,%r1
246 	 stg	%r13,184(%r2)	# R[4][3] =  C[3] ^ ( C[0] | C[4])
247 	xgr	%r5,%r14		#	     C[2] ^ ( C[4] & C[3])
248 	 ogr	%r1,%r14
249 	stg	%r5,176(%r2)	# R[4][2] =  C[2] ^ ( C[4] & C[3])
250 	 xgr	%r1,%r7		#	    ~C[1] ^ ( C[2] | C[3])
251 
252 	lgr	%r7,%r6		# harmonize with the loop top
253 	lgr	%r6,%r13
254 	 stg	%r1,168(%r2)	# R[4][1] = ~C[1] ^ ( C[2] | C[3])
255 
256 	tmll	%r4,255
257 	jnz	.Loop
258 
259 	lg	%r14,8*14(%r15)
260 	br	%r14
261 .size	__KeccakF1600,.-__KeccakF1600
262 .type	KeccakF1600,@function
263 .align	32
264 KeccakF1600:
265 .LKeccakF1600:
266 	lghi	%r1,-360
267 	stmg	%r6,%r15,8*6(%r15)
268 	lgr	%r0,%r15
269 	la	%r15,0(%r1,%r15)
270 	stg	%r0,0(%r15)
271 
272 	lghi	%r8,-1		# no 'not' instruction :-(
273 	lghi	%r9,-1
274 	lghi	%r10,-1
275 	lghi	%r11,-1
276 	lghi	%r12,-1
277 	lghi	%r13,-1
278 	xg	%r8,8(%r2)
279 	xg	%r9,16(%r2)
280 	xg	%r10,64(%r2)
281 	xg	%r11,96(%r2)
282 	xg	%r12,136(%r2)
283 	xg	%r13,160(%r2)
284 	stmg	%r8,%r9,8(%r2)
285 	stg	%r10,64(%r2)
286 	stg	%r11,96(%r2)
287 	stg	%r12,136(%r2)
288 	stg	%r13,160(%r2)
289 
290 	la	%r3,160(%r15)
291 
292 	bras	%r14,__KeccakF1600
293 
294 	lghi	%r8,-1		# no 'not' instruction :-(
295 	lghi	%r9,-1
296 	lghi	%r10,-1
297 	lghi	%r11,-1
298 	lghi	%r12,-1
299 	lghi	%r13,-1
300 	xg	%r8,8(%r2)
301 	xg	%r9,16(%r2)
302 	xg	%r10,64(%r2)
303 	xg	%r11,96(%r2)
304 	xg	%r12,136(%r2)
305 	xg	%r13,160(%r2)
306 	stmg	%r8,%r9,8(%r2)
307 	stg	%r10,64(%r2)
308 	stg	%r11,96(%r2)
309 	stg	%r12,136(%r2)
310 	stg	%r13,160(%r2)
311 
312 	lmg	%r6,%r15,360+6*8(%r15)
313 	br	%r14
314 .size	KeccakF1600,.-KeccakF1600
315 .globl	SHA3_absorb
316 .type	SHA3_absorb,@function
317 .align	32
318 SHA3_absorb:
319 	lghi	%r1,-360
320 	stmg	%r5,%r15,8*5(%r15)
321 	lgr	%r0,%r15
322 	la	%r15,0(%r1,%r15)
323 	stg	%r0,0(%r15)
324 
325 	lghi	%r8,-1		# no 'not' instruction :-(
326 	lghi	%r9,-1
327 	lghi	%r10,-1
328 	lghi	%r11,-1
329 	lghi	%r12,-1
330 	lghi	%r13,-1
331 	xg	%r8,8(%r2)
332 	xg	%r9,16(%r2)
333 	xg	%r10,64(%r2)
334 	xg	%r11,96(%r2)
335 	xg	%r12,136(%r2)
336 	xg	%r13,160(%r2)
337 	stmg	%r8,%r9,8(%r2)
338 	stg	%r10,64(%r2)
339 	stg	%r11,96(%r2)
340 	stg	%r12,136(%r2)
341 	stg	%r13,160(%r2)
342 
343 .Loop_absorb:
344 	clgr	%r4,%r5
345 	jl	.Ldone_absorb
346 
347 	srlg	%r5,%r5,3
348 	la	%r1,0(%r2)
349 
350 .Lblock_absorb:
351 	lrvg	%r0,0(%r3)
352 	la	%r3,8(%r3)
353 	xg	%r0,0(%r1)
354 	aghi	%r4,-8
355 	stg	%r0,0(%r1)
356 	la	%r1,8(%r1)
357 	brct	%r5,.Lblock_absorb
358 
359 	stmg	%r3,%r4,360+3*8(%r15)
360 	la	%r3,160(%r15)
361 	bras	%r14,__KeccakF1600
362 	lmg	%r3,%r5,360+3*8(%r15)
363 	j	.Loop_absorb
364 
365 .align	16
366 .Ldone_absorb:
367 	lghi	%r8,-1		# no 'not' instruction :-(
368 	lghi	%r9,-1
369 	lghi	%r10,-1
370 	lghi	%r11,-1
371 	lghi	%r12,-1
372 	lghi	%r13,-1
373 	xg	%r8,8(%r2)
374 	xg	%r9,16(%r2)
375 	xg	%r10,64(%r2)
376 	xg	%r11,96(%r2)
377 	xg	%r12,136(%r2)
378 	xg	%r13,160(%r2)
379 	stmg	%r8,%r9,8(%r2)
380 	stg	%r10,64(%r2)
381 	stg	%r11,96(%r2)
382 	stg	%r12,136(%r2)
383 	stg	%r13,160(%r2)
384 
385 	lgr	%r2,%r4		# return value
386 
387 	lmg	%r6,%r15,360+6*8(%r15)
388 	br	%r14
389 .size	SHA3_absorb,.-SHA3_absorb
390 .globl	SHA3_squeeze
391 .type	SHA3_squeeze,@function
392 .align	32
393 SHA3_squeeze:
394 	srlg	%r5,%r5,3
395 	stg	%r14,2*8(%r15)
396 	lghi	%r14,8
397 	stg	%r5,5*8(%r15)
398 	la	%r1,0(%r2)
399 
400 	j	.Loop_squeeze
401 
402 .align	16
403 .Loop_squeeze:
404 	clgr %r4,%r14
405 	jl	.Ltail_squeeze
406 
407 	lrvg	%r0,0(%r1)
408 	la	%r1,8(%r1)
409 	stg	%r0,0(%r3)
410 	la	%r3,8(%r3)
411 	aghi	%r4,-8			# len -= 8
412 	jz	.Ldone_squeeze
413 
414 	brct	%r5,.Loop_squeeze	# bsz--
415 
416 	stmg	%r3,%r4,3*8(%r15)
417 	bras	%r14,.LKeccakF1600
418 	lmg	%r3,%r5,3*8(%r15)
419 	lghi	%r14,8
420 	la	%r1,0(%r2)
421 	j	.Loop_squeeze
422 
423 .Ltail_squeeze:
424 	lg	%r0,0(%r1)
425 .Loop_tail_squeeze:
426 	stc	%r0,0(%r3)
427 	la	%r3,1(%r3)
428 	srlg	%r0,%r0,8
429 	brct	%r4,.Loop_tail_squeeze
430 
431 .Ldone_squeeze:
432 	lg	%r14,2*8(%r15)
433 	br	%r14
434 .size	SHA3_squeeze,.-SHA3_squeeze
435 .align	256
436 	.quad	0,0,0,0,0,0,0,0
437 .type	iotas,@object
438 iotas:
439 	.quad	0x0000000000000001
440 	.quad	0x0000000000008082
441 	.quad	0x800000000000808a
442 	.quad	0x8000000080008000
443 	.quad	0x000000000000808b
444 	.quad	0x0000000080000001
445 	.quad	0x8000000080008081
446 	.quad	0x8000000000008009
447 	.quad	0x000000000000008a
448 	.quad	0x0000000000000088
449 	.quad	0x0000000080008009
450 	.quad	0x000000008000000a
451 	.quad	0x000000008000808b
452 	.quad	0x800000000000008b
453 	.quad	0x8000000000008089
454 	.quad	0x8000000000008003
455 	.quad	0x8000000000008002
456 	.quad	0x8000000000000080
457 	.quad	0x000000000000800a
458 	.quad	0x800000008000000a
459 	.quad	0x8000000080008081
460 	.quad	0x8000000000008080
461 	.quad	0x0000000080000001
462 	.quad	0x8000000080008008
463 .size	iotas,.-iotas
464 .asciz	"Keccak-1600 absorb and squeeze for s390x, CRYPTOGAMS by <appro@openssl.org>"
465