Update copyright year
[openssl.git] / crypto / aes / asm / aes-parisc.pl
1 #! /usr/bin/env perl
2 # Copyright 2009-2020 The OpenSSL Project Authors. All Rights Reserved.
3 #
4 # Licensed under the Apache License 2.0 (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 # ====================================================================
11 # Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
12 # project. The module is, however, dual licensed under OpenSSL and
13 # CRYPTOGAMS licenses depending on where you obtain it. For further
14 # details see http://www.openssl.org/~appro/cryptogams/.
15 # ====================================================================
16
17 # AES for PA-RISC.
18 #
19 # June 2009.
20 #
21 # The module is mechanical transliteration of aes-sparcv9.pl, but with
22 # a twist: S-boxes are compressed even further down to 1K+256B. On
23 # PA-7100LC performance is ~40% better than gcc 3.2 generated code and
24 # is about 33 cycles per byte processed with 128-bit key. Newer CPUs
25 # perform at 16 cycles per byte. It's not faster than code generated
26 # by vendor compiler, but recall that it has compressed S-boxes, which
27 # requires extra processing.
28 #
29 # Special thanks to polarhome.com for providing HP-UX account.
30
31 # $output is the last argument if it looks like a file (it has an extension)
32 # $flavour is the first argument if it doesn't look like a file
33 $output = $#ARGV >= 0 && $ARGV[$#ARGV] =~ m|\.\w+$| ? pop : undef;
34 $flavour = $#ARGV >= 0 && $ARGV[0] !~ m|\.| ? shift : undef;
35
36 $output and open STDOUT,">$output";
37
38 if ($flavour =~ /64/) {
39         $LEVEL          ="2.0W";
40         $SIZE_T         =8;
41         $FRAME_MARKER   =80;
42         $SAVED_RP       =16;
43         $PUSH           ="std";
44         $PUSHMA         ="std,ma";
45         $POP            ="ldd";
46         $POPMB          ="ldd,mb";
47 } else {
48         $LEVEL          ="1.0";
49         $SIZE_T         =4;
50         $FRAME_MARKER   =48;
51         $SAVED_RP       =20;
52         $PUSH           ="stw";
53         $PUSHMA         ="stwm";
54         $POP            ="ldw";
55         $POPMB          ="ldwm";
56 }
57
58 $FRAME=16*$SIZE_T+$FRAME_MARKER;# 16 saved regs + frame marker
59                                 #                 [+ argument transfer]
60 $inp="%r26";    # arg0
61 $out="%r25";    # arg1
62 $key="%r24";    # arg2
63
64 ($s0,$s1,$s2,$s3) = ("%r1","%r2","%r3","%r4");
65 ($t0,$t1,$t2,$t3) = ("%r5","%r6","%r7","%r8");
66
67 ($acc0, $acc1, $acc2, $acc3, $acc4, $acc5, $acc6, $acc7,
68  $acc8, $acc9,$acc10,$acc11,$acc12,$acc13,$acc14,$acc15) =
69 ("%r9","%r10","%r11","%r12","%r13","%r14","%r15","%r16",
70 "%r17","%r18","%r19","%r20","%r21","%r22","%r23","%r26");
71
72 $tbl="%r28";
73 $rounds="%r29";
74
75 $code=<<___;
76         .LEVEL  $LEVEL
77         .SPACE  \$TEXT\$
78         .SUBSPA \$CODE\$,QUAD=0,ALIGN=8,ACCESS=0x2C,CODE_ONLY
79
80         .EXPORT AES_encrypt,ENTRY,ARGW0=GR,ARGW1=GR,ARGW2=GR
81         .ALIGN  64
82 AES_encrypt
83         .PROC
84         .CALLINFO       FRAME=`$FRAME-16*$SIZE_T`,NO_CALLS,SAVE_RP,ENTRY_GR=18
85         .ENTRY
86         $PUSH   %r2,-$SAVED_RP(%sp)     ; standard prologue
87         $PUSHMA %r3,$FRAME(%sp)
88         $PUSH   %r4,`-$FRAME+1*$SIZE_T`(%sp)
89         $PUSH   %r5,`-$FRAME+2*$SIZE_T`(%sp)
90         $PUSH   %r6,`-$FRAME+3*$SIZE_T`(%sp)
91         $PUSH   %r7,`-$FRAME+4*$SIZE_T`(%sp)
92         $PUSH   %r8,`-$FRAME+5*$SIZE_T`(%sp)
93         $PUSH   %r9,`-$FRAME+6*$SIZE_T`(%sp)
94         $PUSH   %r10,`-$FRAME+7*$SIZE_T`(%sp)
95         $PUSH   %r11,`-$FRAME+8*$SIZE_T`(%sp)
96         $PUSH   %r12,`-$FRAME+9*$SIZE_T`(%sp)
97         $PUSH   %r13,`-$FRAME+10*$SIZE_T`(%sp)
98         $PUSH   %r14,`-$FRAME+11*$SIZE_T`(%sp)
99         $PUSH   %r15,`-$FRAME+12*$SIZE_T`(%sp)
100         $PUSH   %r16,`-$FRAME+13*$SIZE_T`(%sp)
101         $PUSH   %r17,`-$FRAME+14*$SIZE_T`(%sp)
102         $PUSH   %r18,`-$FRAME+15*$SIZE_T`(%sp)
103
104         blr     %r0,$tbl
105         ldi     3,$t0
106 L\$enc_pic
107         andcm   $tbl,$t0,$tbl
108         ldo     L\$AES_Te-L\$enc_pic($tbl),$tbl
109
110         and     $inp,$t0,$t0
111         sub     $inp,$t0,$inp
112         ldw     0($inp),$s0
113         ldw     4($inp),$s1
114         ldw     8($inp),$s2
115         comib,= 0,$t0,L\$enc_inp_aligned
116         ldw     12($inp),$s3
117
118         sh3addl $t0,%r0,$t0
119         subi    32,$t0,$t0
120         mtctl   $t0,%cr11
121         ldw     16($inp),$t1
122         vshd    $s0,$s1,$s0
123         vshd    $s1,$s2,$s1
124         vshd    $s2,$s3,$s2
125         vshd    $s3,$t1,$s3
126
127 L\$enc_inp_aligned
128         bl      _parisc_AES_encrypt,%r31
129         nop
130
131         extru,<> $out,31,2,%r0
132         b       L\$enc_out_aligned
133         nop
134
135         _srm    $s0,24,$acc0
136         _srm    $s0,16,$acc1
137         stb     $acc0,0($out)
138         _srm    $s0,8,$acc2
139         stb     $acc1,1($out)
140         _srm    $s1,24,$acc4
141         stb     $acc2,2($out)
142         _srm    $s1,16,$acc5
143         stb     $s0,3($out)
144         _srm    $s1,8,$acc6
145         stb     $acc4,4($out)
146         _srm    $s2,24,$acc0
147         stb     $acc5,5($out)
148         _srm    $s2,16,$acc1
149         stb     $acc6,6($out)
150         _srm    $s2,8,$acc2
151         stb     $s1,7($out)
152         _srm    $s3,24,$acc4
153         stb     $acc0,8($out)
154         _srm    $s3,16,$acc5
155         stb     $acc1,9($out)
156         _srm    $s3,8,$acc6
157         stb     $acc2,10($out)
158         stb     $s2,11($out)
159         stb     $acc4,12($out)
160         stb     $acc5,13($out)
161         stb     $acc6,14($out)
162         b       L\$enc_done
163         stb     $s3,15($out)
164
165 L\$enc_out_aligned
166         stw     $s0,0($out)
167         stw     $s1,4($out)
168         stw     $s2,8($out)
169         stw     $s3,12($out)
170
171 L\$enc_done
172         $POP    `-$FRAME-$SAVED_RP`(%sp),%r2    ; standard epilogue
173         $POP    `-$FRAME+1*$SIZE_T`(%sp),%r4
174         $POP    `-$FRAME+2*$SIZE_T`(%sp),%r5
175         $POP    `-$FRAME+3*$SIZE_T`(%sp),%r6
176         $POP    `-$FRAME+4*$SIZE_T`(%sp),%r7
177         $POP    `-$FRAME+5*$SIZE_T`(%sp),%r8
178         $POP    `-$FRAME+6*$SIZE_T`(%sp),%r9
179         $POP    `-$FRAME+7*$SIZE_T`(%sp),%r10
180         $POP    `-$FRAME+8*$SIZE_T`(%sp),%r11
181         $POP    `-$FRAME+9*$SIZE_T`(%sp),%r12
182         $POP    `-$FRAME+10*$SIZE_T`(%sp),%r13
183         $POP    `-$FRAME+11*$SIZE_T`(%sp),%r14
184         $POP    `-$FRAME+12*$SIZE_T`(%sp),%r15
185         $POP    `-$FRAME+13*$SIZE_T`(%sp),%r16
186         $POP    `-$FRAME+14*$SIZE_T`(%sp),%r17
187         $POP    `-$FRAME+15*$SIZE_T`(%sp),%r18
188         bv      (%r2)
189         .EXIT
190         $POPMB  -$FRAME(%sp),%r3
191         .PROCEND
192
193         .ALIGN  16
194 _parisc_AES_encrypt
195         .PROC
196         .CALLINFO       MILLICODE
197         .ENTRY
198         ldw     240($key),$rounds
199         ldw     0($key),$t0
200         ldw     4($key),$t1
201         ldw     8($key),$t2
202         _srm    $rounds,1,$rounds
203         xor     $t0,$s0,$s0
204         ldw     12($key),$t3
205         _srm    $s0,24,$acc0
206         xor     $t1,$s1,$s1
207         ldw     16($key),$t0
208         _srm    $s1,16,$acc1
209         xor     $t2,$s2,$s2
210         ldw     20($key),$t1
211         xor     $t3,$s3,$s3
212         ldw     24($key),$t2
213         ldw     28($key),$t3
214 L\$enc_loop
215         _srm    $s2,8,$acc2
216         ldwx,s  $acc0($tbl),$acc0
217         _srm    $s3,0,$acc3
218         ldwx,s  $acc1($tbl),$acc1
219         _srm    $s1,24,$acc4
220         ldwx,s  $acc2($tbl),$acc2
221         _srm    $s2,16,$acc5
222         ldwx,s  $acc3($tbl),$acc3
223         _srm    $s3,8,$acc6
224         ldwx,s  $acc4($tbl),$acc4
225         _srm    $s0,0,$acc7
226         ldwx,s  $acc5($tbl),$acc5
227         _srm    $s2,24,$acc8
228         ldwx,s  $acc6($tbl),$acc6
229         _srm    $s3,16,$acc9
230         ldwx,s  $acc7($tbl),$acc7
231         _srm    $s0,8,$acc10
232         ldwx,s  $acc8($tbl),$acc8
233         _srm    $s1,0,$acc11
234         ldwx,s  $acc9($tbl),$acc9
235         _srm    $s3,24,$acc12
236         ldwx,s  $acc10($tbl),$acc10
237         _srm    $s0,16,$acc13
238         ldwx,s  $acc11($tbl),$acc11
239         _srm    $s1,8,$acc14
240         ldwx,s  $acc12($tbl),$acc12
241         _srm    $s2,0,$acc15
242         ldwx,s  $acc13($tbl),$acc13
243         ldwx,s  $acc14($tbl),$acc14
244         ldwx,s  $acc15($tbl),$acc15
245         addib,= -1,$rounds,L\$enc_last
246         ldo     32($key),$key
247
248                 _ror    $acc1,8,$acc1
249                 xor     $acc0,$t0,$t0
250         ldw     0($key),$s0
251                 _ror    $acc2,16,$acc2
252                 xor     $acc1,$t0,$t0
253         ldw     4($key),$s1
254                 _ror    $acc3,24,$acc3
255                 xor     $acc2,$t0,$t0
256         ldw     8($key),$s2
257                 _ror    $acc5,8,$acc5
258                 xor     $acc3,$t0,$t0
259         ldw     12($key),$s3
260                 _ror    $acc6,16,$acc6
261                 xor     $acc4,$t1,$t1
262                 _ror    $acc7,24,$acc7
263                 xor     $acc5,$t1,$t1
264                 _ror    $acc9,8,$acc9
265                 xor     $acc6,$t1,$t1
266                 _ror    $acc10,16,$acc10
267                 xor     $acc7,$t1,$t1
268                 _ror    $acc11,24,$acc11
269                 xor     $acc8,$t2,$t2
270                 _ror    $acc13,8,$acc13
271                 xor     $acc9,$t2,$t2
272                 _ror    $acc14,16,$acc14
273                 xor     $acc10,$t2,$t2
274                 _ror    $acc15,24,$acc15
275                 xor     $acc11,$t2,$t2
276                 xor     $acc12,$acc14,$acc14
277                 xor     $acc13,$t3,$t3
278         _srm    $t0,24,$acc0
279                 xor     $acc14,$t3,$t3
280         _srm    $t1,16,$acc1
281                 xor     $acc15,$t3,$t3
282
283         _srm    $t2,8,$acc2
284         ldwx,s  $acc0($tbl),$acc0
285         _srm    $t3,0,$acc3
286         ldwx,s  $acc1($tbl),$acc1
287         _srm    $t1,24,$acc4
288         ldwx,s  $acc2($tbl),$acc2
289         _srm    $t2,16,$acc5
290         ldwx,s  $acc3($tbl),$acc3
291         _srm    $t3,8,$acc6
292         ldwx,s  $acc4($tbl),$acc4
293         _srm    $t0,0,$acc7
294         ldwx,s  $acc5($tbl),$acc5
295         _srm    $t2,24,$acc8
296         ldwx,s  $acc6($tbl),$acc6
297         _srm    $t3,16,$acc9
298         ldwx,s  $acc7($tbl),$acc7
299         _srm    $t0,8,$acc10
300         ldwx,s  $acc8($tbl),$acc8
301         _srm    $t1,0,$acc11
302         ldwx,s  $acc9($tbl),$acc9
303         _srm    $t3,24,$acc12
304         ldwx,s  $acc10($tbl),$acc10
305         _srm    $t0,16,$acc13
306         ldwx,s  $acc11($tbl),$acc11
307         _srm    $t1,8,$acc14
308         ldwx,s  $acc12($tbl),$acc12
309         _srm    $t2,0,$acc15
310         ldwx,s  $acc13($tbl),$acc13
311                 _ror    $acc1,8,$acc1
312         ldwx,s  $acc14($tbl),$acc14
313
314                 _ror    $acc2,16,$acc2
315                 xor     $acc0,$s0,$s0
316         ldwx,s  $acc15($tbl),$acc15
317                 _ror    $acc3,24,$acc3
318                 xor     $acc1,$s0,$s0
319         ldw     16($key),$t0
320                 _ror    $acc5,8,$acc5
321                 xor     $acc2,$s0,$s0
322         ldw     20($key),$t1
323                 _ror    $acc6,16,$acc6
324                 xor     $acc3,$s0,$s0
325         ldw     24($key),$t2
326                 _ror    $acc7,24,$acc7
327                 xor     $acc4,$s1,$s1
328         ldw     28($key),$t3
329                 _ror    $acc9,8,$acc9
330                 xor     $acc5,$s1,$s1
331         ldw     1024+0($tbl),%r0                ; prefetch te4
332                 _ror    $acc10,16,$acc10
333                 xor     $acc6,$s1,$s1
334         ldw     1024+32($tbl),%r0               ; prefetch te4
335                 _ror    $acc11,24,$acc11
336                 xor     $acc7,$s1,$s1
337         ldw     1024+64($tbl),%r0               ; prefetch te4
338                 _ror    $acc13,8,$acc13
339                 xor     $acc8,$s2,$s2
340         ldw     1024+96($tbl),%r0               ; prefetch te4
341                 _ror    $acc14,16,$acc14
342                 xor     $acc9,$s2,$s2
343         ldw     1024+128($tbl),%r0              ; prefetch te4
344                 _ror    $acc15,24,$acc15
345                 xor     $acc10,$s2,$s2
346         ldw     1024+160($tbl),%r0              ; prefetch te4
347         _srm    $s0,24,$acc0
348                 xor     $acc11,$s2,$s2
349         ldw     1024+192($tbl),%r0              ; prefetch te4
350                 xor     $acc12,$acc14,$acc14
351                 xor     $acc13,$s3,$s3
352         ldw     1024+224($tbl),%r0              ; prefetch te4
353         _srm    $s1,16,$acc1
354                 xor     $acc14,$s3,$s3
355         b       L\$enc_loop
356                 xor     $acc15,$s3,$s3
357
358         .ALIGN  16
359 L\$enc_last
360         ldo     1024($tbl),$rounds
361                 _ror    $acc1,8,$acc1
362                 xor     $acc0,$t0,$t0
363         ldw     0($key),$s0
364                 _ror    $acc2,16,$acc2
365                 xor     $acc1,$t0,$t0
366         ldw     4($key),$s1
367                 _ror    $acc3,24,$acc3
368                 xor     $acc2,$t0,$t0
369         ldw     8($key),$s2
370                 _ror    $acc5,8,$acc5
371                 xor     $acc3,$t0,$t0
372         ldw     12($key),$s3
373                 _ror    $acc6,16,$acc6
374                 xor     $acc4,$t1,$t1
375                 _ror    $acc7,24,$acc7
376                 xor     $acc5,$t1,$t1
377                 _ror    $acc9,8,$acc9
378                 xor     $acc6,$t1,$t1
379                 _ror    $acc10,16,$acc10
380                 xor     $acc7,$t1,$t1
381                 _ror    $acc11,24,$acc11
382                 xor     $acc8,$t2,$t2
383                 _ror    $acc13,8,$acc13
384                 xor     $acc9,$t2,$t2
385                 _ror    $acc14,16,$acc14
386                 xor     $acc10,$t2,$t2
387                 _ror    $acc15,24,$acc15
388                 xor     $acc11,$t2,$t2
389                 xor     $acc12,$acc14,$acc14
390                 xor     $acc13,$t3,$t3
391         _srm    $t0,24,$acc0
392                 xor     $acc14,$t3,$t3
393         _srm    $t1,16,$acc1
394                 xor     $acc15,$t3,$t3
395
396         _srm    $t2,8,$acc2
397         ldbx    $acc0($rounds),$acc0
398         _srm    $t1,24,$acc4
399         ldbx    $acc1($rounds),$acc1
400         _srm    $t2,16,$acc5
401         _srm    $t3,0,$acc3
402         ldbx    $acc2($rounds),$acc2
403         ldbx    $acc3($rounds),$acc3
404         _srm    $t3,8,$acc6
405         ldbx    $acc4($rounds),$acc4
406         _srm    $t2,24,$acc8
407         ldbx    $acc5($rounds),$acc5
408         _srm    $t3,16,$acc9
409         _srm    $t0,0,$acc7
410         ldbx    $acc6($rounds),$acc6
411         ldbx    $acc7($rounds),$acc7
412         _srm    $t0,8,$acc10
413         ldbx    $acc8($rounds),$acc8
414         _srm    $t3,24,$acc12
415         ldbx    $acc9($rounds),$acc9
416         _srm    $t0,16,$acc13
417         _srm    $t1,0,$acc11
418         ldbx    $acc10($rounds),$acc10
419         _srm    $t1,8,$acc14
420         ldbx    $acc11($rounds),$acc11
421         ldbx    $acc12($rounds),$acc12
422         ldbx    $acc13($rounds),$acc13
423         _srm    $t2,0,$acc15
424         ldbx    $acc14($rounds),$acc14
425
426                 dep     $acc0,7,8,$acc3
427         ldbx    $acc15($rounds),$acc15
428                 dep     $acc4,7,8,$acc7
429                 dep     $acc1,15,8,$acc3
430                 dep     $acc5,15,8,$acc7
431                 dep     $acc2,23,8,$acc3
432                 dep     $acc6,23,8,$acc7
433                 xor     $acc3,$s0,$s0
434                 xor     $acc7,$s1,$s1
435                 dep     $acc8,7,8,$acc11
436                 dep     $acc12,7,8,$acc15
437                 dep     $acc9,15,8,$acc11
438                 dep     $acc13,15,8,$acc15
439                 dep     $acc10,23,8,$acc11
440                 dep     $acc14,23,8,$acc15
441                 xor     $acc11,$s2,$s2
442
443         bv      (%r31)
444         .EXIT
445                 xor     $acc15,$s3,$s3
446         .PROCEND
447
448         .ALIGN  64
449 L\$AES_Te
450         .WORD   0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d
451         .WORD   0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554
452         .WORD   0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d
453         .WORD   0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a
454         .WORD   0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87
455         .WORD   0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b
456         .WORD   0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea
457         .WORD   0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b
458         .WORD   0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a
459         .WORD   0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f
460         .WORD   0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108
461         .WORD   0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f
462         .WORD   0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e
463         .WORD   0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5
464         .WORD   0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d
465         .WORD   0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f
466         .WORD   0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e
467         .WORD   0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb
468         .WORD   0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce
469         .WORD   0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497
470         .WORD   0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c
471         .WORD   0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed
472         .WORD   0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b
473         .WORD   0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a
474         .WORD   0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16
475         .WORD   0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594
476         .WORD   0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81
477         .WORD   0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3
478         .WORD   0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a
479         .WORD   0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504
480         .WORD   0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163
481         .WORD   0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d
482         .WORD   0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f
483         .WORD   0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739
484         .WORD   0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47
485         .WORD   0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395
486         .WORD   0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f
487         .WORD   0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883
488         .WORD   0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c
489         .WORD   0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76
490         .WORD   0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e
491         .WORD   0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4
492         .WORD   0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6
493         .WORD   0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b
494         .WORD   0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7
495         .WORD   0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0
496         .WORD   0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25
497         .WORD   0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818
498         .WORD   0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72
499         .WORD   0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651
500         .WORD   0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21
501         .WORD   0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85
502         .WORD   0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa
503         .WORD   0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12
504         .WORD   0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0
505         .WORD   0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9
506         .WORD   0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133
507         .WORD   0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7
508         .WORD   0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920
509         .WORD   0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a
510         .WORD   0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17
511         .WORD   0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8
512         .WORD   0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11
513         .WORD   0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a
514         .BYTE   0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5
515         .BYTE   0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76
516         .BYTE   0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0
517         .BYTE   0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0
518         .BYTE   0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc
519         .BYTE   0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15
520         .BYTE   0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a
521         .BYTE   0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75
522         .BYTE   0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0
523         .BYTE   0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84
524         .BYTE   0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b
525         .BYTE   0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf
526         .BYTE   0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85
527         .BYTE   0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8
528         .BYTE   0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5
529         .BYTE   0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2
530         .BYTE   0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17
531         .BYTE   0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73
532         .BYTE   0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88
533         .BYTE   0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb
534         .BYTE   0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c
535         .BYTE   0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79
536         .BYTE   0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9
537         .BYTE   0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08
538         .BYTE   0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6
539         .BYTE   0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a
540         .BYTE   0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e
541         .BYTE   0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e
542         .BYTE   0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94
543         .BYTE   0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf
544         .BYTE   0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68
545         .BYTE   0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
546 ___
547
548 $code.=<<___;
549         .EXPORT AES_decrypt,ENTRY,ARGW0=GR,ARGW1=GR,ARGW2=GR
550         .ALIGN  16
551 AES_decrypt
552         .PROC
553         .CALLINFO       FRAME=`$FRAME-16*$SIZE_T`,NO_CALLS,SAVE_RP,ENTRY_GR=18
554         .ENTRY
555         $PUSH   %r2,-$SAVED_RP(%sp)     ; standard prologue
556         $PUSHMA %r3,$FRAME(%sp)
557         $PUSH   %r4,`-$FRAME+1*$SIZE_T`(%sp)
558         $PUSH   %r5,`-$FRAME+2*$SIZE_T`(%sp)
559         $PUSH   %r6,`-$FRAME+3*$SIZE_T`(%sp)
560         $PUSH   %r7,`-$FRAME+4*$SIZE_T`(%sp)
561         $PUSH   %r8,`-$FRAME+5*$SIZE_T`(%sp)
562         $PUSH   %r9,`-$FRAME+6*$SIZE_T`(%sp)
563         $PUSH   %r10,`-$FRAME+7*$SIZE_T`(%sp)
564         $PUSH   %r11,`-$FRAME+8*$SIZE_T`(%sp)
565         $PUSH   %r12,`-$FRAME+9*$SIZE_T`(%sp)
566         $PUSH   %r13,`-$FRAME+10*$SIZE_T`(%sp)
567         $PUSH   %r14,`-$FRAME+11*$SIZE_T`(%sp)
568         $PUSH   %r15,`-$FRAME+12*$SIZE_T`(%sp)
569         $PUSH   %r16,`-$FRAME+13*$SIZE_T`(%sp)
570         $PUSH   %r17,`-$FRAME+14*$SIZE_T`(%sp)
571         $PUSH   %r18,`-$FRAME+15*$SIZE_T`(%sp)
572
573         blr     %r0,$tbl
574         ldi     3,$t0
575 L\$dec_pic
576         andcm   $tbl,$t0,$tbl
577         ldo     L\$AES_Td-L\$dec_pic($tbl),$tbl
578
579         and     $inp,$t0,$t0
580         sub     $inp,$t0,$inp
581         ldw     0($inp),$s0
582         ldw     4($inp),$s1
583         ldw     8($inp),$s2
584         comib,= 0,$t0,L\$dec_inp_aligned
585         ldw     12($inp),$s3
586
587         sh3addl $t0,%r0,$t0
588         subi    32,$t0,$t0
589         mtctl   $t0,%cr11
590         ldw     16($inp),$t1
591         vshd    $s0,$s1,$s0
592         vshd    $s1,$s2,$s1
593         vshd    $s2,$s3,$s2
594         vshd    $s3,$t1,$s3
595
596 L\$dec_inp_aligned
597         bl      _parisc_AES_decrypt,%r31
598         nop
599
600         extru,<> $out,31,2,%r0
601         b       L\$dec_out_aligned
602         nop
603
604         _srm    $s0,24,$acc0
605         _srm    $s0,16,$acc1
606         stb     $acc0,0($out)
607         _srm    $s0,8,$acc2
608         stb     $acc1,1($out)
609         _srm    $s1,24,$acc4
610         stb     $acc2,2($out)
611         _srm    $s1,16,$acc5
612         stb     $s0,3($out)
613         _srm    $s1,8,$acc6
614         stb     $acc4,4($out)
615         _srm    $s2,24,$acc0
616         stb     $acc5,5($out)
617         _srm    $s2,16,$acc1
618         stb     $acc6,6($out)
619         _srm    $s2,8,$acc2
620         stb     $s1,7($out)
621         _srm    $s3,24,$acc4
622         stb     $acc0,8($out)
623         _srm    $s3,16,$acc5
624         stb     $acc1,9($out)
625         _srm    $s3,8,$acc6
626         stb     $acc2,10($out)
627         stb     $s2,11($out)
628         stb     $acc4,12($out)
629         stb     $acc5,13($out)
630         stb     $acc6,14($out)
631         b       L\$dec_done
632         stb     $s3,15($out)
633
634 L\$dec_out_aligned
635         stw     $s0,0($out)
636         stw     $s1,4($out)
637         stw     $s2,8($out)
638         stw     $s3,12($out)
639
640 L\$dec_done
641         $POP    `-$FRAME-$SAVED_RP`(%sp),%r2    ; standard epilogue
642         $POP    `-$FRAME+1*$SIZE_T`(%sp),%r4
643         $POP    `-$FRAME+2*$SIZE_T`(%sp),%r5
644         $POP    `-$FRAME+3*$SIZE_T`(%sp),%r6
645         $POP    `-$FRAME+4*$SIZE_T`(%sp),%r7
646         $POP    `-$FRAME+5*$SIZE_T`(%sp),%r8
647         $POP    `-$FRAME+6*$SIZE_T`(%sp),%r9
648         $POP    `-$FRAME+7*$SIZE_T`(%sp),%r10
649         $POP    `-$FRAME+8*$SIZE_T`(%sp),%r11
650         $POP    `-$FRAME+9*$SIZE_T`(%sp),%r12
651         $POP    `-$FRAME+10*$SIZE_T`(%sp),%r13
652         $POP    `-$FRAME+11*$SIZE_T`(%sp),%r14
653         $POP    `-$FRAME+12*$SIZE_T`(%sp),%r15
654         $POP    `-$FRAME+13*$SIZE_T`(%sp),%r16
655         $POP    `-$FRAME+14*$SIZE_T`(%sp),%r17
656         $POP    `-$FRAME+15*$SIZE_T`(%sp),%r18
657         bv      (%r2)
658         .EXIT
659         $POPMB  -$FRAME(%sp),%r3
660         .PROCEND
661
662         .ALIGN  16
663 _parisc_AES_decrypt
664         .PROC
665         .CALLINFO       MILLICODE
666         .ENTRY
667         ldw     240($key),$rounds
668         ldw     0($key),$t0
669         ldw     4($key),$t1
670         ldw     8($key),$t2
671         ldw     12($key),$t3
672         _srm    $rounds,1,$rounds
673         xor     $t0,$s0,$s0
674         ldw     16($key),$t0
675         xor     $t1,$s1,$s1
676         ldw     20($key),$t1
677         _srm    $s0,24,$acc0
678         xor     $t2,$s2,$s2
679         ldw     24($key),$t2
680         xor     $t3,$s3,$s3
681         ldw     28($key),$t3
682         _srm    $s3,16,$acc1
683 L\$dec_loop
684         _srm    $s2,8,$acc2
685         ldwx,s  $acc0($tbl),$acc0
686         _srm    $s1,0,$acc3
687         ldwx,s  $acc1($tbl),$acc1
688         _srm    $s1,24,$acc4
689         ldwx,s  $acc2($tbl),$acc2
690         _srm    $s0,16,$acc5
691         ldwx,s  $acc3($tbl),$acc3
692         _srm    $s3,8,$acc6
693         ldwx,s  $acc4($tbl),$acc4
694         _srm    $s2,0,$acc7
695         ldwx,s  $acc5($tbl),$acc5
696         _srm    $s2,24,$acc8
697         ldwx,s  $acc6($tbl),$acc6
698         _srm    $s1,16,$acc9
699         ldwx,s  $acc7($tbl),$acc7
700         _srm    $s0,8,$acc10
701         ldwx,s  $acc8($tbl),$acc8
702         _srm    $s3,0,$acc11
703         ldwx,s  $acc9($tbl),$acc9
704         _srm    $s3,24,$acc12
705         ldwx,s  $acc10($tbl),$acc10
706         _srm    $s2,16,$acc13
707         ldwx,s  $acc11($tbl),$acc11
708         _srm    $s1,8,$acc14
709         ldwx,s  $acc12($tbl),$acc12
710         _srm    $s0,0,$acc15
711         ldwx,s  $acc13($tbl),$acc13
712         ldwx,s  $acc14($tbl),$acc14
713         ldwx,s  $acc15($tbl),$acc15
714         addib,= -1,$rounds,L\$dec_last
715         ldo     32($key),$key
716
717                 _ror    $acc1,8,$acc1
718                 xor     $acc0,$t0,$t0
719         ldw     0($key),$s0
720                 _ror    $acc2,16,$acc2
721                 xor     $acc1,$t0,$t0
722         ldw     4($key),$s1
723                 _ror    $acc3,24,$acc3
724                 xor     $acc2,$t0,$t0
725         ldw     8($key),$s2
726                 _ror    $acc5,8,$acc5
727                 xor     $acc3,$t0,$t0
728         ldw     12($key),$s3
729                 _ror    $acc6,16,$acc6
730                 xor     $acc4,$t1,$t1
731                 _ror    $acc7,24,$acc7
732                 xor     $acc5,$t1,$t1
733                 _ror    $acc9,8,$acc9
734                 xor     $acc6,$t1,$t1
735                 _ror    $acc10,16,$acc10
736                 xor     $acc7,$t1,$t1
737                 _ror    $acc11,24,$acc11
738                 xor     $acc8,$t2,$t2
739                 _ror    $acc13,8,$acc13
740                 xor     $acc9,$t2,$t2
741                 _ror    $acc14,16,$acc14
742                 xor     $acc10,$t2,$t2
743                 _ror    $acc15,24,$acc15
744                 xor     $acc11,$t2,$t2
745                 xor     $acc12,$acc14,$acc14
746                 xor     $acc13,$t3,$t3
747         _srm    $t0,24,$acc0
748                 xor     $acc14,$t3,$t3
749                 xor     $acc15,$t3,$t3
750         _srm    $t3,16,$acc1
751
752         _srm    $t2,8,$acc2
753         ldwx,s  $acc0($tbl),$acc0
754         _srm    $t1,0,$acc3
755         ldwx,s  $acc1($tbl),$acc1
756         _srm    $t1,24,$acc4
757         ldwx,s  $acc2($tbl),$acc2
758         _srm    $t0,16,$acc5
759         ldwx,s  $acc3($tbl),$acc3
760         _srm    $t3,8,$acc6
761         ldwx,s  $acc4($tbl),$acc4
762         _srm    $t2,0,$acc7
763         ldwx,s  $acc5($tbl),$acc5
764         _srm    $t2,24,$acc8
765         ldwx,s  $acc6($tbl),$acc6
766         _srm    $t1,16,$acc9
767         ldwx,s  $acc7($tbl),$acc7
768         _srm    $t0,8,$acc10
769         ldwx,s  $acc8($tbl),$acc8
770         _srm    $t3,0,$acc11
771         ldwx,s  $acc9($tbl),$acc9
772         _srm    $t3,24,$acc12
773         ldwx,s  $acc10($tbl),$acc10
774         _srm    $t2,16,$acc13
775         ldwx,s  $acc11($tbl),$acc11
776         _srm    $t1,8,$acc14
777         ldwx,s  $acc12($tbl),$acc12
778         _srm    $t0,0,$acc15
779         ldwx,s  $acc13($tbl),$acc13
780                 _ror    $acc1,8,$acc1
781         ldwx,s  $acc14($tbl),$acc14
782
783                 _ror    $acc2,16,$acc2
784                 xor     $acc0,$s0,$s0
785         ldwx,s  $acc15($tbl),$acc15
786                 _ror    $acc3,24,$acc3
787                 xor     $acc1,$s0,$s0
788         ldw     16($key),$t0
789                 _ror    $acc5,8,$acc5
790                 xor     $acc2,$s0,$s0
791         ldw     20($key),$t1
792                 _ror    $acc6,16,$acc6
793                 xor     $acc3,$s0,$s0
794         ldw     24($key),$t2
795                 _ror    $acc7,24,$acc7
796                 xor     $acc4,$s1,$s1
797         ldw     28($key),$t3
798                 _ror    $acc9,8,$acc9
799                 xor     $acc5,$s1,$s1
800         ldw     1024+0($tbl),%r0                ; prefetch td4
801                 _ror    $acc10,16,$acc10
802                 xor     $acc6,$s1,$s1
803         ldw     1024+32($tbl),%r0               ; prefetch td4
804                 _ror    $acc11,24,$acc11
805                 xor     $acc7,$s1,$s1
806         ldw     1024+64($tbl),%r0               ; prefetch td4
807                 _ror    $acc13,8,$acc13
808                 xor     $acc8,$s2,$s2
809         ldw     1024+96($tbl),%r0               ; prefetch td4
810                 _ror    $acc14,16,$acc14
811                 xor     $acc9,$s2,$s2
812         ldw     1024+128($tbl),%r0              ; prefetch td4
813                 _ror    $acc15,24,$acc15
814                 xor     $acc10,$s2,$s2
815         ldw     1024+160($tbl),%r0              ; prefetch td4
816         _srm    $s0,24,$acc0
817                 xor     $acc11,$s2,$s2
818         ldw     1024+192($tbl),%r0              ; prefetch td4
819                 xor     $acc12,$acc14,$acc14
820                 xor     $acc13,$s3,$s3
821         ldw     1024+224($tbl),%r0              ; prefetch td4
822                 xor     $acc14,$s3,$s3
823                 xor     $acc15,$s3,$s3
824         b       L\$dec_loop
825         _srm    $s3,16,$acc1
826
827         .ALIGN  16
828 L\$dec_last
829         ldo     1024($tbl),$rounds
830                 _ror    $acc1,8,$acc1
831                 xor     $acc0,$t0,$t0
832         ldw     0($key),$s0
833                 _ror    $acc2,16,$acc2
834                 xor     $acc1,$t0,$t0
835         ldw     4($key),$s1
836                 _ror    $acc3,24,$acc3
837                 xor     $acc2,$t0,$t0
838         ldw     8($key),$s2
839                 _ror    $acc5,8,$acc5
840                 xor     $acc3,$t0,$t0
841         ldw     12($key),$s3
842                 _ror    $acc6,16,$acc6
843                 xor     $acc4,$t1,$t1
844                 _ror    $acc7,24,$acc7
845                 xor     $acc5,$t1,$t1
846                 _ror    $acc9,8,$acc9
847                 xor     $acc6,$t1,$t1
848                 _ror    $acc10,16,$acc10
849                 xor     $acc7,$t1,$t1
850                 _ror    $acc11,24,$acc11
851                 xor     $acc8,$t2,$t2
852                 _ror    $acc13,8,$acc13
853                 xor     $acc9,$t2,$t2
854                 _ror    $acc14,16,$acc14
855                 xor     $acc10,$t2,$t2
856                 _ror    $acc15,24,$acc15
857                 xor     $acc11,$t2,$t2
858                 xor     $acc12,$acc14,$acc14
859                 xor     $acc13,$t3,$t3
860         _srm    $t0,24,$acc0
861                 xor     $acc14,$t3,$t3
862                 xor     $acc15,$t3,$t3
863         _srm    $t3,16,$acc1
864
865         _srm    $t2,8,$acc2
866         ldbx    $acc0($rounds),$acc0
867         _srm    $t1,24,$acc4
868         ldbx    $acc1($rounds),$acc1
869         _srm    $t0,16,$acc5
870         _srm    $t1,0,$acc3
871         ldbx    $acc2($rounds),$acc2
872         ldbx    $acc3($rounds),$acc3
873         _srm    $t3,8,$acc6
874         ldbx    $acc4($rounds),$acc4
875         _srm    $t2,24,$acc8
876         ldbx    $acc5($rounds),$acc5
877         _srm    $t1,16,$acc9
878         _srm    $t2,0,$acc7
879         ldbx    $acc6($rounds),$acc6
880         ldbx    $acc7($rounds),$acc7
881         _srm    $t0,8,$acc10
882         ldbx    $acc8($rounds),$acc8
883         _srm    $t3,24,$acc12
884         ldbx    $acc9($rounds),$acc9
885         _srm    $t2,16,$acc13
886         _srm    $t3,0,$acc11
887         ldbx    $acc10($rounds),$acc10
888         _srm    $t1,8,$acc14
889         ldbx    $acc11($rounds),$acc11
890         ldbx    $acc12($rounds),$acc12
891         ldbx    $acc13($rounds),$acc13
892         _srm    $t0,0,$acc15
893         ldbx    $acc14($rounds),$acc14
894
895                 dep     $acc0,7,8,$acc3
896         ldbx    $acc15($rounds),$acc15
897                 dep     $acc4,7,8,$acc7
898                 dep     $acc1,15,8,$acc3
899                 dep     $acc5,15,8,$acc7
900                 dep     $acc2,23,8,$acc3
901                 dep     $acc6,23,8,$acc7
902                 xor     $acc3,$s0,$s0
903                 xor     $acc7,$s1,$s1
904                 dep     $acc8,7,8,$acc11
905                 dep     $acc12,7,8,$acc15
906                 dep     $acc9,15,8,$acc11
907                 dep     $acc13,15,8,$acc15
908                 dep     $acc10,23,8,$acc11
909                 dep     $acc14,23,8,$acc15
910                 xor     $acc11,$s2,$s2
911
912         bv      (%r31)
913         .EXIT
914                 xor     $acc15,$s3,$s3
915         .PROCEND
916
917         .ALIGN  64
918 L\$AES_Td
919         .WORD   0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96
920         .WORD   0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393
921         .WORD   0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25
922         .WORD   0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f
923         .WORD   0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1
924         .WORD   0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6
925         .WORD   0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da
926         .WORD   0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844
927         .WORD   0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd
928         .WORD   0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4
929         .WORD   0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45
930         .WORD   0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94
931         .WORD   0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7
932         .WORD   0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a
933         .WORD   0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5
934         .WORD   0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c
935         .WORD   0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1
936         .WORD   0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a
937         .WORD   0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75
938         .WORD   0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051
939         .WORD   0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46
940         .WORD   0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff
941         .WORD   0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77
942         .WORD   0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb
943         .WORD   0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000
944         .WORD   0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e
945         .WORD   0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927
946         .WORD   0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a
947         .WORD   0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e
948         .WORD   0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16
949         .WORD   0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d
950         .WORD   0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8
951         .WORD   0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd
952         .WORD   0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34
953         .WORD   0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163
954         .WORD   0xd731dcca, 0x42638510, 0x13972240, 0x84c61120
955         .WORD   0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d
956         .WORD   0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0
957         .WORD   0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422
958         .WORD   0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef
959         .WORD   0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36
960         .WORD   0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4
961         .WORD   0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662
962         .WORD   0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5
963         .WORD   0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3
964         .WORD   0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b
965         .WORD   0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8
966         .WORD   0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6
967         .WORD   0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6
968         .WORD   0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0
969         .WORD   0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815
970         .WORD   0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f
971         .WORD   0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df
972         .WORD   0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f
973         .WORD   0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e
974         .WORD   0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713
975         .WORD   0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89
976         .WORD   0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c
977         .WORD   0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf
978         .WORD   0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86
979         .WORD   0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f
980         .WORD   0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541
981         .WORD   0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190
982         .WORD   0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742
983         .BYTE   0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38
984         .BYTE   0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb
985         .BYTE   0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87
986         .BYTE   0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb
987         .BYTE   0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d
988         .BYTE   0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e
989         .BYTE   0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2
990         .BYTE   0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25
991         .BYTE   0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16
992         .BYTE   0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92
993         .BYTE   0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda
994         .BYTE   0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84
995         .BYTE   0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a
996         .BYTE   0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06
997         .BYTE   0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02
998         .BYTE   0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b
999         .BYTE   0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea
1000         .BYTE   0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73
1001         .BYTE   0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85
1002         .BYTE   0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e
1003         .BYTE   0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89
1004         .BYTE   0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b
1005         .BYTE   0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20
1006         .BYTE   0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4
1007         .BYTE   0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31
1008         .BYTE   0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f
1009         .BYTE   0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d
1010         .BYTE   0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef
1011         .BYTE   0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0
1012         .BYTE   0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61
1013         .BYTE   0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26
1014         .BYTE   0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d
1015         .STRINGZ "AES for PA-RISC, CRYPTOGAMS by <appro\@openssl.org>"
1016 ___
1017
1018 if (`$ENV{CC} -Wa,-v -c -o /dev/null -x assembler /dev/null 2>&1`
1019         =~ /GNU assembler/) {
1020     $gnuas = 1;
1021 }
1022
1023 foreach (split("\n",$code)) {
1024         s/\`([^\`]*)\`/eval $1/ge;
1025
1026         # translate made up instructions: _ror, _srm
1027         s/_ror(\s+)(%r[0-9]+),/shd$1$2,$2,/                             or
1028
1029         s/_srm(\s+%r[0-9]+),([0-9]+),/
1030                 $SIZE_T==4 ? sprintf("extru%s,%d,8,",$1,31-$2)
1031                 :            sprintf("extrd,u%s,%d,8,",$1,63-$2)/e;
1032
1033         s/(\.LEVEL\s+2\.0)W/$1w/        if ($gnuas && $SIZE_T==8);
1034         s/\.SPACE\s+\$TEXT\$/.text/     if ($gnuas && $SIZE_T==8);
1035         s/\.SUBSPA.*//                  if ($gnuas && $SIZE_T==8);
1036         s/,\*/,/                        if ($SIZE_T==4);
1037         s/\bbv\b(.*\(%r2\))/bve$1/      if ($SIZE_T==8);
1038
1039         print $_,"\n";
1040 }
1041 close STDOUT or die "error closing STDOUT: $!";