2 # Copyright 2010-2020 The OpenSSL Project Authors. All Rights Reserved.
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
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 # ====================================================================
21 # Code uses 1K[+256B] S-box and on single-issue core [such as R5000]
22 # spends ~68 cycles per byte processed with 128-bit key. This is ~16%
23 # faster than gcc-generated code, which is not very impressive. But
24 # recall that compressed S-box requires extra processing, namely
25 # additional rotations. Rotations are implemented with lwl/lwr pairs,
26 # which is normally used for loading unaligned data. Another cool
27 # thing about this module is its endian neutrality, which means that
28 # it processes data without ever changing byte order...
32 # Add MIPS32R2 (~10% less instructions) and SmartMIPS ASE (further
33 # ~25% less instructions) code. Note that there is no run-time switch,
34 # instead, code path is chosen upon pre-process time, pass -mips32r2
39 # Normalize MIPS32R2 AES table address calculation by always using EXT
40 # instruction. This reduces the standard codebase by another 10%.
42 ######################################################################
43 # There is a number of MIPS ABI in use, O32 and N32/64 are most
44 # widely used. Then there is a new contender: NUBI. It appears that if
45 # one picks the latter, it's possible to arrange code in ABI neutral
46 # manner. Therefore let's stick to NUBI register layout:
48 ($zero,$at,$t0,$t1,$t2)=map("\$$_",(0..2,24,25));
49 ($a0,$a1,$a2,$a3,$a4,$a5,$a6,$a7)=map("\$$_",(4..11));
50 ($s0,$s1,$s2,$s3,$s4,$s5,$s6,$s7,$s8,$s9,$s10,$s11)=map("\$$_",(12..23));
51 ($gp,$tp,$sp,$fp,$ra)=map("\$$_",(3,28..31));
53 # The return value is placed in $a0. Following coding rules facilitate
56 # - never ever touch $tp, "thread pointer", former $gp;
57 # - copy return value to $t0, former $v0 [or to $a0 if you're adapting
59 # - on O32 populate $a4-$a7 with 'lw $aN,4*N($sp)' if necessary;
61 # For reference here is register layout for N32/64 MIPS ABIs:
63 # ($zero,$at,$v0,$v1)=map("\$$_",(0..3));
64 # ($a0,$a1,$a2,$a3,$a4,$a5,$a6,$a7)=map("\$$_",(4..11));
65 # ($t0,$t1,$t2,$t3,$t8,$t9)=map("\$$_",(12..15,24,25));
66 # ($s0,$s1,$s2,$s3,$s4,$s5,$s6,$s7)=map("\$$_",(16..23));
67 # ($gp,$sp,$fp,$ra)=map("\$$_",(28..31));
69 # $output is the last argument if it looks like a file (it has an extension)
70 # $flavour is the first argument if it doesn't look like a file
71 $output = $#ARGV >= 0 && $ARGV[$#ARGV] =~ m
|\
.\w
+$| ?
pop : undef;
72 $flavour = $#ARGV >= 0 && $ARGV[0] !~ m
|\
.| ?
shift : undef;
73 $flavour ||= "o32"; # supported flavours are o32,n32,64,nubi32,nubi64
75 if ($flavour =~ /64|n32/i) {
77 $PTR_ADD="daddu"; # incidentally works even on n32
78 $PTR_SUB="dsubu"; # incidentally works even on n32
82 $PTR_SLL="dsll"; # incidentally works even on n32
94 $pf = ($flavour =~ /nubi/i) ?
$t0 : $t2;
98 ######################################################################
100 $big_endian=(`echo MIPSEB | $ENV{CC} -E -`=~/MIPSEB/)?
0:1 if ($ENV{CC
});
102 if (!defined($big_endian))
103 { $big_endian=(unpack('L',pack('N',1))==1); }
105 my ($MSB,$LSB)=(0,3); # automatically converted to little-endian
107 $output and open STDOUT
,">$output";
110 #include "mips_arch.h"
113 #if !defined(__mips_eabi) && (!defined(__vxworks) || defined(__pic__))
120 my $FRAMESIZE=16*$SZREG;
121 my $SAVED_REGS_MASK = ($flavour =~ /nubi/i) ?
"0xc0fff008" : "0xc0ff0000";
123 my ($inp,$out,$key,$Tbl,$s0,$s1,$s2,$s3)=($a0,$a1,$a2,$a3,$a4,$a5,$a6,$a7);
124 my ($i0,$i1,$i2,$i3)=($at,$t0,$t1,$t2);
125 my ($t0,$t1,$t2,$t3,$t4,$t5,$t6,$t7,$t8,$t9,$t10,$t11) = map("\$$_",(12..23));
126 my ($key0,$cnt)=($gp,$fp);
128 # instruction ordering is "stolen" from output from MIPSpro assembler
129 # invoked with -mips3 -O3 arguments...
132 .ent _mips_AES_encrypt
141 $PTR_ADD $key0,$key,16
149 #if defined(__mips_smartmips)
155 lwxs
$t0,$i0($Tbl) # Te1[s1>>16]
157 lwxs
$t1,$i1($Tbl) # Te1[s2>>16]
159 lwxs
$t2,$i2($Tbl) # Te1[s3>>16]
161 lwxs
$t3,$i3($Tbl) # Te1[s0>>16]
164 lwxs
$t4,$i0($Tbl) # Te2[s2>>8]
166 lwxs
$t5,$i1($Tbl) # Te2[s3>>8]
168 lwxs
$t6,$i2($Tbl) # Te2[s0>>8]
170 lwxs
$t7,$i3($Tbl) # Te2[s1>>8]
173 lwxs
$t8,$i0($Tbl) # Te3[s3]
175 lwxs
$t9,$i1($Tbl) # Te3[s0]
177 lwxs
$t10,$i2($Tbl) # Te3[s1]
179 lwxs
$t11,$i3($Tbl) # Te3[s2]
193 lwxs
$t4,$i0($Tbl) # Te0[s0>>24]
195 lwxs
$t5,$i1($Tbl) # Te0[s1>>24]
197 lwxs
$t6,$i2($Tbl) # Te0[s2>>24]
199 lwxs
$t7,$i3($Tbl) # Te0[s3>>24]
232 #if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
246 lw
$t0,0($i0) # Te1[s1>>16]
248 lw
$t1,0($i1) # Te1[s2>>16]
250 lw
$t2,0($i2) # Te1[s3>>16]
252 lw
$t3,0($i3) # Te1[s0>>16]
272 lwl
$t0,3($i0) # Te1[s1>>16]
273 lwl
$t1,3($i1) # Te1[s2>>16]
274 lwl
$t2,3($i2) # Te1[s3>>16]
275 lwl
$t3,3($i3) # Te1[s0>>16]
276 lwr
$t0,2($i0) # Te1[s1>>16]
278 lwr
$t1,2($i1) # Te1[s2>>16]
280 lwr
$t2,2($i2) # Te1[s3>>16]
282 lwr
$t3,2($i3) # Te1[s0>>16]
293 #if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
298 # if defined(_MIPSEL)
299 lw
$t4,0($i0) # Te2[s2>>8]
301 lw
$t5,0($i1) # Te2[s3>>8]
303 lw
$t6,0($i2) # Te2[s0>>8]
305 lw
$t7,0($i3) # Te2[s1>>8]
309 $PTR_INS $i2,$t10,2,8
310 $PTR_INS $i3,$t11,2,8
312 lw
$t8,0($i0) # Te3[s3]
314 lw
$t9,0($i1) # Te3[s0]
316 lw
$t10,0($i2) # Te3[s1]
318 lw
$t11,0($i3) # Te3[s2]
321 lw
$t4,0($i0) # Te2[s2>>8]
323 lw
$t5,0($i1) # Te2[s3>>8]
325 lw
$t6,0($i2) # Te2[s0>>8]
327 lw
$t7,0($i3) # Te2[s1>>8]
330 lw
$t8,0($i0) # Te3[s3]
332 lw
$t9,0($i1) # Te3[s0]
334 lw
$t10,0($i2) # Te3[s1]
336 lw
$t11,0($i3) # Te3[s2]
358 lwl
$t4,2($i0) # Te2[s2>>8]
359 lwl
$t5,2($i1) # Te2[s3>>8]
360 lwl
$t6,2($i2) # Te2[s0>>8]
361 lwl
$t7,2($i3) # Te2[s1>>8]
362 lwr
$t4,1($i0) # Te2[s2>>8]
364 lwr
$t5,1($i1) # Te2[s3>>8]
366 lwr
$t6,1($i2) # Te2[s0>>8]
368 lwr
$t7,1($i3) # Te2[s1>>8]
379 lwl
$t8,1($i0) # Te3[s3]
380 lwl
$t9,1($i1) # Te3[s0]
381 lwl
$t10,1($i2) # Te3[s1]
382 lwl
$t11,1($i3) # Te3[s2]
383 lwr
$t8,0($i0) # Te3[s3]
385 lwr
$t9,0($i1) # Te3[s0]
387 lwr
$t10,0($i2) # Te3[s1]
389 lwr
$t11,0($i3) # Te3[s2]
402 lw
$t4,0($i0) # Te0[s0>>24]
404 lw
$t5,0($i1) # Te0[s1>>24]
406 lw
$t6,0($i2) # Te0[s2>>24]
408 lw
$t7,0($i3) # Te0[s3>>24]
432 #if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
450 lbu
$t0,2($i0) # Te4[s1>>16]
452 lbu
$t1,2($i1) # Te4[s2>>16]
454 lbu
$t2,2($i2) # Te4[s3>>16]
456 lbu
$t3,2($i3) # Te4[s0>>16]
467 #if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
468 # if defined(_MIPSEL)
469 lbu
$t4,2($i0) # Te4[s2>>8]
471 lbu
$t5,2($i1) # Te4[s3>>8]
473 lbu
$t6,2($i2) # Te4[s0>>8]
475 lbu
$t7,2($i3) # Te4[s1>>8]
478 lbu
$t8,2($i0) # Te4[s0>>24]
480 lbu
$t9,2($i1) # Te4[s1>>24]
482 lbu
$t10,2($i2) # Te4[s2>>24]
484 lbu
$t11,2($i3) # Te4[s3>>24]
496 lbu
$t4,2($i0) # Te4[s2>>8]
498 lbu
$t5,2($i1) # Te4[s3>>8]
500 lbu
$t6,2($i2) # Te4[s0>>8]
502 lbu
$t7,2($i3) # Te4[s1>>8]
513 lbu
$t8,2($i0) # Te4[s0>>24]
515 lbu
$t9,2($i1) # Te4[s1>>24]
517 lbu
$t10,2($i2) # Te4[s2>>24]
519 lbu
$t11,2($i3) # Te4[s3>>24]
528 lbu
$t4,2($i0) # Te4[s3]
530 lbu
$t5,2($i1) # Te4[s0]
532 lbu
$t6,2($i2) # Te4[s1]
534 lbu
$t7,2($i3) # Te4[s2]
550 lbu
$t4,2($i0) # Te4[s2>>8]
552 lbu
$t5,2($i1) # Te4[s3>>8]
554 lbu
$t6,2($i2) # Te4[s0>>8]
556 lbu
$t7,2($i3) # Te4[s1>>8]
567 lbu
$t8,2($i0) # Te4[s0>>24]
569 lbu
$t9,2($i1) # Te4[s1>>24]
571 lbu
$t10,2($i2) # Te4[s2>>24]
573 lbu
$t11,2($i3) # Te4[s3>>24]
596 lbu
$t4,2($i0) # Te4[s3]
598 lbu
$t5,2($i1) # Te4[s0]
600 lbu
$t6,2($i2) # Te4[s1]
602 lbu
$t7,2($i3) # Te4[s2]
634 .end _mips_AES_encrypt
640 .frame
$sp,$FRAMESIZE,$ra
641 .mask
$SAVED_REGS_MASK,-$SZREG
644 $code.=<<___
if ($flavour =~ /o32/i); # o32 PIC-ification
648 $PTR_SUB $sp,$FRAMESIZE
649 $REG_S $ra,$FRAMESIZE-1*$SZREG($sp)
650 $REG_S $fp,$FRAMESIZE-2*$SZREG($sp)
651 $REG_S $s11,$FRAMESIZE-3*$SZREG($sp)
652 $REG_S $s10,$FRAMESIZE-4*$SZREG($sp)
653 $REG_S $s9,$FRAMESIZE-5*$SZREG($sp)
654 $REG_S $s8,$FRAMESIZE-6*$SZREG($sp)
655 $REG_S $s7,$FRAMESIZE-7*$SZREG($sp)
656 $REG_S $s6,$FRAMESIZE-8*$SZREG($sp)
657 $REG_S $s5,$FRAMESIZE-9*$SZREG($sp)
658 $REG_S $s4,$FRAMESIZE-10*$SZREG($sp)
660 $code.=<<___
if ($flavour =~ /nubi/i); # optimize non-nubi prologue
661 $REG_S \
$15,$FRAMESIZE-11*$SZREG($sp)
662 $REG_S \
$14,$FRAMESIZE-12*$SZREG($sp)
663 $REG_S \
$13,$FRAMESIZE-13*$SZREG($sp)
664 $REG_S \
$12,$FRAMESIZE-14*$SZREG($sp)
665 $REG_S $gp,$FRAMESIZE-15*$SZREG($sp)
667 $code.=<<___
if ($flavour !~ /o32/i); # non-o32 PIC-ification
669 .cpsetup
$pf,$zero,AES_encrypt
673 $PTR_LA $Tbl,AES_Te
# PIC-ified 'load address'
675 #if defined(_MIPS_ARCH_MIPS32R6) || defined(_MIPS_ARCH_MIPS64R6)
684 lwl
$s3,12+$MSB($inp)
688 lwr
$s3,12+$LSB($inp)
691 bal _mips_AES_encrypt
693 #if defined(_MIPS_ARCH_MIPS32R6) || defined(_MIPS_ARCH_MIPS64R6)
702 swr
$s3,12+$LSB($out)
706 swl
$s3,12+$MSB($out)
710 $REG_L $ra,$FRAMESIZE-1*$SZREG($sp)
711 $REG_L $fp,$FRAMESIZE-2*$SZREG($sp)
712 $REG_L $s11,$FRAMESIZE-3*$SZREG($sp)
713 $REG_L $s10,$FRAMESIZE-4*$SZREG($sp)
714 $REG_L $s9,$FRAMESIZE-5*$SZREG($sp)
715 $REG_L $s8,$FRAMESIZE-6*$SZREG($sp)
716 $REG_L $s7,$FRAMESIZE-7*$SZREG($sp)
717 $REG_L $s6,$FRAMESIZE-8*$SZREG($sp)
718 $REG_L $s5,$FRAMESIZE-9*$SZREG($sp)
719 $REG_L $s4,$FRAMESIZE-10*$SZREG($sp)
721 $code.=<<___
if ($flavour =~ /nubi/i);
722 $REG_L \
$15,$FRAMESIZE-11*$SZREG($sp)
723 $REG_L \
$14,$FRAMESIZE-12*$SZREG($sp)
724 $REG_L \
$13,$FRAMESIZE-13*$SZREG($sp)
725 $REG_L \
$12,$FRAMESIZE-14*$SZREG($sp)
726 $REG_L $gp,$FRAMESIZE-15*$SZREG($sp)
730 $PTR_ADD $sp,$FRAMESIZE
736 .ent _mips_AES_decrypt
745 $PTR_ADD $key0,$key,16
753 #if defined(__mips_smartmips)
759 lwxs
$t0,$i0($Tbl) # Td1[s3>>16]
761 lwxs
$t1,$i1($Tbl) # Td1[s0>>16]
763 lwxs
$t2,$i2($Tbl) # Td1[s1>>16]
765 lwxs
$t3,$i3($Tbl) # Td1[s2>>16]
768 lwxs
$t4,$i0($Tbl) # Td2[s2>>8]
770 lwxs
$t5,$i1($Tbl) # Td2[s3>>8]
772 lwxs
$t6,$i2($Tbl) # Td2[s0>>8]
774 lwxs
$t7,$i3($Tbl) # Td2[s1>>8]
777 lwxs
$t8,$i0($Tbl) # Td3[s1]
779 lwxs
$t9,$i1($Tbl) # Td3[s2]
781 lwxs
$t10,$i2($Tbl) # Td3[s3]
783 lwxs
$t11,$i3($Tbl) # Td3[s0]
797 lwxs
$t4,$i0($Tbl) # Td0[s0>>24]
799 lwxs
$t5,$i1($Tbl) # Td0[s1>>24]
801 lwxs
$t6,$i2($Tbl) # Td0[s2>>24]
803 lwxs
$t7,$i3($Tbl) # Td0[s3>>24]
836 #if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
850 lw
$t0,0($i0) # Td1[s3>>16]
852 lw
$t1,0($i1) # Td1[s0>>16]
854 lw
$t2,0($i2) # Td1[s1>>16]
856 lw
$t3,0($i3) # Td1[s2>>16]
876 lwl
$t0,3($i0) # Td1[s3>>16]
877 lwl
$t1,3($i1) # Td1[s0>>16]
878 lwl
$t2,3($i2) # Td1[s1>>16]
879 lwl
$t3,3($i3) # Td1[s2>>16]
880 lwr
$t0,2($i0) # Td1[s3>>16]
882 lwr
$t1,2($i1) # Td1[s0>>16]
884 lwr
$t2,2($i2) # Td1[s1>>16]
886 lwr
$t3,2($i3) # Td1[s2>>16]
897 #if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
902 # if defined(_MIPSEL)
903 lw
$t4,0($i0) # Td2[s2>>8]
905 lw
$t5,0($i1) # Td2[s3>>8]
907 lw
$t6,0($i2) # Td2[s0>>8]
909 lw
$t7,0($i3) # Td2[s1>>8]
913 $PTR_INS $i2,$t10,2,8
914 $PTR_INS $i3,$t11,2,8
915 lw
$t8,0($i0) # Td3[s1]
917 lw
$t9,0($i1) # Td3[s2]
919 lw
$t10,0($i2) # Td3[s3]
921 lw
$t11,0($i3) # Td3[s0]
924 lw
$t4,0($i0) # Td2[s2>>8]
926 lw
$t5,0($i1) # Td2[s3>>8]
928 lw
$t6,0($i2) # Td2[s0>>8]
930 lw
$t7,0($i3) # Td2[s1>>8]
933 lw
$t8,0($i0) # Td3[s1]
935 lw
$t9,0($i1) # Td3[s2]
937 lw
$t10,0($i2) # Td3[s3]
939 lw
$t11,0($i3) # Td3[s0]
961 lwl
$t4,2($i0) # Td2[s2>>8]
962 lwl
$t5,2($i1) # Td2[s3>>8]
963 lwl
$t6,2($i2) # Td2[s0>>8]
964 lwl
$t7,2($i3) # Td2[s1>>8]
965 lwr
$t4,1($i0) # Td2[s2>>8]
967 lwr
$t5,1($i1) # Td2[s3>>8]
969 lwr
$t6,1($i2) # Td2[s0>>8]
971 lwr
$t7,1($i3) # Td2[s1>>8]
982 lwl
$t8,1($i0) # Td3[s1]
983 lwl
$t9,1($i1) # Td3[s2]
984 lwl
$t10,1($i2) # Td3[s3]
985 lwl
$t11,1($i3) # Td3[s0]
986 lwr
$t8,0($i0) # Td3[s1]
988 lwr
$t9,0($i1) # Td3[s2]
990 lwr
$t10,0($i2) # Td3[s3]
992 lwr
$t11,0($i3) # Td3[s0]
1006 lw
$t4,0($i0) # Td0[s0>>24]
1008 lw
$t5,0($i1) # Td0[s1>>24]
1010 lw
$t6,0($i2) # Td0[s2>>24]
1012 lw
$t7,0($i3) # Td0[s3>>24]
1036 #if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
1044 lw
$t4,1024($Tbl) # prefetch Td4
1046 lw
$t5,1024+32($Tbl)
1048 lw
$t6,1024+64($Tbl)
1050 lw
$t7,1024+96($Tbl)
1052 lw
$t8,1024+128($Tbl)
1054 lw
$t9,1024+160($Tbl)
1056 lw
$t10,1024+192($Tbl)
1058 lw
$t11,1024+224($Tbl)
1065 lbu
$t0,1024($i0) # Td4[s3>>16]
1067 lbu
$t1,1024($i1) # Td4[s0>>16]
1069 lbu
$t2,1024($i2) # Td4[s1>>16]
1071 lbu
$t3,1024($i3) # Td4[s2>>16]
1082 #if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
1083 # if defined(_MIPSEL)
1084 lbu
$t4,1024($i0) # Td4[s2>>8]
1085 $PTR_INS $i0,$s0,0,8
1086 lbu
$t5,1024($i1) # Td4[s3>>8]
1087 $PTR_INS $i1,$s1,0,8
1088 lbu
$t6,1024($i2) # Td4[s0>>8]
1089 $PTR_INS $i2,$s2,0,8
1090 lbu
$t7,1024($i3) # Td4[s1>>8]
1091 $PTR_INS $i3,$s3,0,8
1093 lbu
$t8,1024($i0) # Td4[s0>>24]
1095 lbu
$t9,1024($i1) # Td4[s1>>24]
1097 lbu
$t10,1024($i2) # Td4[s2>>24]
1099 lbu
$t11,1024($i3) # Td4[s3>>24]
1107 lbu
$t4,1024($i0) # Td4[s2>>8]
1109 lbu
$t5,1024($i1) # Td4[s3>>8]
1111 lbu
$t6,1024($i2) # Td4[s0>>8]
1113 lbu
$t7,1024($i3) # Td4[s1>>8]
1120 lbu
$t8,1024($i0) # Td4[s0>>24]
1121 $PTR_INS $i0,$s1,0,8
1122 lbu
$t9,1024($i1) # Td4[s1>>24]
1123 $PTR_INS $i1,$s2,0,8
1124 lbu
$t10,1024($i2) # Td4[s2>>24]
1125 $PTR_INS $i2,$s3,0,8
1126 lbu
$t11,1024($i3) # Td4[s3>>24]
1127 $PTR_INS $i3,$s0,0,8
1135 lbu
$t4,1024($i0) # Td4[s1]
1137 lbu
$t5,1024($i1) # Td4[s2]
1139 lbu
$t6,1024($i2) # Td4[s3]
1141 lbu
$t7,1024($i3) # Td4[s0]
1157 lbu
$t4,1024($i0) # Td4[s2>>8]
1159 lbu
$t5,1024($i1) # Td4[s3>>8]
1161 lbu
$t6,1024($i2) # Td4[s0>>8]
1163 lbu
$t7,1024($i3) # Td4[s1>>8]
1170 lbu
$t8,1024($i0) # Td4[s0>>24]
1172 lbu
$t9,1024($i1) # Td4[s1>>24]
1174 lbu
$t10,1024($i2) # Td4[s2>>24]
1176 lbu
$t11,1024($i3) # Td4[s3>>24]
1195 lbu
$t4,1024($i0) # Td4[s1]
1197 lbu
$t5,1024($i1) # Td4[s2]
1199 lbu
$t6,1024($i2) # Td4[s3]
1201 lbu
$t7,1024($i3) # Td4[s0]
1234 .end _mips_AES_decrypt
1240 .frame
$sp,$FRAMESIZE,$ra
1241 .mask
$SAVED_REGS_MASK,-$SZREG
1244 $code.=<<___
if ($flavour =~ /o32/i); # o32 PIC-ification
1248 $PTR_SUB $sp,$FRAMESIZE
1249 $REG_S $ra,$FRAMESIZE-1*$SZREG($sp)
1250 $REG_S $fp,$FRAMESIZE-2*$SZREG($sp)
1251 $REG_S $s11,$FRAMESIZE-3*$SZREG($sp)
1252 $REG_S $s10,$FRAMESIZE-4*$SZREG($sp)
1253 $REG_S $s9,$FRAMESIZE-5*$SZREG($sp)
1254 $REG_S $s8,$FRAMESIZE-6*$SZREG($sp)
1255 $REG_S $s7,$FRAMESIZE-7*$SZREG($sp)
1256 $REG_S $s6,$FRAMESIZE-8*$SZREG($sp)
1257 $REG_S $s5,$FRAMESIZE-9*$SZREG($sp)
1258 $REG_S $s4,$FRAMESIZE-10*$SZREG($sp)
1260 $code.=<<___
if ($flavour =~ /nubi/i); # optimize non-nubi prologue
1261 $REG_S \
$15,$FRAMESIZE-11*$SZREG($sp)
1262 $REG_S \
$14,$FRAMESIZE-12*$SZREG($sp)
1263 $REG_S \
$13,$FRAMESIZE-13*$SZREG($sp)
1264 $REG_S \
$12,$FRAMESIZE-14*$SZREG($sp)
1265 $REG_S $gp,$FRAMESIZE-15*$SZREG($sp)
1267 $code.=<<___
if ($flavour !~ /o32/i); # non-o32 PIC-ification
1269 .cpsetup
$pf,$zero,AES_decrypt
1273 $PTR_LA $Tbl,AES_Td
# PIC-ified 'load address'
1275 #if defined(_MIPS_ARCH_MIPS32R6) || defined(_MIPS_ARCH_MIPS64R6)
1281 lwl
$s0,0+$MSB($inp)
1282 lwl
$s1,4+$MSB($inp)
1283 lwl
$s2,8+$MSB($inp)
1284 lwl
$s3,12+$MSB($inp)
1285 lwr
$s0,0+$LSB($inp)
1286 lwr
$s1,4+$LSB($inp)
1287 lwr
$s2,8+$LSB($inp)
1288 lwr
$s3,12+$LSB($inp)
1291 bal _mips_AES_decrypt
1293 #if defined(_MIPS_ARCH_MIPS32R6) || defined(_MIPS_ARCH_MIPS64R6)
1299 swr
$s0,0+$LSB($out)
1300 swr
$s1,4+$LSB($out)
1301 swr
$s2,8+$LSB($out)
1302 swr
$s3,12+$LSB($out)
1303 swl
$s0,0+$MSB($out)
1304 swl
$s1,4+$MSB($out)
1305 swl
$s2,8+$MSB($out)
1306 swl
$s3,12+$MSB($out)
1310 $REG_L $ra,$FRAMESIZE-1*$SZREG($sp)
1311 $REG_L $fp,$FRAMESIZE-2*$SZREG($sp)
1312 $REG_L $s11,$FRAMESIZE-3*$SZREG($sp)
1313 $REG_L $s10,$FRAMESIZE-4*$SZREG($sp)
1314 $REG_L $s9,$FRAMESIZE-5*$SZREG($sp)
1315 $REG_L $s8,$FRAMESIZE-6*$SZREG($sp)
1316 $REG_L $s7,$FRAMESIZE-7*$SZREG($sp)
1317 $REG_L $s6,$FRAMESIZE-8*$SZREG($sp)
1318 $REG_L $s5,$FRAMESIZE-9*$SZREG($sp)
1319 $REG_L $s4,$FRAMESIZE-10*$SZREG($sp)
1321 $code.=<<___
if ($flavour =~ /nubi/i);
1322 $REG_L \
$15,$FRAMESIZE-11*$SZREG($sp)
1323 $REG_L \
$14,$FRAMESIZE-12*$SZREG($sp)
1324 $REG_L \
$13,$FRAMESIZE-13*$SZREG($sp)
1325 $REG_L \
$12,$FRAMESIZE-14*$SZREG($sp)
1326 $REG_L $gp,$FRAMESIZE-15*$SZREG($sp)
1330 $PTR_ADD $sp,$FRAMESIZE
1336 my $FRAMESIZE=8*$SZREG;
1337 my $SAVED_REGS_MASK = ($flavour =~ /nubi/i) ?
"0xc000f008" : "0xc0000000";
1339 my ($inp,$bits,$key,$Tbl)=($a0,$a1,$a2,$a3);
1340 my ($rk0,$rk1,$rk2,$rk3,$rk4,$rk5,$rk6,$rk7)=($a4,$a5,$a6,$a7,$s0,$s1,$s2,$s3);
1341 my ($i0,$i1,$i2,$i3)=($at,$t0,$t1,$t2);
1342 my ($rcon,$cnt)=($gp,$fp);
1346 .ent _mips_AES_set_encrypt_key
1347 _mips_AES_set_encrypt_key
:
1350 beqz
$inp,.Lekey_done
1352 beqz
$key,.Lekey_done
1353 $PTR_ADD $rcon,$Tbl,256
1356 #if defined(_MIPS_ARCH_MIPS32R6) || defined(_MIPS_ARCH_MIPS64R6)
1357 lw
$rk0,0($inp) # load 128 bits
1362 lwl
$rk0,0+$MSB($inp) # load 128 bits
1363 lwl
$rk1,4+$MSB($inp)
1364 lwl
$rk2,8+$MSB($inp)
1365 lwl
$rk3,12+$MSB($inp)
1366 lwr
$rk0,0+$LSB($inp)
1367 lwr
$rk1,4+$LSB($inp)
1368 lwr
$rk2,8+$LSB($inp)
1369 lwr
$rk3,12+$LSB($inp)
1373 beq
$bits,$at,.L128bits
1377 #if defined(_MIPS_ARCH_MIPS32R6) || defined(_MIPS_ARCH_MIPS64R6)
1378 lw
$rk4,16($inp) # load 192 bits
1381 lwl
$rk4,16+$MSB($inp) # load 192 bits
1382 lwl
$rk5,20+$MSB($inp)
1383 lwr
$rk4,16+$LSB($inp)
1384 lwr
$rk5,20+$LSB($inp)
1388 beq
$bits,$at,.L192bits
1392 #if defined(_MIPS_ARCH_MIPS32R6) || defined(_MIPS_ARCH_MIPS64R6)
1393 lw
$rk6,24($inp) # load 256 bits
1396 lwl
$rk6,24+$MSB($inp) # load 256 bits
1397 lwl
$rk7,28+$MSB($inp)
1398 lwr
$rk6,24+$LSB($inp)
1399 lwr
$rk7,28+$LSB($inp)
1403 beq
$bits,$at,.L256bits
1566 beqz
$cnt,.L256bits_done
1613 .end _mips_AES_set_encrypt_key
1615 .globl AES_set_encrypt_key
1616 .ent AES_set_encrypt_key
1617 AES_set_encrypt_key
:
1618 .frame
$sp,$FRAMESIZE,$ra
1619 .mask
$SAVED_REGS_MASK,-$SZREG
1622 $code.=<<___
if ($flavour =~ /o32/i); # o32 PIC-ification
1626 $PTR_SUB $sp,$FRAMESIZE
1627 $REG_S $ra,$FRAMESIZE-1*$SZREG($sp)
1628 $REG_S $fp,$FRAMESIZE-2*$SZREG($sp)
1630 $code.=<<___
if ($flavour =~ /nubi/i); # optimize non-nubi prologue
1631 $REG_S $s3,$FRAMESIZE-3*$SZREG($sp)
1632 $REG_S $s2,$FRAMESIZE-4*$SZREG($sp)
1633 $REG_S $s1,$FRAMESIZE-5*$SZREG($sp)
1634 $REG_S $s0,$FRAMESIZE-6*$SZREG($sp)
1635 $REG_S $gp,$FRAMESIZE-7*$SZREG($sp)
1637 $code.=<<___
if ($flavour !~ /o32/i); # non-o32 PIC-ification
1639 .cpsetup
$pf,$zero,AES_set_encrypt_key
1643 $PTR_LA $Tbl,AES_Te4
# PIC-ified 'load address'
1645 bal _mips_AES_set_encrypt_key
1649 $REG_L $ra,$FRAMESIZE-1*$SZREG($sp)
1650 $REG_L $fp,$FRAMESIZE-2*$SZREG($sp)
1652 $code.=<<___
if ($flavour =~ /nubi/i);
1653 $REG_L $s3,$FRAMESIZE-11*$SZREG($sp)
1654 $REG_L $s2,$FRAMESIZE-12*$SZREG($sp)
1655 $REG_L $s1,$FRAMESIZE-13*$SZREG($sp)
1656 $REG_L $s0,$FRAMESIZE-14*$SZREG($sp)
1657 $REG_L $gp,$FRAMESIZE-15*$SZREG($sp)
1661 $PTR_ADD $sp,$FRAMESIZE
1662 .end AES_set_encrypt_key
1665 my ($head,$tail)=($inp,$bits);
1666 my ($tp1,$tp2,$tp4,$tp8,$tp9,$tpb,$tpd,$tpe)=($a4,$a5,$a6,$a7,$s0,$s1,$s2,$s3);
1667 my ($m,$x80808080,$x7f7f7f7f,$x1b1b1b1b)=($at,$t0,$t1,$t2);
1670 .globl AES_set_decrypt_key
1671 .ent AES_set_decrypt_key
1672 AES_set_decrypt_key
:
1673 .frame
$sp,$FRAMESIZE,$ra
1674 .mask
$SAVED_REGS_MASK,-$SZREG
1677 $code.=<<___
if ($flavour =~ /o32/i); # o32 PIC-ification
1681 $PTR_SUB $sp,$FRAMESIZE
1682 $REG_S $ra,$FRAMESIZE-1*$SZREG($sp)
1683 $REG_S $fp,$FRAMESIZE-2*$SZREG($sp)
1685 $code.=<<___
if ($flavour =~ /nubi/i); # optimize non-nubi prologue
1686 $REG_S $s3,$FRAMESIZE-3*$SZREG($sp)
1687 $REG_S $s2,$FRAMESIZE-4*$SZREG($sp)
1688 $REG_S $s1,$FRAMESIZE-5*$SZREG($sp)
1689 $REG_S $s0,$FRAMESIZE-6*$SZREG($sp)
1690 $REG_S $gp,$FRAMESIZE-7*$SZREG($sp)
1692 $code.=<<___
if ($flavour !~ /o32/i); # non-o32 PIC-ification
1694 .cpsetup
$pf,$zero,AES_set_decrypt_key
1698 $PTR_LA $Tbl,AES_Te4
# PIC-ified 'load address'
1700 bal _mips_AES_set_encrypt_key
1702 bltz
$t0,.Ldkey_done
1705 $PTR_ADD $head,$key,0
1706 $PTR_ADD $tail,$key,$at
1727 bne
$head,$tail,.Lswap
1729 lw
$tp1,16($key) # modulo-scheduled
1730 lui
$x80808080,0x8080
1732 or $x80808080,0x8080
1735 lui
$x1b1b1b1b,0x1b1b
1736 nor
$x7f7f7f7f,$zero,$x80808080
1737 or $x1b1b1b1b,0x1b1b
1740 and $m,$tp1,$x80808080
1741 and $tp2,$tp1,$x7f7f7f7f
1743 addu
$tp2,$tp2 # tp2<<1
1748 and $m,$tp2,$x80808080
1749 and $tp4,$tp2,$x7f7f7f7f
1751 addu
$tp4,$tp4 # tp4<<1
1756 and $m,$tp4,$x80808080
1757 and $tp8,$tp4,$x7f7f7f7f
1759 addu
$tp8,$tp8 # tp8<<1
1769 #if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
1776 lw
$tp1,4($key) # modulo-scheduled
1791 lw
$tp1,4($key) # modulo-scheduled
1803 $REG_L $ra,$FRAMESIZE-1*$SZREG($sp)
1804 $REG_L $fp,$FRAMESIZE-2*$SZREG($sp)
1806 $code.=<<___
if ($flavour =~ /nubi/i);
1807 $REG_L $s3,$FRAMESIZE-11*$SZREG($sp)
1808 $REG_L $s2,$FRAMESIZE-12*$SZREG($sp)
1809 $REG_L $s1,$FRAMESIZE-13*$SZREG($sp)
1810 $REG_L $s0,$FRAMESIZE-14*$SZREG($sp)
1811 $REG_L $gp,$FRAMESIZE-15*$SZREG($sp)
1815 $PTR_ADD $sp,$FRAMESIZE
1816 .end AES_set_decrypt_key
1820 ######################################################################
1821 # Tables are kept in endian-neutral manner
1826 .byte
0xc6,0x63,0x63,0xa5, 0xf8,0x7c,0x7c,0x84 # Te0
1827 .byte
0xee,0x77,0x77,0x99, 0xf6,0x7b,0x7b,0x8d
1828 .byte
0xff,0xf2,0xf2,0x0d, 0xd6,0x6b,0x6b,0xbd
1829 .byte
0xde,0x6f,0x6f,0xb1, 0x91,0xc5,0xc5,0x54
1830 .byte
0x60,0x30,0x30,0x50, 0x02,0x01,0x01,0x03
1831 .byte
0xce,0x67,0x67,0xa9, 0x56,0x2b,0x2b,0x7d
1832 .byte
0xe7,0xfe,0xfe,0x19, 0xb5,0xd7,0xd7,0x62
1833 .byte
0x4d,0xab,0xab,0xe6, 0xec,0x76,0x76,0x9a
1834 .byte
0x8f,0xca,0xca,0x45, 0x1f,0x82,0x82,0x9d
1835 .byte
0x89,0xc9,0xc9,0x40, 0xfa,0x7d,0x7d,0x87
1836 .byte
0xef,0xfa,0xfa,0x15, 0xb2,0x59,0x59,0xeb
1837 .byte
0x8e,0x47,0x47,0xc9, 0xfb,0xf0,0xf0,0x0b
1838 .byte
0x41,0xad,0xad,0xec, 0xb3,0xd4,0xd4,0x67
1839 .byte
0x5f,0xa2,0xa2,0xfd, 0x45,0xaf,0xaf,0xea
1840 .byte
0x23,0x9c,0x9c,0xbf, 0x53,0xa4,0xa4,0xf7
1841 .byte
0xe4,0x72,0x72,0x96, 0x9b,0xc0,0xc0,0x5b
1842 .byte
0x75,0xb7,0xb7,0xc2, 0xe1,0xfd,0xfd,0x1c
1843 .byte
0x3d,0x93,0x93,0xae, 0x4c,0x26,0x26,0x6a
1844 .byte
0x6c,0x36,0x36,0x5a, 0x7e,0x3f,0x3f,0x41
1845 .byte
0xf5,0xf7,0xf7,0x02, 0x83,0xcc,0xcc,0x4f
1846 .byte
0x68,0x34,0x34,0x5c, 0x51,0xa5,0xa5,0xf4
1847 .byte
0xd1,0xe5,0xe5,0x34, 0xf9,0xf1,0xf1,0x08
1848 .byte
0xe2,0x71,0x71,0x93, 0xab,0xd8,0xd8,0x73
1849 .byte
0x62,0x31,0x31,0x53, 0x2a,0x15,0x15,0x3f
1850 .byte
0x08,0x04,0x04,0x0c, 0x95,0xc7,0xc7,0x52
1851 .byte
0x46,0x23,0x23,0x65, 0x9d,0xc3,0xc3,0x5e
1852 .byte
0x30,0x18,0x18,0x28, 0x37,0x96,0x96,0xa1
1853 .byte
0x0a,0x05,0x05,0x0f, 0x2f,0x9a,0x9a,0xb5
1854 .byte
0x0e,0x07,0x07,0x09, 0x24,0x12,0x12,0x36
1855 .byte
0x1b,0x80,0x80,0x9b, 0xdf,0xe2,0xe2,0x3d
1856 .byte
0xcd,0xeb,0xeb,0x26, 0x4e,0x27,0x27,0x69
1857 .byte
0x7f,0xb2,0xb2,0xcd, 0xea,0x75,0x75,0x9f
1858 .byte
0x12,0x09,0x09,0x1b, 0x1d,0x83,0x83,0x9e
1859 .byte
0x58,0x2c,0x2c,0x74, 0x34,0x1a,0x1a,0x2e
1860 .byte
0x36,0x1b,0x1b,0x2d, 0xdc,0x6e,0x6e,0xb2
1861 .byte
0xb4,0x5a,0x5a,0xee, 0x5b,0xa0,0xa0,0xfb
1862 .byte
0xa4,0x52,0x52,0xf6, 0x76,0x3b,0x3b,0x4d
1863 .byte
0xb7,0xd6,0xd6,0x61, 0x7d,0xb3,0xb3,0xce
1864 .byte
0x52,0x29,0x29,0x7b, 0xdd,0xe3,0xe3,0x3e
1865 .byte
0x5e,0x2f,0x2f,0x71, 0x13,0x84,0x84,0x97
1866 .byte
0xa6,0x53,0x53,0xf5, 0xb9,0xd1,0xd1,0x68
1867 .byte
0x00,0x00,0x00,0x00, 0xc1,0xed,0xed,0x2c
1868 .byte
0x40,0x20,0x20,0x60, 0xe3,0xfc,0xfc,0x1f
1869 .byte
0x79,0xb1,0xb1,0xc8, 0xb6,0x5b,0x5b,0xed
1870 .byte
0xd4,0x6a,0x6a,0xbe, 0x8d,0xcb,0xcb,0x46
1871 .byte
0x67,0xbe,0xbe,0xd9, 0x72,0x39,0x39,0x4b
1872 .byte
0x94,0x4a,0x4a,0xde, 0x98,0x4c,0x4c,0xd4
1873 .byte
0xb0,0x58,0x58,0xe8, 0x85,0xcf,0xcf,0x4a
1874 .byte
0xbb,0xd0,0xd0,0x6b, 0xc5,0xef,0xef,0x2a
1875 .byte
0x4f,0xaa,0xaa,0xe5, 0xed,0xfb,0xfb,0x16
1876 .byte
0x86,0x43,0x43,0xc5, 0x9a,0x4d,0x4d,0xd7
1877 .byte
0x66,0x33,0x33,0x55, 0x11,0x85,0x85,0x94
1878 .byte
0x8a,0x45,0x45,0xcf, 0xe9,0xf9,0xf9,0x10
1879 .byte
0x04,0x02,0x02,0x06, 0xfe,0x7f,0x7f,0x81
1880 .byte
0xa0,0x50,0x50,0xf0, 0x78,0x3c,0x3c,0x44
1881 .byte
0x25,0x9f,0x9f,0xba, 0x4b,0xa8,0xa8,0xe3
1882 .byte
0xa2,0x51,0x51,0xf3, 0x5d,0xa3,0xa3,0xfe
1883 .byte
0x80,0x40,0x40,0xc0, 0x05,0x8f,0x8f,0x8a
1884 .byte
0x3f,0x92,0x92,0xad, 0x21,0x9d,0x9d,0xbc
1885 .byte
0x70,0x38,0x38,0x48, 0xf1,0xf5,0xf5,0x04
1886 .byte
0x63,0xbc,0xbc,0xdf, 0x77,0xb6,0xb6,0xc1
1887 .byte
0xaf,0xda,0xda,0x75, 0x42,0x21,0x21,0x63
1888 .byte
0x20,0x10,0x10,0x30, 0xe5,0xff,0xff,0x1a
1889 .byte
0xfd,0xf3,0xf3,0x0e, 0xbf,0xd2,0xd2,0x6d
1890 .byte
0x81,0xcd,0xcd,0x4c, 0x18,0x0c,0x0c,0x14
1891 .byte
0x26,0x13,0x13,0x35, 0xc3,0xec,0xec,0x2f
1892 .byte
0xbe,0x5f,0x5f,0xe1, 0x35,0x97,0x97,0xa2
1893 .byte
0x88,0x44,0x44,0xcc, 0x2e,0x17,0x17,0x39
1894 .byte
0x93,0xc4,0xc4,0x57, 0x55,0xa7,0xa7,0xf2
1895 .byte
0xfc,0x7e,0x7e,0x82, 0x7a,0x3d,0x3d,0x47
1896 .byte
0xc8,0x64,0x64,0xac, 0xba,0x5d,0x5d,0xe7
1897 .byte
0x32,0x19,0x19,0x2b, 0xe6,0x73,0x73,0x95
1898 .byte
0xc0,0x60,0x60,0xa0, 0x19,0x81,0x81,0x98
1899 .byte
0x9e,0x4f,0x4f,0xd1, 0xa3,0xdc,0xdc,0x7f
1900 .byte
0x44,0x22,0x22,0x66, 0x54,0x2a,0x2a,0x7e
1901 .byte
0x3b,0x90,0x90,0xab, 0x0b,0x88,0x88,0x83
1902 .byte
0x8c,0x46,0x46,0xca, 0xc7,0xee,0xee,0x29
1903 .byte
0x6b,0xb8,0xb8,0xd3, 0x28,0x14,0x14,0x3c
1904 .byte
0xa7,0xde,0xde,0x79, 0xbc,0x5e,0x5e,0xe2
1905 .byte
0x16,0x0b,0x0b,0x1d, 0xad,0xdb,0xdb,0x76
1906 .byte
0xdb,0xe0,0xe0,0x3b, 0x64,0x32,0x32,0x56
1907 .byte
0x74,0x3a,0x3a,0x4e, 0x14,0x0a,0x0a,0x1e
1908 .byte
0x92,0x49,0x49,0xdb, 0x0c,0x06,0x06,0x0a
1909 .byte
0x48,0x24,0x24,0x6c, 0xb8,0x5c,0x5c,0xe4
1910 .byte
0x9f,0xc2,0xc2,0x5d, 0xbd,0xd3,0xd3,0x6e
1911 .byte
0x43,0xac,0xac,0xef, 0xc4,0x62,0x62,0xa6
1912 .byte
0x39,0x91,0x91,0xa8, 0x31,0x95,0x95,0xa4
1913 .byte
0xd3,0xe4,0xe4,0x37, 0xf2,0x79,0x79,0x8b
1914 .byte
0xd5,0xe7,0xe7,0x32, 0x8b,0xc8,0xc8,0x43
1915 .byte
0x6e,0x37,0x37,0x59, 0xda,0x6d,0x6d,0xb7
1916 .byte
0x01,0x8d,0x8d,0x8c, 0xb1,0xd5,0xd5,0x64
1917 .byte
0x9c,0x4e,0x4e,0xd2, 0x49,0xa9,0xa9,0xe0
1918 .byte
0xd8,0x6c,0x6c,0xb4, 0xac,0x56,0x56,0xfa
1919 .byte
0xf3,0xf4,0xf4,0x07, 0xcf,0xea,0xea,0x25
1920 .byte
0xca,0x65,0x65,0xaf, 0xf4,0x7a,0x7a,0x8e
1921 .byte
0x47,0xae,0xae,0xe9, 0x10,0x08,0x08,0x18
1922 .byte
0x6f,0xba,0xba,0xd5, 0xf0,0x78,0x78,0x88
1923 .byte
0x4a,0x25,0x25,0x6f, 0x5c,0x2e,0x2e,0x72
1924 .byte
0x38,0x1c,0x1c,0x24, 0x57,0xa6,0xa6,0xf1
1925 .byte
0x73,0xb4,0xb4,0xc7, 0x97,0xc6,0xc6,0x51
1926 .byte
0xcb,0xe8,0xe8,0x23, 0xa1,0xdd,0xdd,0x7c
1927 .byte
0xe8,0x74,0x74,0x9c, 0x3e,0x1f,0x1f,0x21
1928 .byte
0x96,0x4b,0x4b,0xdd, 0x61,0xbd,0xbd,0xdc
1929 .byte
0x0d,0x8b,0x8b,0x86, 0x0f,0x8a,0x8a,0x85
1930 .byte
0xe0,0x70,0x70,0x90, 0x7c,0x3e,0x3e,0x42
1931 .byte
0x71,0xb5,0xb5,0xc4, 0xcc,0x66,0x66,0xaa
1932 .byte
0x90,0x48,0x48,0xd8, 0x06,0x03,0x03,0x05
1933 .byte
0xf7,0xf6,0xf6,0x01, 0x1c,0x0e,0x0e,0x12
1934 .byte
0xc2,0x61,0x61,0xa3, 0x6a,0x35,0x35,0x5f
1935 .byte
0xae,0x57,0x57,0xf9, 0x69,0xb9,0xb9,0xd0
1936 .byte
0x17,0x86,0x86,0x91, 0x99,0xc1,0xc1,0x58
1937 .byte
0x3a,0x1d,0x1d,0x27, 0x27,0x9e,0x9e,0xb9
1938 .byte
0xd9,0xe1,0xe1,0x38, 0xeb,0xf8,0xf8,0x13
1939 .byte
0x2b,0x98,0x98,0xb3, 0x22,0x11,0x11,0x33
1940 .byte
0xd2,0x69,0x69,0xbb, 0xa9,0xd9,0xd9,0x70
1941 .byte
0x07,0x8e,0x8e,0x89, 0x33,0x94,0x94,0xa7
1942 .byte
0x2d,0x9b,0x9b,0xb6, 0x3c,0x1e,0x1e,0x22
1943 .byte
0x15,0x87,0x87,0x92, 0xc9,0xe9,0xe9,0x20
1944 .byte
0x87,0xce,0xce,0x49, 0xaa,0x55,0x55,0xff
1945 .byte
0x50,0x28,0x28,0x78, 0xa5,0xdf,0xdf,0x7a
1946 .byte
0x03,0x8c,0x8c,0x8f, 0x59,0xa1,0xa1,0xf8
1947 .byte
0x09,0x89,0x89,0x80, 0x1a,0x0d,0x0d,0x17
1948 .byte
0x65,0xbf,0xbf,0xda, 0xd7,0xe6,0xe6,0x31
1949 .byte
0x84,0x42,0x42,0xc6, 0xd0,0x68,0x68,0xb8
1950 .byte
0x82,0x41,0x41,0xc3, 0x29,0x99,0x99,0xb0
1951 .byte
0x5a,0x2d,0x2d,0x77, 0x1e,0x0f,0x0f,0x11
1952 .byte
0x7b,0xb0,0xb0,0xcb, 0xa8,0x54,0x54,0xfc
1953 .byte
0x6d,0xbb,0xbb,0xd6, 0x2c,0x16,0x16,0x3a
1956 .byte
0x51,0xf4,0xa7,0x50, 0x7e,0x41,0x65,0x53 # Td0
1957 .byte
0x1a,0x17,0xa4,0xc3, 0x3a,0x27,0x5e,0x96
1958 .byte
0x3b,0xab,0x6b,0xcb, 0x1f,0x9d,0x45,0xf1
1959 .byte
0xac,0xfa,0x58,0xab, 0x4b,0xe3,0x03,0x93
1960 .byte
0x20,0x30,0xfa,0x55, 0xad,0x76,0x6d,0xf6
1961 .byte
0x88,0xcc,0x76,0x91, 0xf5,0x02,0x4c,0x25
1962 .byte
0x4f,0xe5,0xd7,0xfc, 0xc5,0x2a,0xcb,0xd7
1963 .byte
0x26,0x35,0x44,0x80, 0xb5,0x62,0xa3,0x8f
1964 .byte
0xde,0xb1,0x5a,0x49, 0x25,0xba,0x1b,0x67
1965 .byte
0x45,0xea,0x0e,0x98, 0x5d,0xfe,0xc0,0xe1
1966 .byte
0xc3,0x2f,0x75,0x02, 0x81,0x4c,0xf0,0x12
1967 .byte
0x8d,0x46,0x97,0xa3, 0x6b,0xd3,0xf9,0xc6
1968 .byte
0x03,0x8f,0x5f,0xe7, 0x15,0x92,0x9c,0x95
1969 .byte
0xbf,0x6d,0x7a,0xeb, 0x95,0x52,0x59,0xda
1970 .byte
0xd4,0xbe,0x83,0x2d, 0x58,0x74,0x21,0xd3
1971 .byte
0x49,0xe0,0x69,0x29, 0x8e,0xc9,0xc8,0x44
1972 .byte
0x75,0xc2,0x89,0x6a, 0xf4,0x8e,0x79,0x78
1973 .byte
0x99,0x58,0x3e,0x6b, 0x27,0xb9,0x71,0xdd
1974 .byte
0xbe,0xe1,0x4f,0xb6, 0xf0,0x88,0xad,0x17
1975 .byte
0xc9,0x20,0xac,0x66, 0x7d,0xce,0x3a,0xb4
1976 .byte
0x63,0xdf,0x4a,0x18, 0xe5,0x1a,0x31,0x82
1977 .byte
0x97,0x51,0x33,0x60, 0x62,0x53,0x7f,0x45
1978 .byte
0xb1,0x64,0x77,0xe0, 0xbb,0x6b,0xae,0x84
1979 .byte
0xfe,0x81,0xa0,0x1c, 0xf9,0x08,0x2b,0x94
1980 .byte
0x70,0x48,0x68,0x58, 0x8f,0x45,0xfd,0x19
1981 .byte
0x94,0xde,0x6c,0x87, 0x52,0x7b,0xf8,0xb7
1982 .byte
0xab,0x73,0xd3,0x23, 0x72,0x4b,0x02,0xe2
1983 .byte
0xe3,0x1f,0x8f,0x57, 0x66,0x55,0xab,0x2a
1984 .byte
0xb2,0xeb,0x28,0x07, 0x2f,0xb5,0xc2,0x03
1985 .byte
0x86,0xc5,0x7b,0x9a, 0xd3,0x37,0x08,0xa5
1986 .byte
0x30,0x28,0x87,0xf2, 0x23,0xbf,0xa5,0xb2
1987 .byte
0x02,0x03,0x6a,0xba, 0xed,0x16,0x82,0x5c
1988 .byte
0x8a,0xcf,0x1c,0x2b, 0xa7,0x79,0xb4,0x92
1989 .byte
0xf3,0x07,0xf2,0xf0, 0x4e,0x69,0xe2,0xa1
1990 .byte
0x65,0xda,0xf4,0xcd, 0x06,0x05,0xbe,0xd5
1991 .byte
0xd1,0x34,0x62,0x1f, 0xc4,0xa6,0xfe,0x8a
1992 .byte
0x34,0x2e,0x53,0x9d, 0xa2,0xf3,0x55,0xa0
1993 .byte
0x05,0x8a,0xe1,0x32, 0xa4,0xf6,0xeb,0x75
1994 .byte
0x0b,0x83,0xec,0x39, 0x40,0x60,0xef,0xaa
1995 .byte
0x5e,0x71,0x9f,0x06, 0xbd,0x6e,0x10,0x51
1996 .byte
0x3e,0x21,0x8a,0xf9, 0x96,0xdd,0x06,0x3d
1997 .byte
0xdd,0x3e,0x05,0xae, 0x4d,0xe6,0xbd,0x46
1998 .byte
0x91,0x54,0x8d,0xb5, 0x71,0xc4,0x5d,0x05
1999 .byte
0x04,0x06,0xd4,0x6f, 0x60,0x50,0x15,0xff
2000 .byte
0x19,0x98,0xfb,0x24, 0xd6,0xbd,0xe9,0x97
2001 .byte
0x89,0x40,0x43,0xcc, 0x67,0xd9,0x9e,0x77
2002 .byte
0xb0,0xe8,0x42,0xbd, 0x07,0x89,0x8b,0x88
2003 .byte
0xe7,0x19,0x5b,0x38, 0x79,0xc8,0xee,0xdb
2004 .byte
0xa1,0x7c,0x0a,0x47, 0x7c,0x42,0x0f,0xe9
2005 .byte
0xf8,0x84,0x1e,0xc9, 0x00,0x00,0x00,0x00
2006 .byte
0x09,0x80,0x86,0x83, 0x32,0x2b,0xed,0x48
2007 .byte
0x1e,0x11,0x70,0xac, 0x6c,0x5a,0x72,0x4e
2008 .byte
0xfd,0x0e,0xff,0xfb, 0x0f,0x85,0x38,0x56
2009 .byte
0x3d,0xae,0xd5,0x1e, 0x36,0x2d,0x39,0x27
2010 .byte
0x0a,0x0f,0xd9,0x64, 0x68,0x5c,0xa6,0x21
2011 .byte
0x9b,0x5b,0x54,0xd1, 0x24,0x36,0x2e,0x3a
2012 .byte
0x0c,0x0a,0x67,0xb1, 0x93,0x57,0xe7,0x0f
2013 .byte
0xb4,0xee,0x96,0xd2, 0x1b,0x9b,0x91,0x9e
2014 .byte
0x80,0xc0,0xc5,0x4f, 0x61,0xdc,0x20,0xa2
2015 .byte
0x5a,0x77,0x4b,0x69, 0x1c,0x12,0x1a,0x16
2016 .byte
0xe2,0x93,0xba,0x0a, 0xc0,0xa0,0x2a,0xe5
2017 .byte
0x3c,0x22,0xe0,0x43, 0x12,0x1b,0x17,0x1d
2018 .byte
0x0e,0x09,0x0d,0x0b, 0xf2,0x8b,0xc7,0xad
2019 .byte
0x2d,0xb6,0xa8,0xb9, 0x14,0x1e,0xa9,0xc8
2020 .byte
0x57,0xf1,0x19,0x85, 0xaf,0x75,0x07,0x4c
2021 .byte
0xee,0x99,0xdd,0xbb, 0xa3,0x7f,0x60,0xfd
2022 .byte
0xf7,0x01,0x26,0x9f, 0x5c,0x72,0xf5,0xbc
2023 .byte
0x44,0x66,0x3b,0xc5, 0x5b,0xfb,0x7e,0x34
2024 .byte
0x8b,0x43,0x29,0x76, 0xcb,0x23,0xc6,0xdc
2025 .byte
0xb6,0xed,0xfc,0x68, 0xb8,0xe4,0xf1,0x63
2026 .byte
0xd7,0x31,0xdc,0xca, 0x42,0x63,0x85,0x10
2027 .byte
0x13,0x97,0x22,0x40, 0x84,0xc6,0x11,0x20
2028 .byte
0x85,0x4a,0x24,0x7d, 0xd2,0xbb,0x3d,0xf8
2029 .byte
0xae,0xf9,0x32,0x11, 0xc7,0x29,0xa1,0x6d
2030 .byte
0x1d,0x9e,0x2f,0x4b, 0xdc,0xb2,0x30,0xf3
2031 .byte
0x0d,0x86,0x52,0xec, 0x77,0xc1,0xe3,0xd0
2032 .byte
0x2b,0xb3,0x16,0x6c, 0xa9,0x70,0xb9,0x99
2033 .byte
0x11,0x94,0x48,0xfa, 0x47,0xe9,0x64,0x22
2034 .byte
0xa8,0xfc,0x8c,0xc4, 0xa0,0xf0,0x3f,0x1a
2035 .byte
0x56,0x7d,0x2c,0xd8, 0x22,0x33,0x90,0xef
2036 .byte
0x87,0x49,0x4e,0xc7, 0xd9,0x38,0xd1,0xc1
2037 .byte
0x8c,0xca,0xa2,0xfe, 0x98,0xd4,0x0b,0x36
2038 .byte
0xa6,0xf5,0x81,0xcf, 0xa5,0x7a,0xde,0x28
2039 .byte
0xda,0xb7,0x8e,0x26, 0x3f,0xad,0xbf,0xa4
2040 .byte
0x2c,0x3a,0x9d,0xe4, 0x50,0x78,0x92,0x0d
2041 .byte
0x6a,0x5f,0xcc,0x9b, 0x54,0x7e,0x46,0x62
2042 .byte
0xf6,0x8d,0x13,0xc2, 0x90,0xd8,0xb8,0xe8
2043 .byte
0x2e,0x39,0xf7,0x5e, 0x82,0xc3,0xaf,0xf5
2044 .byte
0x9f,0x5d,0x80,0xbe, 0x69,0xd0,0x93,0x7c
2045 .byte
0x6f,0xd5,0x2d,0xa9, 0xcf,0x25,0x12,0xb3
2046 .byte
0xc8,0xac,0x99,0x3b, 0x10,0x18,0x7d,0xa7
2047 .byte
0xe8,0x9c,0x63,0x6e, 0xdb,0x3b,0xbb,0x7b
2048 .byte
0xcd,0x26,0x78,0x09, 0x6e,0x59,0x18,0xf4
2049 .byte
0xec,0x9a,0xb7,0x01, 0x83,0x4f,0x9a,0xa8
2050 .byte
0xe6,0x95,0x6e,0x65, 0xaa,0xff,0xe6,0x7e
2051 .byte
0x21,0xbc,0xcf,0x08, 0xef,0x15,0xe8,0xe6
2052 .byte
0xba,0xe7,0x9b,0xd9, 0x4a,0x6f,0x36,0xce
2053 .byte
0xea,0x9f,0x09,0xd4, 0x29,0xb0,0x7c,0xd6
2054 .byte
0x31,0xa4,0xb2,0xaf, 0x2a,0x3f,0x23,0x31
2055 .byte
0xc6,0xa5,0x94,0x30, 0x35,0xa2,0x66,0xc0
2056 .byte
0x74,0x4e,0xbc,0x37, 0xfc,0x82,0xca,0xa6
2057 .byte
0xe0,0x90,0xd0,0xb0, 0x33,0xa7,0xd8,0x15
2058 .byte
0xf1,0x04,0x98,0x4a, 0x41,0xec,0xda,0xf7
2059 .byte
0x7f,0xcd,0x50,0x0e, 0x17,0x91,0xf6,0x2f
2060 .byte
0x76,0x4d,0xd6,0x8d, 0x43,0xef,0xb0,0x4d
2061 .byte
0xcc,0xaa,0x4d,0x54, 0xe4,0x96,0x04,0xdf
2062 .byte
0x9e,0xd1,0xb5,0xe3, 0x4c,0x6a,0x88,0x1b
2063 .byte
0xc1,0x2c,0x1f,0xb8, 0x46,0x65,0x51,0x7f
2064 .byte
0x9d,0x5e,0xea,0x04, 0x01,0x8c,0x35,0x5d
2065 .byte
0xfa,0x87,0x74,0x73, 0xfb,0x0b,0x41,0x2e
2066 .byte
0xb3,0x67,0x1d,0x5a, 0x92,0xdb,0xd2,0x52
2067 .byte
0xe9,0x10,0x56,0x33, 0x6d,0xd6,0x47,0x13
2068 .byte
0x9a,0xd7,0x61,0x8c, 0x37,0xa1,0x0c,0x7a
2069 .byte
0x59,0xf8,0x14,0x8e, 0xeb,0x13,0x3c,0x89
2070 .byte
0xce,0xa9,0x27,0xee, 0xb7,0x61,0xc9,0x35
2071 .byte
0xe1,0x1c,0xe5,0xed, 0x7a,0x47,0xb1,0x3c
2072 .byte
0x9c,0xd2,0xdf,0x59, 0x55,0xf2,0x73,0x3f
2073 .byte
0x18,0x14,0xce,0x79, 0x73,0xc7,0x37,0xbf
2074 .byte
0x53,0xf7,0xcd,0xea, 0x5f,0xfd,0xaa,0x5b
2075 .byte
0xdf,0x3d,0x6f,0x14, 0x78,0x44,0xdb,0x86
2076 .byte
0xca,0xaf,0xf3,0x81, 0xb9,0x68,0xc4,0x3e
2077 .byte
0x38,0x24,0x34,0x2c, 0xc2,0xa3,0x40,0x5f
2078 .byte
0x16,0x1d,0xc3,0x72, 0xbc,0xe2,0x25,0x0c
2079 .byte
0x28,0x3c,0x49,0x8b, 0xff,0x0d,0x95,0x41
2080 .byte
0x39,0xa8,0x01,0x71, 0x08,0x0c,0xb3,0xde
2081 .byte
0xd8,0xb4,0xe4,0x9c, 0x64,0x56,0xc1,0x90
2082 .byte
0x7b,0xcb,0x84,0x61, 0xd5,0x32,0xb6,0x70
2083 .byte
0x48,0x6c,0x5c,0x74, 0xd0,0xb8,0x57,0x42
2085 .byte
0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38 # Td4
2086 .byte
0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb
2087 .byte
0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87
2088 .byte
0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb
2089 .byte
0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d
2090 .byte
0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e
2091 .byte
0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2
2092 .byte
0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25
2093 .byte
0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16
2094 .byte
0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92
2095 .byte
0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda
2096 .byte
0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84
2097 .byte
0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a
2098 .byte
0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06
2099 .byte
0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02
2100 .byte
0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b
2101 .byte
0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea
2102 .byte
0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73
2103 .byte
0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85
2104 .byte
0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e
2105 .byte
0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89
2106 .byte
0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b
2107 .byte
0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20
2108 .byte
0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4
2109 .byte
0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31
2110 .byte
0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f
2111 .byte
0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d
2112 .byte
0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef
2113 .byte
0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0
2114 .byte
0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61
2115 .byte
0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26
2116 .byte
0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d
2119 .byte
0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5 # Te4
2120 .byte
0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76
2121 .byte
0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0
2122 .byte
0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0
2123 .byte
0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc
2124 .byte
0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15
2125 .byte
0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a
2126 .byte
0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75
2127 .byte
0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0
2128 .byte
0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84
2129 .byte
0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b
2130 .byte
0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf
2131 .byte
0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85
2132 .byte
0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8
2133 .byte
0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5
2134 .byte
0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2
2135 .byte
0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17
2136 .byte
0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73
2137 .byte
0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88
2138 .byte
0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb
2139 .byte
0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c
2140 .byte
0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79
2141 .byte
0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9
2142 .byte
0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08
2143 .byte
0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6
2144 .byte
0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a
2145 .byte
0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e
2146 .byte
0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e
2147 .byte
0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94
2148 .byte
0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf
2149 .byte
0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68
2150 .byte
0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
2152 .byte
0x01,0x00,0x00,0x00, 0x02,0x00,0x00,0x00 # rcon
2153 .byte
0x04,0x00,0x00,0x00, 0x08,0x00,0x00,0x00
2154 .byte
0x10,0x00,0x00,0x00, 0x20,0x00,0x00,0x00
2155 .byte
0x40,0x00,0x00,0x00, 0x80,0x00,0x00,0x00
2156 .byte
0x1B,0x00,0x00,0x00, 0x36,0x00,0x00,0x00
2159 foreach (split("\n",$code)) {
2160 s/\`([^\`]*)\`/eval $1/ge;
2162 # made-up _instructions, _xtr, _ins, _ror and _bias, cope
2163 # with byte order dependencies...
2165 s/(_[a-z]+\s+)(\$[0-9]+),([^,]+)(#.*)*$/$1$2,$2,$3/;
2167 s
/_xtr\s+(\$[0-9]+),(\$[0-9]+),([0-9]+(\-2)*)/
2168 sprintf("srl\t$1,$2,%d",$big_endian ?
eval($3)
2169 : eval("24-$3"))/e
or
2170 s
/_ins\s+(\$[0-9]+),(\$[0-9]+),([0-9]+)/
2171 sprintf("sll\t$1,$2,%d",$big_endian ?
eval($3)
2172 : eval("24-$3"))/e
or
2173 s
/_ins2\s+(\$[0-9]+),(\$[0-9]+),([0-9]+)/
2174 sprintf("ins\t$1,$2,%d,8",$big_endian ?
eval($3)
2175 : eval("24-$3"))/e
or
2176 s
/_ror\s+(\$[0-9]+),(\$[0-9]+),(\-?[0-9]+)/
2177 sprintf("srl\t$1,$2,%d",$big_endian ?
eval($3)
2178 : eval("$3*-1"))/e
or
2179 s
/_bias\s+(\$[0-9]+),(\$[0-9]+),([0-9]+)/
2180 sprintf("sll\t$1,$2,%d",$big_endian ?
eval($3)
2181 : eval("($3-16)&31"))/e
;
2183 s
/srl\s+(\$[0-9]+),(\$[0-9]+),\-([0-9]+)/
2184 sprintf("sll\t$1,$2,$3")/e
or
2185 s
/srl\s+(\$[0-9]+),(\$[0-9]+),0/
2186 sprintf("and\t$1,$2,0xff")/e
or
2187 s/(sll\s+\$[0-9]+,\$[0-9]+,0)/#$1/;
2190 # convert lwl/lwr and swr/swl to little-endian order
2191 if (!$big_endian && /^\s+[sl]w[lr]\s+/) {
2192 s
/([sl]wl.*)([0-9]+)\((\$[0-9]+)\)/
2193 sprintf("$1%d($3)",eval("$2-$2%4+($2%4-1)&3"))/e
or
2194 s
/([sl]wr.*)([0-9]+)\((\$[0-9]+)\)/
2195 sprintf("$1%d($3)",eval("$2-$2%4+($2%4+1)&3"))/e
;
2199 s/(rotr\s+\$[0-9]+,\$[0-9]+),([0-9]+)/sprintf("$1,%d",32-$2)/e;
2200 s/(ext\s+\$[0-9]+,\$[0-9]+),([0-9]+),8/sprintf("$1,%d,8",24-$2)/e;
2206 close STDOUT
or die "error closing STDOUT: $!";