Add sha/asm/keccak1600-s390x.pl.
[openssl.git] / crypto / sha / asm / keccak1600-s390x.pl
1 #!/usr/bin/env perl
2 # Copyright 2017 The OpenSSL Project Authors. All Rights Reserved.
3 #
4 # Licensed under the OpenSSL license (the "License").  You may not use
5 # this file except in compliance with the License.  You can obtain a copy
6 # in the file LICENSE in the source distribution or at
7 # https://www.openssl.org/source/license.html
8 #
9 # ====================================================================
10 # Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
11 # project. The module is, however, dual licensed under OpenSSL and
12 # CRYPTOGAMS licenses depending on where you obtain it. For further
13 # details see http://www.openssl.org/~appro/cryptogams/.
14 # ====================================================================
15 #
16 # Keccak-1600 for s390x.
17 #
18 # June 2017.
19 #
20 # Below code is [lane complementing] KECCAK_2X implementation (see
21 # sha/keccak1600.c) with C[5] and D[5] held in register bank. Though
22 # instead of actually unrolling the loop pair-wise I simply flip
23 # pointers to T[][] and A[][] at the end of round. Since number of
24 # rounds is even, last round writes to A[][] and everything works out.
25 # In the nutshell it's transliteration of x86_64 module, because both
26 # architectures have similar capabilities/limitations. Performance
27 # measurement is problematic as I don't have access to an idle system.
28 # It looks like z13 processes one byte [out of long message] in ~14
29 # cycles. At least the result is consistent with estimate based on
30 # amount of instruction and assumed instruction issue rate. It's ~2.5x
31 # faster than compiler-generated code.
32
33 $flavour = shift;
34
35 if ($flavour =~ /3[12]/) {
36         $SIZE_T=4;
37         $g="";
38 } else {
39         $SIZE_T=8;
40         $g="g";
41 }
42
43 while (($output=shift) && ($output!~/\w[\w\-]*\.\w+$/)) {}
44 open STDOUT,">$output";
45
46 my @A = map([ 8*$_, 8*($_+1), 8*($_+2), 8*($_+3), 8*($_+4) ], (0,5,10,15,20));
47
48 my @C = map("%r$_",(0,1,5..7));
49 my @D = map("%r$_",(8..12));
50 my @T = map("%r$_",(13..14));
51 my ($src,$dst,$iotas) = map("%r$_",(2..4));
52 my $sp = "%r15";
53
54 $stdframe=16*$SIZE_T+4*8;
55 $frame=$stdframe+25*8;
56
57 my @rhotates = ([  0,  1, 62, 28, 27 ],
58                 [ 36, 44,  6, 55, 20 ],
59                 [  3, 10, 43, 25, 39 ],
60                 [ 41, 45, 15, 21,  8 ],
61                 [ 18,  2, 61, 56, 14 ]);
62
63 { my @C = @C;   # copy, because we mess the up...
64   my @D = @D;
65
66 $code.=<<___;
67 .text
68
69 .type   __KeccakF1600,\@function
70 .align  32
71 __KeccakF1600:
72         st${g}  %r14,$SIZE_T*14($sp)
73         lg      @C[0],$A[4][0]($src)
74         lg      @C[1],$A[4][1]($src)
75         lg      @C[2],$A[4][2]($src)
76         lg      @C[3],$A[4][3]($src)
77         lg      @C[4],$A[4][4]($src)
78         j       .Loop
79
80 .align  16
81 .Loop:
82         lg      @D[0],$A[0][0]($src)
83         lg      @D[1],$A[1][1]($src)
84         lg      @D[2],$A[2][2]($src)
85         lg      @D[3],$A[3][3]($src)
86
87         xgr     @C[0],@D[0]
88         xg      @C[1],$A[0][1]($src)
89         xg      @C[2],$A[0][2]($src)
90         xg      @C[3],$A[0][3]($src)
91         lgr     @D[4],@C[4]
92         xg      @C[4],$A[0][4]($src)
93
94         xg      @C[0],$A[1][0]($src)
95         xgr     @C[1],@D[1]
96         xg      @C[2],$A[1][2]($src)
97         xg      @C[3],$A[1][3]($src)
98         xg      @C[4],$A[1][4]($src)
99
100         xg      @C[0],$A[2][0]($src)
101         xg      @C[1],$A[2][1]($src)
102         xgr     @C[2],@D[2]
103         xg      @C[3],$A[2][3]($src)
104         xg      @C[4],$A[2][4]($src)
105
106         xg      @C[0],$A[3][0]($src)
107         xg      @C[1],$A[3][1]($src)
108         xg      @C[2],$A[3][2]($src)
109         xgr     @C[3],@D[3]
110         xg      @C[4],$A[3][4]($src)
111
112         lgr     @T[0],@C[2]
113         rllg    @C[2],@C[2],1
114         xgr     @C[2],@C[0]             # D[1] = ROL64(C[2], 1) ^ C[0]
115
116         rllg    @C[0],@C[0],1
117         xgr     @C[0],@C[3]             # D[4] = ROL64(C[0], 1) ^ C[3]
118
119         rllg    @C[3],@C[3],1
120         xgr     @C[3],@C[1]             # D[2] = ROL64(C[3], 1) ^ C[1]
121
122         rllg    @C[1],@C[1],1
123         xgr     @C[1],@C[4]             # D[0] = ROL64(C[1], 1) ^ C[4]
124
125         rllg    @C[4],@C[4],1
126         xgr     @C[4],@T[0]             # D[3] = ROL64(C[4], 1) ^ C[2]
127 ___
128         my @E = @D;
129         @D = (@C[1],@C[2],@C[3],@C[4],@C[0]);
130         @C = @E;
131 $code.=<<___;
132         xgr     @C[1],@D[1]
133         xgr     @C[2],@D[2]
134         xgr     @C[3],@D[3]
135          rllg   @C[1],@C[1],$rhotates[1][1]
136         xgr     @C[4],@D[4]
137          rllg   @C[2],@C[2],$rhotates[2][2]
138         xgr     @C[0],@D[0]
139
140         lgr     @T[0],@C[1]
141         ogr     @C[1],@C[2]
142          rllg   @C[3],@C[3],$rhotates[3][3]
143         xgr     @C[1],@C[0]             #           C[0] ^ ( C[1] | C[2])
144          rllg   @C[4],@C[4],$rhotates[4][4]
145         xg      @C[1],0($iotas)
146         la      $iotas,8($iotas)
147         stg     @C[1],$A[0][0]($dst)    # R[0][0] = C[0] ^ ( C[1] | C[2]) ^ iotas[i]
148
149         lgr     @T[1],@C[4]
150         ngr     @C[4],@C[3]
151          lghi   @C[1],-1                # no 'not' instruction :-(
152         xgr     @C[4],@C[2]             #           C[2] ^ ( C[4] & C[3])
153          xgr    @C[2],@C[1]             # not   @C[2]
154         stg     @C[4],$A[0][2]($dst)    # R[0][2] = C[2] ^ ( C[4] & C[3])
155          ogr    @C[2],@C[3]
156          xgr    @C[2],@T[0]             #           C[1] ^ (~C[2] | C[3])
157
158         ngr     @T[0],@C[0]
159          stg    @C[2],$A[0][1]($dst)    # R[0][1] = C[1] ^ (~C[2] | C[3])
160         xgr     @T[0],@T[1]             #           C[4] ^ ( C[1] & C[0])
161          ogr    @T[1],@C[0]
162         stg     @T[0],$A[0][4]($dst)    # R[0][4] = C[4] ^ ( C[1] & C[0])
163          xgr    @T[1],@C[3]             #           C[3] ^ ( C[4] | C[0])
164          stg    @T[1],$A[0][3]($dst)    # R[0][3] = C[3] ^ ( C[4] | C[0])
165
166
167         lg      @C[0],$A[0][3]($src)
168         lg      @C[4],$A[4][2]($src)
169         lg      @C[3],$A[3][1]($src)
170         lg      @C[1],$A[1][4]($src)
171         lg      @C[2],$A[2][0]($src)
172
173         xgr     @C[0],@D[3]
174         xgr     @C[4],@D[2]
175          rllg   @C[0],@C[0],$rhotates[0][3]
176         xgr     @C[3],@D[1]
177          rllg   @C[4],@C[4],$rhotates[4][2]
178         xgr     @C[1],@D[4]
179          rllg   @C[3],@C[3],$rhotates[3][1]
180         xgr     @C[2],@D[0]
181
182         lgr     @T[0],@C[0]
183         ogr     @C[0],@C[4]
184          rllg   @C[1],@C[1],$rhotates[1][4]
185         xgr     @C[0],@C[3]             #           C[3] ^ (C[0] |  C[4])
186          rllg   @C[2],@C[2],$rhotates[2][0]
187         stg     @C[0],$A[1][3]($dst)    # R[1][3] = C[3] ^ (C[0] |  C[4])
188
189         lgr     @T[1],@C[1]
190         ngr     @C[1],@T[0]
191          lghi   @C[0],-1                # no 'not' instruction :-(
192         xgr     @C[1],@C[4]             #           C[4] ^ (C[1] &  C[0])
193          xgr    @C[4],@C[0]             # not   @C[4]
194         stg     @C[1],$A[1][4]($dst)    # R[1][4] = C[4] ^ (C[1] &  C[0])
195
196          ogr    @C[4],@C[3]
197          xgr    @C[4],@C[2]             #           C[2] ^ (~C[4] | C[3])
198
199         ngr     @C[3],@C[2]
200          stg    @C[4],$A[1][2]($dst)    # R[1][2] = C[2] ^ (~C[4] | C[3])
201         xgr     @C[3],@T[1]             #           C[1] ^ (C[3] &  C[2])
202          ogr    @T[1],@C[2]
203         stg     @C[3],$A[1][1]($dst)    # R[1][1] = C[1] ^ (C[3] &  C[2])
204          xgr    @T[1],@T[0]             #           C[0] ^ (C[1] |  C[2])
205          stg    @T[1],$A[1][0]($dst)    # R[1][0] = C[0] ^ (C[1] |  C[2])
206
207
208         lg      @C[2],$A[2][3]($src)
209         lg      @C[3],$A[3][4]($src)
210         lg      @C[1],$A[1][2]($src)
211         lg      @C[4],$A[4][0]($src)
212         lg      @C[0],$A[0][1]($src)
213
214         xgr     @C[2],@D[3]
215         xgr     @C[3],@D[4]
216          rllg   @C[2],@C[2],$rhotates[2][3]
217         xgr     @C[1],@D[2]
218          rllg   @C[3],@C[3],$rhotates[3][4]
219         xgr     @C[4],@D[0]
220          rllg   @C[1],@C[1],$rhotates[1][2]
221         xgr     @C[0],@D[1]
222
223         lgr     @T[0],@C[2]
224         ngr     @C[2],@C[3]
225          rllg   @C[4],@C[4],$rhotates[4][0]
226         xgr     @C[2],@C[1]             #            C[1] ^ ( C[2] & C[3])
227         lghi    @T[1],-1                # no 'not' instruction :-(
228         stg     @C[2],$A[2][1]($dst)    # R[2][1] =  C[1] ^ ( C[2] & C[3])
229
230         xgr     @C[3],@T[1]             # not   @C[3]
231         lgr     @T[1],@C[4]
232         ngr     @C[4],@C[3]
233          rllg   @C[0],@C[0],$rhotates[0][1]
234         xgr     @C[4],@T[0]             #            C[2] ^ ( C[4] & ~C[3])
235          ogr    @T[0],@C[1]
236         stg     @C[4],$A[2][2]($dst)    # R[2][2] =  C[2] ^ ( C[4] & ~C[3])
237          xgr    @T[0],@C[0]             #            C[0] ^ ( C[2] | C[1])
238
239         ngr     @C[1],@C[0]
240          stg    @T[0],$A[2][0]($dst)    # R[2][0] =  C[0] ^ ( C[2] | C[1])
241         xgr     @C[1],@T[1]             #            C[4] ^ ( C[1] & C[0])
242          ogr    @C[0],@T[1]
243         stg     @C[1],$A[2][4]($dst)    # R[2][4] =  C[4] ^ ( C[1] & C[0])
244          xgr    @C[0],@C[3]             #           ~C[3] ^ ( C[0] | C[4])
245          stg    @C[0],$A[2][3]($dst)    # R[2][3] = ~C[3] ^ ( C[0] | C[4])
246
247
248         lg      @C[2],$A[2][1]($src)
249         lg      @C[3],$A[3][2]($src)
250         lg      @C[1],$A[1][0]($src)
251         lg      @C[4],$A[4][3]($src)
252         lg      @C[0],$A[0][4]($src)
253
254         xgr     @C[2],@D[1]
255         xgr     @C[3],@D[2]
256          rllg   @C[2],@C[2],$rhotates[2][1]
257         xgr     @C[1],@D[0]
258          rllg   @C[3],@C[3],$rhotates[3][2]
259         xgr     @C[4],@D[3]
260          rllg   @C[1],@C[1],$rhotates[1][0]
261         xgr     @C[0],@D[4]
262          rllg   @C[4],@C[4],$rhotates[4][3]
263
264         lgr     @T[0],@C[2]
265         ogr     @C[2],@C[3]
266         lghi    @T[1],-1                # no 'not' instruction :-(
267         xgr     @C[2],@C[1]             #            C[1] ^ ( C[2] | C[3])
268         xgr     @C[3],@T[1]             # not   @C[3]
269         stg     @C[2],$A[3][1]($dst)    # R[3][1] =  C[1] ^ ( C[2] | C[3])
270
271         lgr     @T[1],@C[4]
272         ogr     @C[4],@C[3]
273          rllg   @C[0],@C[0],$rhotates[0][4]
274         xgr     @C[4],@T[0]             #            C[2] ^ ( C[4] | ~C[3])
275          ngr    @T[0],@C[1]
276         stg     @C[4],$A[3][2]($dst)    # R[3][2] =  C[2] ^ ( C[4] | ~C[3])
277          xgr    @T[0],@C[0]             #            C[0] ^ ( C[2] & C[1])
278
279         ogr     @C[1],@C[0]
280          stg    @T[0],$A[3][0]($dst)    # R[3][0] =  C[0] ^ ( C[2] & C[1])
281         xgr     @C[1],@T[1]             #            C[4] ^ ( C[1] | C[0])
282          ngr    @C[0],@T[1]
283         stg     @C[1],$A[3][4]($dst)    # R[3][4] =  C[4] ^ ( C[1] | C[0])
284          xgr    @C[0],@C[3]             #           ~C[3] ^ ( C[0] & C[4])
285          stg    @C[0],$A[3][3]($dst)    # R[3][3] = ~C[3] ^ ( C[0] & C[4])
286
287
288         xg      @D[2],$A[0][2]($src)
289         xg      @D[3],$A[1][3]($src)
290         xg      @D[1],$A[4][1]($src)
291         xg      @D[4],$A[2][4]($src)
292         xgr     $dst,$src               # xchg  $dst,$src
293          rllg   @D[2],@D[2],$rhotates[0][2]
294         xg      @D[0],$A[3][0]($src)
295          rllg   @D[3],@D[3],$rhotates[1][3]
296         xgr     $src,$dst
297          rllg   @D[1],@D[1],$rhotates[4][1]
298         xgr     $dst,$src
299          rllg   @D[4],@D[4],$rhotates[2][4]
300 ___
301         @C = (@D[2],@D[3],@D[4],@D[0],@D[1]);
302 $code.=<<___;
303         lgr     @T[0],@C[0]
304         ngr     @C[0],@C[1]
305         lghi    @T[1],-1                # no 'not' instruction :-(
306         xgr     @C[0],@C[4]             #            C[4] ^ ( C[0] & C[1])
307         xgr     @C[1],@T[1]             # not   @C[1]
308         stg     @C[0],$A[4][4]($src)    # R[4][4] =  C[4] ^ ( C[0] & C[1])
309
310         lgr     @T[1],@C[2]
311         ngr     @C[2],@C[1]
312          rllg   @D[0],@D[0],$rhotates[3][0]
313         xgr     @C[2],@T[0]             #            C[0] ^ ( C[2] & ~C[1])
314          ogr    @T[0],@C[4]
315         stg     @C[2],$A[4][0]($src)    # R[4][0] =  C[0] ^ ( C[2] & ~C[1])
316          xgr    @T[0],@C[3]             #            C[3] ^ ( C[0] | C[4])
317
318         ngr     @C[4],@C[3]
319          stg    @T[0],$A[4][3]($src)    # R[4][3] =  C[3] ^ ( C[0] | C[4])
320         xgr     @C[4],@T[1]             #            C[2] ^ ( C[4] & C[3])
321          ogr    @C[3],@T[1]
322         stg     @C[4],$A[4][2]($src)    # R[4][2] =  C[2] ^ ( C[4] & C[3])
323          xgr    @C[3],@C[1]             #           ~C[1] ^ ( C[2] | C[3])
324
325         lgr     @C[1],@C[0]             # harmonize with the loop top
326         lgr     @C[0],@T[0]
327          stg    @C[3],$A[4][1]($src)    # R[4][1] = ~C[1] ^ ( C[2] | C[3])
328
329         tmll    $iotas,255
330         jnz     .Loop
331
332         l${g}   %r14,$SIZE_T*14($sp)
333         br      %r14
334 .size   __KeccakF1600,.-__KeccakF1600
335 ___
336 }
337 {
338 $code.=<<___;
339 .globl  KeccakF1600
340 .type   KeccakF1600,\@function
341 .align  32
342 KeccakF1600:
343 .LKeccakF1600:
344         lghi    %r1,-$frame
345         stm${g} %r6,%r15,$SIZE_T*6($sp)
346         lgr     %r0,$sp
347         la      $sp,0(%r1,$sp)
348         st${g}  %r0,0($sp)
349
350         lghi    @D[0],-1                # no 'not' instruction :-(
351         lghi    @D[1],-1
352         lghi    @D[2],-1
353         lghi    @D[3],-1
354         lghi    @D[4],-1
355         lghi    @T[0],-1
356         xg      @D[0],$A[0][1]($src)
357         xg      @D[1],$A[0][2]($src)
358         xg      @D[2],$A[1][3]($src)
359         xg      @D[3],$A[2][2]($src)
360         xg      @D[4],$A[3][2]($src)
361         xg      @T[0],$A[4][0]($src)
362         stg     @D[0],$A[0][1]($src)
363         stg     @D[1],$A[0][2]($src)
364         stg     @D[2],$A[1][3]($src)
365         stg     @D[3],$A[2][2]($src)
366         stg     @D[4],$A[3][2]($src)
367         stg     @T[0],$A[4][0]($src)
368
369         la      $dst,$stdframe($sp)
370         larl    $iotas,iotas
371
372         bras    %r14,__KeccakF1600
373
374         lghi    @D[0],-1                # no 'not' instruction :-(
375         lghi    @D[1],-1
376         lghi    @D[2],-1
377         lghi    @D[3],-1
378         lghi    @D[4],-1
379         lghi    @T[0],-1
380         xg      @D[0],$A[0][1]($src)
381         xg      @D[1],$A[0][2]($src)
382         xg      @D[2],$A[1][3]($src)
383         xg      @D[3],$A[2][2]($src)
384         xg      @D[4],$A[3][2]($src)
385         xg      @T[0],$A[4][0]($src)
386         stg     @D[0],$A[0][1]($src)
387         stg     @D[1],$A[0][2]($src)
388         stg     @D[2],$A[1][3]($src)
389         stg     @D[3],$A[2][2]($src)
390         stg     @D[4],$A[3][2]($src)
391         stg     @T[0],$A[4][0]($src)
392
393         lm${g}  %r6,%r15,$frame+6*$SIZE_T($sp)
394         br      %r14
395 .size   KeccakF1600,.-KeccakF1600
396 ___
397 }
398 { my ($A_flat,$inp,$len,$bsz) = map("%r$_",(2..5));
399
400 $code.=<<___;
401 .globl  SHA3_absorb
402 .type   SHA3_absorb,\@function
403 .align  32
404 SHA3_absorb:
405         lghi    %r1,-$frame
406         stm${g} %r5,%r15,$SIZE_T*5($sp)
407         lgr     %r0,$sp
408         la      $sp,0(%r1,$sp)
409         st${g}  %r0,0($sp)
410
411         lghi    @D[0],-1                # no 'not' instruction :-(
412         lghi    @D[1],-1
413         lghi    @D[2],-1
414         lghi    @D[3],-1
415         lghi    @D[4],-1
416         lghi    @T[0],-1
417         xg      @D[0],$A[0][1]($src)
418         xg      @D[1],$A[0][2]($src)
419         xg      @D[2],$A[1][3]($src)
420         xg      @D[3],$A[2][2]($src)
421         xg      @D[4],$A[3][2]($src)
422         xg      @T[0],$A[4][0]($src)
423         stg     @D[0],$A[0][1]($src)
424         stg     @D[1],$A[0][2]($src)
425         stg     @D[2],$A[1][3]($src)
426         stg     @D[3],$A[2][2]($src)
427         stg     @D[4],$A[3][2]($src)
428         stg     @T[0],$A[4][0]($src)
429
430 .Loop_absorb:
431         cl${g}r $len,$bsz
432         jl      .Ldone_absorb
433
434         srl${g} $bsz,3
435         la      %r1,0($A_flat)
436
437 .Lblock_absorb:
438         lrvg    %r0,0($inp)
439         la      $inp,8($inp)
440         xg      %r0,0(%r1)
441         la      %r1,8(%r1)
442         a${g}hi $len,-8
443         stg     %r0,-8(%r1)
444         brct    $bsz,.Lblock_absorb
445
446         stm${g} $inp,$len,$frame+3*$SIZE_T($sp)
447         la      $dst,$stdframe($sp)
448         larl    $iotas,iotas
449         bras    %r14,__KeccakF1600
450         lm${g}  $inp,$bsz,$frame+3*$SIZE_T($sp)
451         j       .Loop_absorb
452
453 .align  16
454 .Ldone_absorb:
455         lghi    @D[0],-1                # no 'not' instruction :-(
456         lghi    @D[1],-1
457         lghi    @D[2],-1
458         lghi    @D[3],-1
459         lghi    @D[4],-1
460         lghi    @T[0],-1
461         xg      @D[0],$A[0][1]($src)
462         xg      @D[1],$A[0][2]($src)
463         xg      @D[2],$A[1][3]($src)
464         xg      @D[3],$A[2][2]($src)
465         xg      @D[4],$A[3][2]($src)
466         xg      @T[0],$A[4][0]($src)
467         stg     @D[0],$A[0][1]($src)
468         stg     @D[1],$A[0][2]($src)
469         stg     @D[2],$A[1][3]($src)
470         stg     @D[3],$A[2][2]($src)
471         stg     @D[4],$A[3][2]($src)
472         stg     @T[0],$A[4][0]($src)
473
474         lgr     %r2,$len                # return value
475
476         lm${g}  %r6,%r15,$frame+6*$SIZE_T($sp)
477         br      %r14
478 .size   SHA3_absorb,.-SHA3_absorb
479 ___
480 }
481 { my ($A_flat,$out,$len,$bsz) = map("%r$_",(2..5));
482
483 $code.=<<___;
484 .globl  SHA3_squeeze
485 .type   SHA3_squeeze,\@function
486 .align  32
487 SHA3_squeeze:
488         srl${g} $bsz,3
489         st${g}  %r14,2*$SIZE_T($sp)
490         lghi    %r14,8
491         st${g}  $bsz,5*$SIZE_T($sp)
492         la      %r1,0($A_flat)
493
494         j       .Loop_squeeze
495
496 .align  16
497 .Loop_squeeze:
498         cl${g}r $len,%r14
499         jl      .Ltail_squeeze
500
501         lrvg    %r0,0(%r1)
502         la      %r1,8(%r1)
503         stg     %r0,0($out)
504         la      $out,8($out)
505         a${g}hi $len,-8                 # len -= 8
506         jz      .Ldone_squeeze
507
508         brct    $bsz,.Loop_squeeze      # bsz--
509
510         stm${g} $out,$len,3*$SIZE_T($sp)
511         bras    %r14,.LKeccakF1600
512         lm${g}  $out,$bsz,3*$SIZE_T($sp)
513         lghi    %r14,8
514         la      %r1,0($A_flat)
515         j       .Loop_squeeze
516
517 .Ltail_squeeze:
518         lg      %r0,0(%r1)
519 .Loop_tail_squeeze:
520         stc     %r0,0($out)
521         la      $out,1($out)
522         srlg    %r0,8
523         brct    $len,.Loop_tail_squeeze
524
525 .Ldone_squeeze:
526         l${g}   %r14,2*$SIZE_T($sp)
527         br      %r14
528 .size   SHA3_squeeze,.-SHA3_squeeze
529 ___
530 }
531 $code.=<<___;
532 .align  256
533         .quad   0,0,0,0,0,0,0,0
534 .type   iotas,\@object
535 iotas:
536         .quad   0x0000000000000001
537         .quad   0x0000000000008082
538         .quad   0x800000000000808a
539         .quad   0x8000000080008000
540         .quad   0x000000000000808b
541         .quad   0x0000000080000001
542         .quad   0x8000000080008081
543         .quad   0x8000000000008009
544         .quad   0x000000000000008a
545         .quad   0x0000000000000088
546         .quad   0x0000000080008009
547         .quad   0x000000008000000a
548         .quad   0x000000008000808b
549         .quad   0x800000000000008b
550         .quad   0x8000000000008089
551         .quad   0x8000000000008003
552         .quad   0x8000000000008002
553         .quad   0x8000000000000080
554         .quad   0x000000000000800a
555         .quad   0x800000008000000a
556         .quad   0x8000000080008081
557         .quad   0x8000000000008080
558         .quad   0x0000000080000001
559         .quad   0x8000000080008008
560 .size   iotas,.-iotas
561 .asciz  "Keccak-1600 absorb and squeeze for s390x, CRYPTOGAMS by <appro\@openssl.org>"
562 ___
563
564 # unlike 32-bit shift 64-bit one takes three arguments
565 $code =~ s/(srlg\s+)(%r[0-9]+),/$1$2,$2,/gm;
566
567 print $code;
568 close STDOUT;