3 # ====================================================================
4 # Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
5 # project. The module is, however, dual licensed under OpenSSL and
6 # CRYPTOGAMS licenses depending on where you obtain it. For further
7 # details see http://www.openssl.org/~appro/cryptogams/.
8 # ====================================================================
14 # Code uses 1K[+256B] S-box and on single-issue core [such as R5000]
15 # spends ~68 cycles per byte processed with 128-bit key. This is ~16%
16 # faster than gcc-generated code, which is not very impressive. But
17 # recall that compressed S-box requires extra processing, namely
18 # additional rotations. Rotations are implemented with lwl/lwr pairs,
19 # which is normally used for loading unaligned data. Another cool
20 # thing about this module is its endian neutrality, which means that
21 # it processes data without ever changing byte order...
25 # Add MIPS32R2 (~10% less instructions) and SmartMIPS ASE (further
26 # ~25% less instructions) code. Note that there is no run-time switch,
27 # instead, code path is chosen upon pre-process time, pass -mips32r2
30 ######################################################################
31 # There is a number of MIPS ABI in use, O32 and N32/64 are most
32 # widely used. Then there is a new contender: NUBI. It appears that if
33 # one picks the latter, it's possible to arrange code in ABI neutral
34 # manner. Therefore let's stick to NUBI register layout:
36 ($zero,$at,$t0,$t1,$t2)=map("\$$_",(0..2,24,25));
37 ($a0,$a1,$a2,$a3,$a4,$a5,$a6,$a7)=map("\$$_",(4..11));
38 ($s0,$s1,$s2,$s3,$s4,$s5,$s6,$s7,$s8,$s9,$s10,$s11)=map("\$$_",(12..23));
39 ($gp,$tp,$sp,$fp,$ra)=map("\$$_",(3,28..31));
41 # The return value is placed in $a0. Following coding rules facilitate
44 # - never ever touch $tp, "thread pointer", former $gp;
45 # - copy return value to $t0, former $v0 [or to $a0 if you're adapting
47 # - on O32 populate $a4-$a7 with 'lw $aN,4*N($sp)' if necessary;
49 # For reference here is register layout for N32/64 MIPS ABIs:
51 # ($zero,$at,$v0,$v1)=map("\$$_",(0..3));
52 # ($a0,$a1,$a2,$a3,$a4,$a5,$a6,$a7)=map("\$$_",(4..11));
53 # ($t0,$t1,$t2,$t3,$t8,$t9)=map("\$$_",(12..15,24,25));
54 # ($s0,$s1,$s2,$s3,$s4,$s5,$s6,$s7)=map("\$$_",(16..23));
55 # ($gp,$sp,$fp,$ra)=map("\$$_",(28..31));
57 $flavour = shift || "o32"; # supported flavours are o32,n32,64,nubi32,nubi64
59 if ($flavour =~ /64|n32/i) {
60 $PTR_ADD="dadd"; # incidentally works even on n32
61 $PTR_SUB="dsub"; # incidentally works even on n32
65 $PTR_SLL="dsll"; # incidentally works even on n32
76 $pf = ($flavour =~ /nubi/i) ? $t0 : $t2;
80 ######################################################################
82 $big_endian=(`echo MIPSEL | $ENV{CC} -E -P -`=~/MIPSEL/)?1:0;
84 for (@ARGV) { $output=$_ if (/^\w[\w\-]*\.\w+$/); }
85 open STDOUT,">$output";
87 if (!defined($big_endian))
88 { $big_endian=(unpack('L',pack('N',1))==1); }
90 while (($output=shift) && ($output!~/^\w[\w\-]*\.\w+$/)) {}
91 open STDOUT,">$output";
93 my ($MSB,$LSB)=(0,3); # automatically converted to little-endian
97 #ifdef OPENSSL_FIPSCANISTER
98 # include <openssl/fipssyms.h>
101 #if defined(__mips_smartmips) && !defined(_MIPS_ARCH_MIPS32R2)
102 #define _MIPS_ARCH_MIPS32R2
105 #if !defined(__mips_eabi) && (!defined(__vxworks) || defined(__pic__))
112 my $FRAMESIZE=16*$SZREG;
113 my $SAVED_REGS_MASK = ($flavour =~ /nubi/i) ? 0xc0fff008 : 0xc0ff0000;
115 my ($inp,$out,$key,$Tbl,$s0,$s1,$s2,$s3)=($a0,$a1,$a2,$a3,$a4,$a5,$a6,$a7);
116 my ($i0,$i1,$i2,$i3)=($at,$t0,$t1,$t2);
117 my ($t0,$t1,$t2,$t3,$t4,$t5,$t6,$t7,$t8,$t9,$t10,$t11) = map("\$$_",(12..23));
118 my ($key0,$cnt)=($gp,$fp);
120 # instuction ordering is "stolen" from output from MIPSpro assembler
121 # invoked with -mips3 -O3 arguments...
124 .ent _mips_AES_encrypt
133 $PTR_ADD $key0,$key,16
141 #if defined(__mips_smartmips)
147 lwxs $t0,$i0($Tbl) # Te1[s1>>16]
149 lwxs $t1,$i1($Tbl) # Te1[s2>>16]
151 lwxs $t2,$i2($Tbl) # Te1[s3>>16]
153 lwxs $t3,$i3($Tbl) # Te1[s0>>16]
156 lwxs $t4,$i0($Tbl) # Te2[s2>>8]
158 lwxs $t5,$i1($Tbl) # Te2[s3>>8]
160 lwxs $t6,$i2($Tbl) # Te2[s0>>8]
162 lwxs $t7,$i3($Tbl) # Te2[s1>>8]
165 lwxs $t8,$i0($Tbl) # Te3[s3]
167 lwxs $t9,$i1($Tbl) # Te3[s0]
169 lwxs $t10,$i2($Tbl) # Te3[s1]
171 lwxs $t11,$i3($Tbl) # Te3[s2]
185 lwxs $t4,$i0($Tbl) # Te0[s0>>24]
187 lwxs $t5,$i1($Tbl) # Te0[s1>>24]
189 lwxs $t6,$i2($Tbl) # Te0[s2>>24]
191 lwxs $t7,$i3($Tbl) # Te0[s3>>24]
237 #if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
238 lw $t0,0($i0) # Te1[s1>>16]
240 lw $t1,0($i1) # Te1[s2>>16]
242 lw $t2,0($i2) # Te1[s3>>16]
244 lw $t3,0($i3) # Te1[s0>>16]
247 lwl $t0,3($i0) # Te1[s1>>16]
248 lwl $t1,3($i1) # Te1[s2>>16]
249 lwl $t2,3($i2) # Te1[s3>>16]
250 lwl $t3,3($i3) # Te1[s0>>16]
251 lwr $t0,2($i0) # Te1[s1>>16]
253 lwr $t1,2($i1) # Te1[s2>>16]
255 lwr $t2,2($i2) # Te1[s3>>16]
257 lwr $t3,2($i3) # Te1[s0>>16]
268 #if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
273 # if defined(_MIPSEL)
274 lw $t4,0($i0) # Te2[s2>>8]
276 lw $t5,0($i1) # Te2[s3>>8]
278 lw $t6,0($i2) # Te2[s0>>8]
280 lw $t7,0($i3) # Te2[s1>>8]
291 lw $t8,0($i0) # Te3[s3]
293 lw $t9,0($i1) # Te3[s0]
295 lw $t10,0($i2) # Te3[s1]
297 lw $t11,0($i3) # Te3[s2]
300 lw $t4,0($i0) # Te2[s2>>8]
302 lw $t5,0($i1) # Te2[s3>>8]
304 lw $t6,0($i2) # Te2[s0>>8]
306 lw $t7,0($i3) # Te2[s1>>8]
309 lw $t8,0($i0) # Te3[s3]
311 lw $t9,0($i1) # Te3[s0]
313 lw $t10,0($i2) # Te3[s1]
315 lw $t11,0($i3) # Te3[s2]
337 lwl $t4,2($i0) # Te2[s2>>8]
338 lwl $t5,2($i1) # Te2[s3>>8]
339 lwl $t6,2($i2) # Te2[s0>>8]
340 lwl $t7,2($i3) # Te2[s1>>8]
341 lwr $t4,1($i0) # Te2[s2>>8]
343 lwr $t5,1($i1) # Te2[s3>>8]
345 lwr $t6,1($i2) # Te2[s0>>8]
347 lwr $t7,1($i3) # Te2[s1>>8]
358 lwl $t8,1($i0) # Te3[s3]
359 lwl $t9,1($i1) # Te3[s0]
360 lwl $t10,1($i2) # Te3[s1]
361 lwl $t11,1($i3) # Te3[s2]
362 lwr $t8,0($i0) # Te3[s3]
364 lwr $t9,0($i1) # Te3[s0]
366 lwr $t10,0($i2) # Te3[s1]
368 lwr $t11,0($i3) # Te3[s2]
381 lw $t4,0($i0) # Te0[s0>>24]
383 lw $t5,0($i1) # Te0[s1>>24]
385 lw $t6,0($i2) # Te0[s2>>24]
387 lw $t7,0($i3) # Te0[s3>>24]
426 lbu $t0,2($i0) # Te4[s1>>16]
428 lbu $t1,2($i1) # Te4[s2>>16]
430 lbu $t2,2($i2) # Te4[s3>>16]
432 lbu $t3,2($i3) # Te4[s0>>16]
443 #if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
444 # if defined(_MIPSEL)
445 lbu $t4,2($i0) # Te4[s2>>8]
447 lbu $t5,2($i1) # Te4[s3>>8]
449 lbu $t6,2($i2) # Te4[s0>>8]
451 lbu $t7,2($i3) # Te4[s1>>8]
454 lbu $t8,2($i0) # Te4[s0>>24]
456 lbu $t9,2($i1) # Te4[s1>>24]
458 lbu $t10,2($i2) # Te4[s2>>24]
460 lbu $t11,2($i3) # Te4[s3>>24]
472 lbu $t4,2($i0) # Te4[s2>>8]
474 lbu $t5,2($i1) # Te4[s3>>8]
476 lbu $t6,2($i2) # Te4[s0>>8]
478 lbu $t7,2($i3) # Te4[s1>>8]
489 lbu $t8,2($i0) # Te4[s0>>24]
491 lbu $t9,2($i1) # Te4[s1>>24]
493 lbu $t10,2($i2) # Te4[s2>>24]
495 lbu $t11,2($i3) # Te4[s3>>24]
504 lbu $t4,2($i0) # Te4[s3]
506 lbu $t5,2($i1) # Te4[s0]
508 lbu $t6,2($i2) # Te4[s1]
510 lbu $t7,2($i3) # Te4[s2]
526 lbu $t4,2($i0) # Te4[s2>>8]
528 lbu $t5,2($i1) # Te4[s3>>8]
530 lbu $t6,2($i2) # Te4[s0>>8]
532 lbu $t7,2($i3) # Te4[s1>>8]
543 lbu $t8,2($i0) # Te4[s0>>24]
545 lbu $t9,2($i1) # Te4[s1>>24]
547 lbu $t10,2($i2) # Te4[s2>>24]
549 lbu $t11,2($i3) # Te4[s3>>24]
572 lbu $t4,2($i0) # Te4[s3]
574 lbu $t5,2($i1) # Te4[s0]
576 lbu $t6,2($i2) # Te4[s1]
578 lbu $t7,2($i3) # Te4[s2]
610 .end _mips_AES_encrypt
616 .frame $sp,$FRAMESIZE,$ra
617 .mask $SAVED_REGS_MASK,-$SZREG
620 $code.=<<___ if ($flavour =~ /o32/i); # o32 PIC-ification
624 $PTR_SUB $sp,$FRAMESIZE
625 $REG_S $ra,$FRAMESIZE-1*$SZREG($sp)
626 $REG_S $fp,$FRAMESIZE-2*$SZREG($sp)
627 $REG_S $s11,$FRAMESIZE-3*$SZREG($sp)
628 $REG_S $s10,$FRAMESIZE-4*$SZREG($sp)
629 $REG_S $s9,$FRAMESIZE-5*$SZREG($sp)
630 $REG_S $s8,$FRAMESIZE-6*$SZREG($sp)
631 $REG_S $s7,$FRAMESIZE-7*$SZREG($sp)
632 $REG_S $s6,$FRAMESIZE-8*$SZREG($sp)
633 $REG_S $s5,$FRAMESIZE-9*$SZREG($sp)
634 $REG_S $s4,$FRAMESIZE-10*$SZREG($sp)
636 $code.=<<___ if ($flavour =~ /nubi/i); # optimize non-nubi prologue
637 $REG_S \$15,$FRAMESIZE-11*$SZREG($sp)
638 $REG_S \$14,$FRAMESIZE-12*$SZREG($sp)
639 $REG_S \$13,$FRAMESIZE-13*$SZREG($sp)
640 $REG_S \$12,$FRAMESIZE-14*$SZREG($sp)
641 $REG_S $gp,$FRAMESIZE-15*$SZREG($sp)
643 $code.=<<___ if ($flavour !~ /o32/i); # non-o32 PIC-ification
645 .cpsetup $pf,$zero,AES_encrypt
649 la $Tbl,AES_Te # PIC-ified 'load address'
654 lwl $s3,12+$MSB($inp)
658 lwr $s3,12+$LSB($inp)
660 bal _mips_AES_encrypt
665 swr $s3,12+$LSB($out)
669 swl $s3,12+$MSB($out)
672 $REG_L $ra,$FRAMESIZE-1*$SZREG($sp)
673 $REG_L $fp,$FRAMESIZE-2*$SZREG($sp)
674 $REG_L $s11,$FRAMESIZE-3*$SZREG($sp)
675 $REG_L $s10,$FRAMESIZE-4*$SZREG($sp)
676 $REG_L $s9,$FRAMESIZE-5*$SZREG($sp)
677 $REG_L $s8,$FRAMESIZE-6*$SZREG($sp)
678 $REG_L $s7,$FRAMESIZE-7*$SZREG($sp)
679 $REG_L $s6,$FRAMESIZE-8*$SZREG($sp)
680 $REG_L $s5,$FRAMESIZE-9*$SZREG($sp)
681 $REG_L $s4,$FRAMESIZE-10*$SZREG($sp)
683 $code.=<<___ if ($flavour =~ /nubi/i);
684 $REG_L \$15,$FRAMESIZE-11*$SZREG($sp)
685 $REG_L \$14,$FRAMESIZE-12*$SZREG($sp)
686 $REG_L \$13,$FRAMESIZE-13*$SZREG($sp)
687 $REG_L \$12,$FRAMESIZE-14*$SZREG($sp)
688 $REG_L $gp,$FRAMESIZE-15*$SZREG($sp)
692 $PTR_ADD $sp,$FRAMESIZE
698 .ent _mips_AES_decrypt
707 $PTR_ADD $key0,$key,16
715 #if defined(__mips_smartmips)
721 lwxs $t0,$i0($Tbl) # Td1[s3>>16]
723 lwxs $t1,$i1($Tbl) # Td1[s0>>16]
725 lwxs $t2,$i2($Tbl) # Td1[s1>>16]
727 lwxs $t3,$i3($Tbl) # Td1[s2>>16]
730 lwxs $t4,$i0($Tbl) # Td2[s2>>8]
732 lwxs $t5,$i1($Tbl) # Td2[s3>>8]
734 lwxs $t6,$i2($Tbl) # Td2[s0>>8]
736 lwxs $t7,$i3($Tbl) # Td2[s1>>8]
739 lwxs $t8,$i0($Tbl) # Td3[s1]
741 lwxs $t9,$i1($Tbl) # Td3[s2]
743 lwxs $t10,$i2($Tbl) # Td3[s3]
745 lwxs $t11,$i3($Tbl) # Td3[s0]
759 lwxs $t4,$i0($Tbl) # Td0[s0>>24]
761 lwxs $t5,$i1($Tbl) # Td0[s1>>24]
763 lwxs $t6,$i2($Tbl) # Td0[s2>>24]
765 lwxs $t7,$i3($Tbl) # Td0[s3>>24]
811 #if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
812 lw $t0,0($i0) # Td1[s3>>16]
814 lw $t1,0($i1) # Td1[s0>>16]
816 lw $t2,0($i2) # Td1[s1>>16]
818 lw $t3,0($i3) # Td1[s2>>16]
821 lwl $t0,3($i0) # Td1[s3>>16]
822 lwl $t1,3($i1) # Td1[s0>>16]
823 lwl $t2,3($i2) # Td1[s1>>16]
824 lwl $t3,3($i3) # Td1[s2>>16]
825 lwr $t0,2($i0) # Td1[s3>>16]
827 lwr $t1,2($i1) # Td1[s0>>16]
829 lwr $t2,2($i2) # Td1[s1>>16]
831 lwr $t3,2($i3) # Td1[s2>>16]
843 #if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
848 # if defined(_MIPSEL)
849 lw $t4,0($i0) # Td2[s2>>8]
851 lw $t5,0($i1) # Td2[s3>>8]
853 lw $t6,0($i2) # Td2[s0>>8]
855 lw $t7,0($i3) # Td2[s1>>8]
866 lw $t8,0($i0) # Td3[s1]
868 lw $t9,0($i1) # Td3[s2]
870 lw $t10,0($i2) # Td3[s3]
872 lw $t11,0($i3) # Td3[s0]
875 lw $t4,0($i0) # Td2[s2>>8]
877 lw $t5,0($i1) # Td2[s3>>8]
879 lw $t6,0($i2) # Td2[s0>>8]
881 lw $t7,0($i3) # Td2[s1>>8]
884 lw $t8,0($i0) # Td3[s1]
886 lw $t9,0($i1) # Td3[s2]
888 lw $t10,0($i2) # Td3[s3]
890 lw $t11,0($i3) # Td3[s0]
912 lwl $t4,2($i0) # Td2[s2>>8]
913 lwl $t5,2($i1) # Td2[s3>>8]
914 lwl $t6,2($i2) # Td2[s0>>8]
915 lwl $t7,2($i3) # Td2[s1>>8]
916 lwr $t4,1($i0) # Td2[s2>>8]
918 lwr $t5,1($i1) # Td2[s3>>8]
920 lwr $t6,1($i2) # Td2[s0>>8]
922 lwr $t7,1($i3) # Td2[s1>>8]
933 lwl $t8,1($i0) # Td3[s1]
934 lwl $t9,1($i1) # Td3[s2]
935 lwl $t10,1($i2) # Td3[s3]
936 lwl $t11,1($i3) # Td3[s0]
937 lwr $t8,0($i0) # Td3[s1]
939 lwr $t9,0($i1) # Td3[s2]
941 lwr $t10,0($i2) # Td3[s3]
943 lwr $t11,0($i3) # Td3[s0]
957 lw $t4,0($i0) # Td0[s0>>24]
959 lw $t5,0($i1) # Td0[s1>>24]
961 lw $t6,0($i2) # Td0[s2>>24]
963 lw $t7,0($i3) # Td0[s3>>24]
991 lw $t4,1024($Tbl) # prefetch Td4
999 lw $t8,1024+128($Tbl)
1001 lw $t9,1024+160($Tbl)
1003 lw $t10,1024+192($Tbl)
1005 lw $t11,1024+224($Tbl)
1012 lbu $t0,1024($i0) # Td4[s3>>16]
1014 lbu $t1,1024($i1) # Td4[s0>>16]
1016 lbu $t2,1024($i2) # Td4[s1>>16]
1018 lbu $t3,1024($i3) # Td4[s2>>16]
1029 #if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
1030 # if defined(_MIPSEL)
1031 lbu $t4,1024($i0) # Td4[s2>>8]
1032 $PTR_INS $i0,$s0,0,8
1033 lbu $t5,1024($i1) # Td4[s3>>8]
1034 $PTR_INS $i1,$s1,0,8
1035 lbu $t6,1024($i2) # Td4[s0>>8]
1036 $PTR_INS $i2,$s2,0,8
1037 lbu $t7,1024($i3) # Td4[s1>>8]
1038 $PTR_INS $i3,$s3,0,8
1040 lbu $t8,1024($i0) # Td4[s0>>24]
1042 lbu $t9,1024($i1) # Td4[s1>>24]
1044 lbu $t10,1024($i2) # Td4[s2>>24]
1046 lbu $t11,1024($i3) # Td4[s3>>24]
1054 lbu $t4,1024($i0) # Td4[s2>>8]
1056 lbu $t5,1024($i1) # Td4[s3>>8]
1058 lbu $t6,1024($i2) # Td4[s0>>8]
1060 lbu $t7,1024($i3) # Td4[s1>>8]
1067 lbu $t8,1024($i0) # Td4[s0>>24]
1068 $PTR_INS $i0,$s1,0,8
1069 lbu $t9,1024($i1) # Td4[s1>>24]
1070 $PTR_INS $i1,$s2,0,8
1071 lbu $t10,1024($i2) # Td4[s2>>24]
1072 $PTR_INS $i2,$s3,0,8
1073 lbu $t11,1024($i3) # Td4[s3>>24]
1074 $PTR_INS $i3,$s0,0,8
1082 lbu $t4,1024($i0) # Td4[s1]
1084 lbu $t5,1024($i1) # Td4[s2]
1086 lbu $t6,1024($i2) # Td4[s3]
1088 lbu $t7,1024($i3) # Td4[s0]
1104 lbu $t4,1024($i0) # Td4[s2>>8]
1106 lbu $t5,1024($i1) # Td4[s3>>8]
1108 lbu $t6,1024($i2) # Td4[s0>>8]
1110 lbu $t7,1024($i3) # Td4[s1>>8]
1117 lbu $t8,1024($i0) # Td4[s0>>24]
1119 lbu $t9,1024($i1) # Td4[s1>>24]
1121 lbu $t10,1024($i2) # Td4[s2>>24]
1123 lbu $t11,1024($i3) # Td4[s3>>24]
1142 lbu $t4,1024($i0) # Td4[s1]
1144 lbu $t5,1024($i1) # Td4[s2]
1146 lbu $t6,1024($i2) # Td4[s3]
1148 lbu $t7,1024($i3) # Td4[s0]
1181 .end _mips_AES_decrypt
1187 .frame $sp,$FRAMESIZE,$ra
1188 .mask $SAVED_REGS_MASK,-$SZREG
1191 $code.=<<___ if ($flavour =~ /o32/i); # o32 PIC-ification
1195 $PTR_SUB $sp,$FRAMESIZE
1196 $REG_S $ra,$FRAMESIZE-1*$SZREG($sp)
1197 $REG_S $fp,$FRAMESIZE-2*$SZREG($sp)
1198 $REG_S $s11,$FRAMESIZE-3*$SZREG($sp)
1199 $REG_S $s10,$FRAMESIZE-4*$SZREG($sp)
1200 $REG_S $s9,$FRAMESIZE-5*$SZREG($sp)
1201 $REG_S $s8,$FRAMESIZE-6*$SZREG($sp)
1202 $REG_S $s7,$FRAMESIZE-7*$SZREG($sp)
1203 $REG_S $s6,$FRAMESIZE-8*$SZREG($sp)
1204 $REG_S $s5,$FRAMESIZE-9*$SZREG($sp)
1205 $REG_S $s4,$FRAMESIZE-10*$SZREG($sp)
1207 $code.=<<___ if ($flavour =~ /nubi/i); # optimize non-nubi prologue
1208 $REG_S \$15,$FRAMESIZE-11*$SZREG($sp)
1209 $REG_S \$14,$FRAMESIZE-12*$SZREG($sp)
1210 $REG_S \$13,$FRAMESIZE-13*$SZREG($sp)
1211 $REG_S \$12,$FRAMESIZE-14*$SZREG($sp)
1212 $REG_S $gp,$FRAMESIZE-15*$SZREG($sp)
1214 $code.=<<___ if ($flavour !~ /o32/i); # non-o32 PIC-ification
1216 .cpsetup $pf,$zero,AES_decrypt
1220 la $Tbl,AES_Td # PIC-ified 'load address'
1222 lwl $s0,0+$MSB($inp)
1223 lwl $s1,4+$MSB($inp)
1224 lwl $s2,8+$MSB($inp)
1225 lwl $s3,12+$MSB($inp)
1226 lwr $s0,0+$LSB($inp)
1227 lwr $s1,4+$LSB($inp)
1228 lwr $s2,8+$LSB($inp)
1229 lwr $s3,12+$LSB($inp)
1231 bal _mips_AES_decrypt
1233 swr $s0,0+$LSB($out)
1234 swr $s1,4+$LSB($out)
1235 swr $s2,8+$LSB($out)
1236 swr $s3,12+$LSB($out)
1237 swl $s0,0+$MSB($out)
1238 swl $s1,4+$MSB($out)
1239 swl $s2,8+$MSB($out)
1240 swl $s3,12+$MSB($out)
1243 $REG_L $ra,$FRAMESIZE-1*$SZREG($sp)
1244 $REG_L $fp,$FRAMESIZE-2*$SZREG($sp)
1245 $REG_L $s11,$FRAMESIZE-3*$SZREG($sp)
1246 $REG_L $s10,$FRAMESIZE-4*$SZREG($sp)
1247 $REG_L $s9,$FRAMESIZE-5*$SZREG($sp)
1248 $REG_L $s8,$FRAMESIZE-6*$SZREG($sp)
1249 $REG_L $s7,$FRAMESIZE-7*$SZREG($sp)
1250 $REG_L $s6,$FRAMESIZE-8*$SZREG($sp)
1251 $REG_L $s5,$FRAMESIZE-9*$SZREG($sp)
1252 $REG_L $s4,$FRAMESIZE-10*$SZREG($sp)
1254 $code.=<<___ if ($flavour =~ /nubi/i);
1255 $REG_L \$15,$FRAMESIZE-11*$SZREG($sp)
1256 $REG_L \$14,$FRAMESIZE-12*$SZREG($sp)
1257 $REG_L \$13,$FRAMESIZE-13*$SZREG($sp)
1258 $REG_L \$12,$FRAMESIZE-14*$SZREG($sp)
1259 $REG_L $gp,$FRAMESIZE-15*$SZREG($sp)
1263 $PTR_ADD $sp,$FRAMESIZE
1269 my $FRAMESIZE=8*$SZREG;
1270 my $SAVED_REGS_MASK = ($flavour =~ /nubi/i) ? 0xc000f008 : 0xc0000000;
1272 my ($inp,$bits,$key,$Tbl)=($a0,$a1,$a2,$a3);
1273 my ($rk0,$rk1,$rk2,$rk3,$rk4,$rk5,$rk6,$rk7)=($a4,$a5,$a6,$a7,$s0,$s1,$s2,$s3);
1274 my ($i0,$i1,$i2,$i3)=($at,$t0,$t1,$t2);
1275 my ($rcon,$cnt)=($gp,$fp);
1279 .ent _mips_AES_set_encrypt_key
1280 _mips_AES_set_encrypt_key:
1283 beqz $inp,.Lekey_done
1285 beqz $key,.Lekey_done
1286 $PTR_ADD $rcon,$Tbl,256
1289 lwl $rk0,0+$MSB($inp) # load 128 bits
1290 lwl $rk1,4+$MSB($inp)
1291 lwl $rk2,8+$MSB($inp)
1292 lwl $rk3,12+$MSB($inp)
1294 lwr $rk0,0+$LSB($inp)
1295 lwr $rk1,4+$LSB($inp)
1296 lwr $rk2,8+$LSB($inp)
1297 lwr $rk3,12+$LSB($inp)
1299 beq $bits,$at,.L128bits
1303 lwl $rk4,16+$MSB($inp) # load 192 bits
1304 lwl $rk5,20+$MSB($inp)
1306 lwr $rk4,16+$LSB($inp)
1307 lwr $rk5,20+$LSB($inp)
1309 beq $bits,$at,.L192bits
1313 lwl $rk6,24+$MSB($inp) # load 256 bits
1314 lwl $rk7,28+$MSB($inp)
1316 lwr $rk6,24+$LSB($inp)
1317 lwr $rk7,28+$LSB($inp)
1319 beq $bits,$at,.L256bits
1482 beqz $cnt,.L256bits_done
1529 .end _mips_AES_set_encrypt_key
1531 .globl AES_set_encrypt_key
1532 .ent AES_set_encrypt_key
1533 AES_set_encrypt_key:
1534 .frame $sp,$FRAMESIZE,$ra
1535 .mask $SAVED_REGS_MASK,-$SZREG
1538 $code.=<<___ if ($flavour =~ /o32/i); # o32 PIC-ification
1542 $PTR_SUB $sp,$FRAMESIZE
1543 $REG_S $ra,$FRAMESIZE-1*$SZREG($sp)
1544 $REG_S $fp,$FRAMESIZE-2*$SZREG($sp)
1546 $code.=<<___ if ($flavour =~ /nubi/i); # optimize non-nubi prologue
1547 $REG_S $s3,$FRAMESIZE-3*$SZREG($sp)
1548 $REG_S $s2,$FRAMESIZE-4*$SZREG($sp)
1549 $REG_S $s1,$FRAMESIZE-5*$SZREG($sp)
1550 $REG_S $s0,$FRAMESIZE-6*$SZREG($sp)
1551 $REG_S $gp,$FRAMESIZE-7*$SZREG($sp)
1553 $code.=<<___ if ($flavour !~ /o32/i); # non-o32 PIC-ification
1555 .cpsetup $pf,$zero,AES_set_encrypt_key
1559 la $Tbl,AES_Te4 # PIC-ified 'load address'
1561 bal _mips_AES_set_encrypt_key
1565 $REG_L $ra,$FRAMESIZE-1*$SZREG($sp)
1566 $REG_L $fp,$FRAMESIZE-2*$SZREG($sp)
1568 $code.=<<___ if ($flavour =~ /nubi/i);
1569 $REG_L $s3,$FRAMESIZE-11*$SZREG($sp)
1570 $REG_L $s2,$FRAMESIZE-12*$SZREG($sp)
1571 $REG_L $s1,$FRAMESIZE-13*$SZREG($sp)
1572 $REG_L $s0,$FRAMESIZE-14*$SZREG($sp)
1573 $REG_L $gp,$FRAMESIZE-15*$SZREG($sp)
1577 $PTR_ADD $sp,$FRAMESIZE
1578 .end AES_set_encrypt_key
1581 my ($head,$tail)=($inp,$bits);
1582 my ($tp1,$tp2,$tp4,$tp8,$tp9,$tpb,$tpd,$tpe)=($a4,$a5,$a6,$a7,$s0,$s1,$s2,$s3);
1583 my ($m,$x80808080,$x7f7f7f7f,$x1b1b1b1b)=($at,$t0,$t1,$t2);
1586 .globl AES_set_decrypt_key
1587 .ent AES_set_decrypt_key
1588 AES_set_decrypt_key:
1589 .frame $sp,$FRAMESIZE,$ra
1590 .mask $SAVED_REGS_MASK,-$SZREG
1593 $code.=<<___ if ($flavour =~ /o32/i); # o32 PIC-ification
1597 $PTR_SUB $sp,$FRAMESIZE
1598 $REG_S $ra,$FRAMESIZE-1*$SZREG($sp)
1599 $REG_S $fp,$FRAMESIZE-2*$SZREG($sp)
1601 $code.=<<___ if ($flavour =~ /nubi/i); # optimize non-nubi prologue
1602 $REG_S $s3,$FRAMESIZE-3*$SZREG($sp)
1603 $REG_S $s2,$FRAMESIZE-4*$SZREG($sp)
1604 $REG_S $s1,$FRAMESIZE-5*$SZREG($sp)
1605 $REG_S $s0,$FRAMESIZE-6*$SZREG($sp)
1606 $REG_S $gp,$FRAMESIZE-7*$SZREG($sp)
1608 $code.=<<___ if ($flavour !~ /o32/i); # non-o32 PIC-ification
1610 .cpsetup $pf,$zero,AES_set_decrypt_key
1614 la $Tbl,AES_Te4 # PIC-ified 'load address'
1616 bal _mips_AES_set_encrypt_key
1618 bltz $t0,.Ldkey_done
1621 $PTR_ADD $head,$key,0
1622 $PTR_ADD $tail,$key,$at
1643 bne $head,$tail,.Lswap
1645 lw $tp1,16($key) # modulo-scheduled
1646 lui $x80808080,0x8080
1648 or $x80808080,0x8080
1651 lui $x1b1b1b1b,0x1b1b
1652 nor $x7f7f7f7f,$zero,$x80808080
1653 or $x1b1b1b1b,0x1b1b
1656 and $m,$tp1,$x80808080
1657 and $tp2,$tp1,$x7f7f7f7f
1659 addu $tp2,$tp2 # tp2<<1
1664 and $m,$tp2,$x80808080
1665 and $tp4,$tp2,$x7f7f7f7f
1667 addu $tp4,$tp4 # tp4<<1
1672 and $m,$tp4,$x80808080
1673 and $tp8,$tp4,$x7f7f7f7f
1675 addu $tp8,$tp8 # tp8<<1
1685 #if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
1692 lw $tp1,4($key) # modulo-scheduled
1707 lw $tp1,4($key) # modulo-scheduled
1719 $REG_L $ra,$FRAMESIZE-1*$SZREG($sp)
1720 $REG_L $fp,$FRAMESIZE-2*$SZREG($sp)
1722 $code.=<<___ if ($flavour =~ /nubi/i);
1723 $REG_L $s3,$FRAMESIZE-11*$SZREG($sp)
1724 $REG_L $s2,$FRAMESIZE-12*$SZREG($sp)
1725 $REG_L $s1,$FRAMESIZE-13*$SZREG($sp)
1726 $REG_L $s0,$FRAMESIZE-14*$SZREG($sp)
1727 $REG_L $gp,$FRAMESIZE-15*$SZREG($sp)
1731 $PTR_ADD $sp,$FRAMESIZE
1732 .end AES_set_decrypt_key
1736 ######################################################################
1737 # Tables are kept in endian-neutral manner
1742 .byte 0xc6,0x63,0x63,0xa5, 0xf8,0x7c,0x7c,0x84 # Te0
1743 .byte 0xee,0x77,0x77,0x99, 0xf6,0x7b,0x7b,0x8d
1744 .byte 0xff,0xf2,0xf2,0x0d, 0xd6,0x6b,0x6b,0xbd
1745 .byte 0xde,0x6f,0x6f,0xb1, 0x91,0xc5,0xc5,0x54
1746 .byte 0x60,0x30,0x30,0x50, 0x02,0x01,0x01,0x03
1747 .byte 0xce,0x67,0x67,0xa9, 0x56,0x2b,0x2b,0x7d
1748 .byte 0xe7,0xfe,0xfe,0x19, 0xb5,0xd7,0xd7,0x62
1749 .byte 0x4d,0xab,0xab,0xe6, 0xec,0x76,0x76,0x9a
1750 .byte 0x8f,0xca,0xca,0x45, 0x1f,0x82,0x82,0x9d
1751 .byte 0x89,0xc9,0xc9,0x40, 0xfa,0x7d,0x7d,0x87
1752 .byte 0xef,0xfa,0xfa,0x15, 0xb2,0x59,0x59,0xeb
1753 .byte 0x8e,0x47,0x47,0xc9, 0xfb,0xf0,0xf0,0x0b
1754 .byte 0x41,0xad,0xad,0xec, 0xb3,0xd4,0xd4,0x67
1755 .byte 0x5f,0xa2,0xa2,0xfd, 0x45,0xaf,0xaf,0xea
1756 .byte 0x23,0x9c,0x9c,0xbf, 0x53,0xa4,0xa4,0xf7
1757 .byte 0xe4,0x72,0x72,0x96, 0x9b,0xc0,0xc0,0x5b
1758 .byte 0x75,0xb7,0xb7,0xc2, 0xe1,0xfd,0xfd,0x1c
1759 .byte 0x3d,0x93,0x93,0xae, 0x4c,0x26,0x26,0x6a
1760 .byte 0x6c,0x36,0x36,0x5a, 0x7e,0x3f,0x3f,0x41
1761 .byte 0xf5,0xf7,0xf7,0x02, 0x83,0xcc,0xcc,0x4f
1762 .byte 0x68,0x34,0x34,0x5c, 0x51,0xa5,0xa5,0xf4
1763 .byte 0xd1,0xe5,0xe5,0x34, 0xf9,0xf1,0xf1,0x08
1764 .byte 0xe2,0x71,0x71,0x93, 0xab,0xd8,0xd8,0x73
1765 .byte 0x62,0x31,0x31,0x53, 0x2a,0x15,0x15,0x3f
1766 .byte 0x08,0x04,0x04,0x0c, 0x95,0xc7,0xc7,0x52
1767 .byte 0x46,0x23,0x23,0x65, 0x9d,0xc3,0xc3,0x5e
1768 .byte 0x30,0x18,0x18,0x28, 0x37,0x96,0x96,0xa1
1769 .byte 0x0a,0x05,0x05,0x0f, 0x2f,0x9a,0x9a,0xb5
1770 .byte 0x0e,0x07,0x07,0x09, 0x24,0x12,0x12,0x36
1771 .byte 0x1b,0x80,0x80,0x9b, 0xdf,0xe2,0xe2,0x3d
1772 .byte 0xcd,0xeb,0xeb,0x26, 0x4e,0x27,0x27,0x69
1773 .byte 0x7f,0xb2,0xb2,0xcd, 0xea,0x75,0x75,0x9f
1774 .byte 0x12,0x09,0x09,0x1b, 0x1d,0x83,0x83,0x9e
1775 .byte 0x58,0x2c,0x2c,0x74, 0x34,0x1a,0x1a,0x2e
1776 .byte 0x36,0x1b,0x1b,0x2d, 0xdc,0x6e,0x6e,0xb2
1777 .byte 0xb4,0x5a,0x5a,0xee, 0x5b,0xa0,0xa0,0xfb
1778 .byte 0xa4,0x52,0x52,0xf6, 0x76,0x3b,0x3b,0x4d
1779 .byte 0xb7,0xd6,0xd6,0x61, 0x7d,0xb3,0xb3,0xce
1780 .byte 0x52,0x29,0x29,0x7b, 0xdd,0xe3,0xe3,0x3e
1781 .byte 0x5e,0x2f,0x2f,0x71, 0x13,0x84,0x84,0x97
1782 .byte 0xa6,0x53,0x53,0xf5, 0xb9,0xd1,0xd1,0x68
1783 .byte 0x00,0x00,0x00,0x00, 0xc1,0xed,0xed,0x2c
1784 .byte 0x40,0x20,0x20,0x60, 0xe3,0xfc,0xfc,0x1f
1785 .byte 0x79,0xb1,0xb1,0xc8, 0xb6,0x5b,0x5b,0xed
1786 .byte 0xd4,0x6a,0x6a,0xbe, 0x8d,0xcb,0xcb,0x46
1787 .byte 0x67,0xbe,0xbe,0xd9, 0x72,0x39,0x39,0x4b
1788 .byte 0x94,0x4a,0x4a,0xde, 0x98,0x4c,0x4c,0xd4
1789 .byte 0xb0,0x58,0x58,0xe8, 0x85,0xcf,0xcf,0x4a
1790 .byte 0xbb,0xd0,0xd0,0x6b, 0xc5,0xef,0xef,0x2a
1791 .byte 0x4f,0xaa,0xaa,0xe5, 0xed,0xfb,0xfb,0x16
1792 .byte 0x86,0x43,0x43,0xc5, 0x9a,0x4d,0x4d,0xd7
1793 .byte 0x66,0x33,0x33,0x55, 0x11,0x85,0x85,0x94
1794 .byte 0x8a,0x45,0x45,0xcf, 0xe9,0xf9,0xf9,0x10
1795 .byte 0x04,0x02,0x02,0x06, 0xfe,0x7f,0x7f,0x81
1796 .byte 0xa0,0x50,0x50,0xf0, 0x78,0x3c,0x3c,0x44
1797 .byte 0x25,0x9f,0x9f,0xba, 0x4b,0xa8,0xa8,0xe3
1798 .byte 0xa2,0x51,0x51,0xf3, 0x5d,0xa3,0xa3,0xfe
1799 .byte 0x80,0x40,0x40,0xc0, 0x05,0x8f,0x8f,0x8a
1800 .byte 0x3f,0x92,0x92,0xad, 0x21,0x9d,0x9d,0xbc
1801 .byte 0x70,0x38,0x38,0x48, 0xf1,0xf5,0xf5,0x04
1802 .byte 0x63,0xbc,0xbc,0xdf, 0x77,0xb6,0xb6,0xc1
1803 .byte 0xaf,0xda,0xda,0x75, 0x42,0x21,0x21,0x63
1804 .byte 0x20,0x10,0x10,0x30, 0xe5,0xff,0xff,0x1a
1805 .byte 0xfd,0xf3,0xf3,0x0e, 0xbf,0xd2,0xd2,0x6d
1806 .byte 0x81,0xcd,0xcd,0x4c, 0x18,0x0c,0x0c,0x14
1807 .byte 0x26,0x13,0x13,0x35, 0xc3,0xec,0xec,0x2f
1808 .byte 0xbe,0x5f,0x5f,0xe1, 0x35,0x97,0x97,0xa2
1809 .byte 0x88,0x44,0x44,0xcc, 0x2e,0x17,0x17,0x39
1810 .byte 0x93,0xc4,0xc4,0x57, 0x55,0xa7,0xa7,0xf2
1811 .byte 0xfc,0x7e,0x7e,0x82, 0x7a,0x3d,0x3d,0x47
1812 .byte 0xc8,0x64,0x64,0xac, 0xba,0x5d,0x5d,0xe7
1813 .byte 0x32,0x19,0x19,0x2b, 0xe6,0x73,0x73,0x95
1814 .byte 0xc0,0x60,0x60,0xa0, 0x19,0x81,0x81,0x98
1815 .byte 0x9e,0x4f,0x4f,0xd1, 0xa3,0xdc,0xdc,0x7f
1816 .byte 0x44,0x22,0x22,0x66, 0x54,0x2a,0x2a,0x7e
1817 .byte 0x3b,0x90,0x90,0xab, 0x0b,0x88,0x88,0x83
1818 .byte 0x8c,0x46,0x46,0xca, 0xc7,0xee,0xee,0x29
1819 .byte 0x6b,0xb8,0xb8,0xd3, 0x28,0x14,0x14,0x3c
1820 .byte 0xa7,0xde,0xde,0x79, 0xbc,0x5e,0x5e,0xe2
1821 .byte 0x16,0x0b,0x0b,0x1d, 0xad,0xdb,0xdb,0x76
1822 .byte 0xdb,0xe0,0xe0,0x3b, 0x64,0x32,0x32,0x56
1823 .byte 0x74,0x3a,0x3a,0x4e, 0x14,0x0a,0x0a,0x1e
1824 .byte 0x92,0x49,0x49,0xdb, 0x0c,0x06,0x06,0x0a
1825 .byte 0x48,0x24,0x24,0x6c, 0xb8,0x5c,0x5c,0xe4
1826 .byte 0x9f,0xc2,0xc2,0x5d, 0xbd,0xd3,0xd3,0x6e
1827 .byte 0x43,0xac,0xac,0xef, 0xc4,0x62,0x62,0xa6
1828 .byte 0x39,0x91,0x91,0xa8, 0x31,0x95,0x95,0xa4
1829 .byte 0xd3,0xe4,0xe4,0x37, 0xf2,0x79,0x79,0x8b
1830 .byte 0xd5,0xe7,0xe7,0x32, 0x8b,0xc8,0xc8,0x43
1831 .byte 0x6e,0x37,0x37,0x59, 0xda,0x6d,0x6d,0xb7
1832 .byte 0x01,0x8d,0x8d,0x8c, 0xb1,0xd5,0xd5,0x64
1833 .byte 0x9c,0x4e,0x4e,0xd2, 0x49,0xa9,0xa9,0xe0
1834 .byte 0xd8,0x6c,0x6c,0xb4, 0xac,0x56,0x56,0xfa
1835 .byte 0xf3,0xf4,0xf4,0x07, 0xcf,0xea,0xea,0x25
1836 .byte 0xca,0x65,0x65,0xaf, 0xf4,0x7a,0x7a,0x8e
1837 .byte 0x47,0xae,0xae,0xe9, 0x10,0x08,0x08,0x18
1838 .byte 0x6f,0xba,0xba,0xd5, 0xf0,0x78,0x78,0x88
1839 .byte 0x4a,0x25,0x25,0x6f, 0x5c,0x2e,0x2e,0x72
1840 .byte 0x38,0x1c,0x1c,0x24, 0x57,0xa6,0xa6,0xf1
1841 .byte 0x73,0xb4,0xb4,0xc7, 0x97,0xc6,0xc6,0x51
1842 .byte 0xcb,0xe8,0xe8,0x23, 0xa1,0xdd,0xdd,0x7c
1843 .byte 0xe8,0x74,0x74,0x9c, 0x3e,0x1f,0x1f,0x21
1844 .byte 0x96,0x4b,0x4b,0xdd, 0x61,0xbd,0xbd,0xdc
1845 .byte 0x0d,0x8b,0x8b,0x86, 0x0f,0x8a,0x8a,0x85
1846 .byte 0xe0,0x70,0x70,0x90, 0x7c,0x3e,0x3e,0x42
1847 .byte 0x71,0xb5,0xb5,0xc4, 0xcc,0x66,0x66,0xaa
1848 .byte 0x90,0x48,0x48,0xd8, 0x06,0x03,0x03,0x05
1849 .byte 0xf7,0xf6,0xf6,0x01, 0x1c,0x0e,0x0e,0x12
1850 .byte 0xc2,0x61,0x61,0xa3, 0x6a,0x35,0x35,0x5f
1851 .byte 0xae,0x57,0x57,0xf9, 0x69,0xb9,0xb9,0xd0
1852 .byte 0x17,0x86,0x86,0x91, 0x99,0xc1,0xc1,0x58
1853 .byte 0x3a,0x1d,0x1d,0x27, 0x27,0x9e,0x9e,0xb9
1854 .byte 0xd9,0xe1,0xe1,0x38, 0xeb,0xf8,0xf8,0x13
1855 .byte 0x2b,0x98,0x98,0xb3, 0x22,0x11,0x11,0x33
1856 .byte 0xd2,0x69,0x69,0xbb, 0xa9,0xd9,0xd9,0x70
1857 .byte 0x07,0x8e,0x8e,0x89, 0x33,0x94,0x94,0xa7
1858 .byte 0x2d,0x9b,0x9b,0xb6, 0x3c,0x1e,0x1e,0x22
1859 .byte 0x15,0x87,0x87,0x92, 0xc9,0xe9,0xe9,0x20
1860 .byte 0x87,0xce,0xce,0x49, 0xaa,0x55,0x55,0xff
1861 .byte 0x50,0x28,0x28,0x78, 0xa5,0xdf,0xdf,0x7a
1862 .byte 0x03,0x8c,0x8c,0x8f, 0x59,0xa1,0xa1,0xf8
1863 .byte 0x09,0x89,0x89,0x80, 0x1a,0x0d,0x0d,0x17
1864 .byte 0x65,0xbf,0xbf,0xda, 0xd7,0xe6,0xe6,0x31
1865 .byte 0x84,0x42,0x42,0xc6, 0xd0,0x68,0x68,0xb8
1866 .byte 0x82,0x41,0x41,0xc3, 0x29,0x99,0x99,0xb0
1867 .byte 0x5a,0x2d,0x2d,0x77, 0x1e,0x0f,0x0f,0x11
1868 .byte 0x7b,0xb0,0xb0,0xcb, 0xa8,0x54,0x54,0xfc
1869 .byte 0x6d,0xbb,0xbb,0xd6, 0x2c,0x16,0x16,0x3a
1872 .byte 0x51,0xf4,0xa7,0x50, 0x7e,0x41,0x65,0x53 # Td0
1873 .byte 0x1a,0x17,0xa4,0xc3, 0x3a,0x27,0x5e,0x96
1874 .byte 0x3b,0xab,0x6b,0xcb, 0x1f,0x9d,0x45,0xf1
1875 .byte 0xac,0xfa,0x58,0xab, 0x4b,0xe3,0x03,0x93
1876 .byte 0x20,0x30,0xfa,0x55, 0xad,0x76,0x6d,0xf6
1877 .byte 0x88,0xcc,0x76,0x91, 0xf5,0x02,0x4c,0x25
1878 .byte 0x4f,0xe5,0xd7,0xfc, 0xc5,0x2a,0xcb,0xd7
1879 .byte 0x26,0x35,0x44,0x80, 0xb5,0x62,0xa3,0x8f
1880 .byte 0xde,0xb1,0x5a,0x49, 0x25,0xba,0x1b,0x67
1881 .byte 0x45,0xea,0x0e,0x98, 0x5d,0xfe,0xc0,0xe1
1882 .byte 0xc3,0x2f,0x75,0x02, 0x81,0x4c,0xf0,0x12
1883 .byte 0x8d,0x46,0x97,0xa3, 0x6b,0xd3,0xf9,0xc6
1884 .byte 0x03,0x8f,0x5f,0xe7, 0x15,0x92,0x9c,0x95
1885 .byte 0xbf,0x6d,0x7a,0xeb, 0x95,0x52,0x59,0xda
1886 .byte 0xd4,0xbe,0x83,0x2d, 0x58,0x74,0x21,0xd3
1887 .byte 0x49,0xe0,0x69,0x29, 0x8e,0xc9,0xc8,0x44
1888 .byte 0x75,0xc2,0x89,0x6a, 0xf4,0x8e,0x79,0x78
1889 .byte 0x99,0x58,0x3e,0x6b, 0x27,0xb9,0x71,0xdd
1890 .byte 0xbe,0xe1,0x4f,0xb6, 0xf0,0x88,0xad,0x17
1891 .byte 0xc9,0x20,0xac,0x66, 0x7d,0xce,0x3a,0xb4
1892 .byte 0x63,0xdf,0x4a,0x18, 0xe5,0x1a,0x31,0x82
1893 .byte 0x97,0x51,0x33,0x60, 0x62,0x53,0x7f,0x45
1894 .byte 0xb1,0x64,0x77,0xe0, 0xbb,0x6b,0xae,0x84
1895 .byte 0xfe,0x81,0xa0,0x1c, 0xf9,0x08,0x2b,0x94
1896 .byte 0x70,0x48,0x68,0x58, 0x8f,0x45,0xfd,0x19
1897 .byte 0x94,0xde,0x6c,0x87, 0x52,0x7b,0xf8,0xb7
1898 .byte 0xab,0x73,0xd3,0x23, 0x72,0x4b,0x02,0xe2
1899 .byte 0xe3,0x1f,0x8f,0x57, 0x66,0x55,0xab,0x2a
1900 .byte 0xb2,0xeb,0x28,0x07, 0x2f,0xb5,0xc2,0x03
1901 .byte 0x86,0xc5,0x7b,0x9a, 0xd3,0x37,0x08,0xa5
1902 .byte 0x30,0x28,0x87,0xf2, 0x23,0xbf,0xa5,0xb2
1903 .byte 0x02,0x03,0x6a,0xba, 0xed,0x16,0x82,0x5c
1904 .byte 0x8a,0xcf,0x1c,0x2b, 0xa7,0x79,0xb4,0x92
1905 .byte 0xf3,0x07,0xf2,0xf0, 0x4e,0x69,0xe2,0xa1
1906 .byte 0x65,0xda,0xf4,0xcd, 0x06,0x05,0xbe,0xd5
1907 .byte 0xd1,0x34,0x62,0x1f, 0xc4,0xa6,0xfe,0x8a
1908 .byte 0x34,0x2e,0x53,0x9d, 0xa2,0xf3,0x55,0xa0
1909 .byte 0x05,0x8a,0xe1,0x32, 0xa4,0xf6,0xeb,0x75
1910 .byte 0x0b,0x83,0xec,0x39, 0x40,0x60,0xef,0xaa
1911 .byte 0x5e,0x71,0x9f,0x06, 0xbd,0x6e,0x10,0x51
1912 .byte 0x3e,0x21,0x8a,0xf9, 0x96,0xdd,0x06,0x3d
1913 .byte 0xdd,0x3e,0x05,0xae, 0x4d,0xe6,0xbd,0x46
1914 .byte 0x91,0x54,0x8d,0xb5, 0x71,0xc4,0x5d,0x05
1915 .byte 0x04,0x06,0xd4,0x6f, 0x60,0x50,0x15,0xff
1916 .byte 0x19,0x98,0xfb,0x24, 0xd6,0xbd,0xe9,0x97
1917 .byte 0x89,0x40,0x43,0xcc, 0x67,0xd9,0x9e,0x77
1918 .byte 0xb0,0xe8,0x42,0xbd, 0x07,0x89,0x8b,0x88
1919 .byte 0xe7,0x19,0x5b,0x38, 0x79,0xc8,0xee,0xdb
1920 .byte 0xa1,0x7c,0x0a,0x47, 0x7c,0x42,0x0f,0xe9
1921 .byte 0xf8,0x84,0x1e,0xc9, 0x00,0x00,0x00,0x00
1922 .byte 0x09,0x80,0x86,0x83, 0x32,0x2b,0xed,0x48
1923 .byte 0x1e,0x11,0x70,0xac, 0x6c,0x5a,0x72,0x4e
1924 .byte 0xfd,0x0e,0xff,0xfb, 0x0f,0x85,0x38,0x56
1925 .byte 0x3d,0xae,0xd5,0x1e, 0x36,0x2d,0x39,0x27
1926 .byte 0x0a,0x0f,0xd9,0x64, 0x68,0x5c,0xa6,0x21
1927 .byte 0x9b,0x5b,0x54,0xd1, 0x24,0x36,0x2e,0x3a
1928 .byte 0x0c,0x0a,0x67,0xb1, 0x93,0x57,0xe7,0x0f
1929 .byte 0xb4,0xee,0x96,0xd2, 0x1b,0x9b,0x91,0x9e
1930 .byte 0x80,0xc0,0xc5,0x4f, 0x61,0xdc,0x20,0xa2
1931 .byte 0x5a,0x77,0x4b,0x69, 0x1c,0x12,0x1a,0x16
1932 .byte 0xe2,0x93,0xba,0x0a, 0xc0,0xa0,0x2a,0xe5
1933 .byte 0x3c,0x22,0xe0,0x43, 0x12,0x1b,0x17,0x1d
1934 .byte 0x0e,0x09,0x0d,0x0b, 0xf2,0x8b,0xc7,0xad
1935 .byte 0x2d,0xb6,0xa8,0xb9, 0x14,0x1e,0xa9,0xc8
1936 .byte 0x57,0xf1,0x19,0x85, 0xaf,0x75,0x07,0x4c
1937 .byte 0xee,0x99,0xdd,0xbb, 0xa3,0x7f,0x60,0xfd
1938 .byte 0xf7,0x01,0x26,0x9f, 0x5c,0x72,0xf5,0xbc
1939 .byte 0x44,0x66,0x3b,0xc5, 0x5b,0xfb,0x7e,0x34
1940 .byte 0x8b,0x43,0x29,0x76, 0xcb,0x23,0xc6,0xdc
1941 .byte 0xb6,0xed,0xfc,0x68, 0xb8,0xe4,0xf1,0x63
1942 .byte 0xd7,0x31,0xdc,0xca, 0x42,0x63,0x85,0x10
1943 .byte 0x13,0x97,0x22,0x40, 0x84,0xc6,0x11,0x20
1944 .byte 0x85,0x4a,0x24,0x7d, 0xd2,0xbb,0x3d,0xf8
1945 .byte 0xae,0xf9,0x32,0x11, 0xc7,0x29,0xa1,0x6d
1946 .byte 0x1d,0x9e,0x2f,0x4b, 0xdc,0xb2,0x30,0xf3
1947 .byte 0x0d,0x86,0x52,0xec, 0x77,0xc1,0xe3,0xd0
1948 .byte 0x2b,0xb3,0x16,0x6c, 0xa9,0x70,0xb9,0x99
1949 .byte 0x11,0x94,0x48,0xfa, 0x47,0xe9,0x64,0x22
1950 .byte 0xa8,0xfc,0x8c,0xc4, 0xa0,0xf0,0x3f,0x1a
1951 .byte 0x56,0x7d,0x2c,0xd8, 0x22,0x33,0x90,0xef
1952 .byte 0x87,0x49,0x4e,0xc7, 0xd9,0x38,0xd1,0xc1
1953 .byte 0x8c,0xca,0xa2,0xfe, 0x98,0xd4,0x0b,0x36
1954 .byte 0xa6,0xf5,0x81,0xcf, 0xa5,0x7a,0xde,0x28
1955 .byte 0xda,0xb7,0x8e,0x26, 0x3f,0xad,0xbf,0xa4
1956 .byte 0x2c,0x3a,0x9d,0xe4, 0x50,0x78,0x92,0x0d
1957 .byte 0x6a,0x5f,0xcc,0x9b, 0x54,0x7e,0x46,0x62
1958 .byte 0xf6,0x8d,0x13,0xc2, 0x90,0xd8,0xb8,0xe8
1959 .byte 0x2e,0x39,0xf7,0x5e, 0x82,0xc3,0xaf,0xf5
1960 .byte 0x9f,0x5d,0x80,0xbe, 0x69,0xd0,0x93,0x7c
1961 .byte 0x6f,0xd5,0x2d,0xa9, 0xcf,0x25,0x12,0xb3
1962 .byte 0xc8,0xac,0x99,0x3b, 0x10,0x18,0x7d,0xa7
1963 .byte 0xe8,0x9c,0x63,0x6e, 0xdb,0x3b,0xbb,0x7b
1964 .byte 0xcd,0x26,0x78,0x09, 0x6e,0x59,0x18,0xf4
1965 .byte 0xec,0x9a,0xb7,0x01, 0x83,0x4f,0x9a,0xa8
1966 .byte 0xe6,0x95,0x6e,0x65, 0xaa,0xff,0xe6,0x7e
1967 .byte 0x21,0xbc,0xcf,0x08, 0xef,0x15,0xe8,0xe6
1968 .byte 0xba,0xe7,0x9b,0xd9, 0x4a,0x6f,0x36,0xce
1969 .byte 0xea,0x9f,0x09,0xd4, 0x29,0xb0,0x7c,0xd6
1970 .byte 0x31,0xa4,0xb2,0xaf, 0x2a,0x3f,0x23,0x31
1971 .byte 0xc6,0xa5,0x94,0x30, 0x35,0xa2,0x66,0xc0
1972 .byte 0x74,0x4e,0xbc,0x37, 0xfc,0x82,0xca,0xa6
1973 .byte 0xe0,0x90,0xd0,0xb0, 0x33,0xa7,0xd8,0x15
1974 .byte 0xf1,0x04,0x98,0x4a, 0x41,0xec,0xda,0xf7
1975 .byte 0x7f,0xcd,0x50,0x0e, 0x17,0x91,0xf6,0x2f
1976 .byte 0x76,0x4d,0xd6,0x8d, 0x43,0xef,0xb0,0x4d
1977 .byte 0xcc,0xaa,0x4d,0x54, 0xe4,0x96,0x04,0xdf
1978 .byte 0x9e,0xd1,0xb5,0xe3, 0x4c,0x6a,0x88,0x1b
1979 .byte 0xc1,0x2c,0x1f,0xb8, 0x46,0x65,0x51,0x7f
1980 .byte 0x9d,0x5e,0xea,0x04, 0x01,0x8c,0x35,0x5d
1981 .byte 0xfa,0x87,0x74,0x73, 0xfb,0x0b,0x41,0x2e
1982 .byte 0xb3,0x67,0x1d,0x5a, 0x92,0xdb,0xd2,0x52
1983 .byte 0xe9,0x10,0x56,0x33, 0x6d,0xd6,0x47,0x13
1984 .byte 0x9a,0xd7,0x61,0x8c, 0x37,0xa1,0x0c,0x7a
1985 .byte 0x59,0xf8,0x14,0x8e, 0xeb,0x13,0x3c,0x89
1986 .byte 0xce,0xa9,0x27,0xee, 0xb7,0x61,0xc9,0x35
1987 .byte 0xe1,0x1c,0xe5,0xed, 0x7a,0x47,0xb1,0x3c
1988 .byte 0x9c,0xd2,0xdf,0x59, 0x55,0xf2,0x73,0x3f
1989 .byte 0x18,0x14,0xce,0x79, 0x73,0xc7,0x37,0xbf
1990 .byte 0x53,0xf7,0xcd,0xea, 0x5f,0xfd,0xaa,0x5b
1991 .byte 0xdf,0x3d,0x6f,0x14, 0x78,0x44,0xdb,0x86
1992 .byte 0xca,0xaf,0xf3,0x81, 0xb9,0x68,0xc4,0x3e
1993 .byte 0x38,0x24,0x34,0x2c, 0xc2,0xa3,0x40,0x5f
1994 .byte 0x16,0x1d,0xc3,0x72, 0xbc,0xe2,0x25,0x0c
1995 .byte 0x28,0x3c,0x49,0x8b, 0xff,0x0d,0x95,0x41
1996 .byte 0x39,0xa8,0x01,0x71, 0x08,0x0c,0xb3,0xde
1997 .byte 0xd8,0xb4,0xe4,0x9c, 0x64,0x56,0xc1,0x90
1998 .byte 0x7b,0xcb,0x84,0x61, 0xd5,0x32,0xb6,0x70
1999 .byte 0x48,0x6c,0x5c,0x74, 0xd0,0xb8,0x57,0x42
2001 .byte 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38 # Td4
2002 .byte 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb
2003 .byte 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87
2004 .byte 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb
2005 .byte 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d
2006 .byte 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e
2007 .byte 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2
2008 .byte 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25
2009 .byte 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16
2010 .byte 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92
2011 .byte 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda
2012 .byte 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84
2013 .byte 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a
2014 .byte 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06
2015 .byte 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02
2016 .byte 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b
2017 .byte 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea
2018 .byte 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73
2019 .byte 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85
2020 .byte 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e
2021 .byte 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89
2022 .byte 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b
2023 .byte 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20
2024 .byte 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4
2025 .byte 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31
2026 .byte 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f
2027 .byte 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d
2028 .byte 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef
2029 .byte 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0
2030 .byte 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61
2031 .byte 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26
2032 .byte 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d
2035 .byte 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5 # Te4
2036 .byte 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76
2037 .byte 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0
2038 .byte 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0
2039 .byte 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc
2040 .byte 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15
2041 .byte 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a
2042 .byte 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75
2043 .byte 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0
2044 .byte 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84
2045 .byte 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b
2046 .byte 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf
2047 .byte 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85
2048 .byte 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8
2049 .byte 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5
2050 .byte 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2
2051 .byte 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17
2052 .byte 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73
2053 .byte 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88
2054 .byte 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb
2055 .byte 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c
2056 .byte 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79
2057 .byte 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9
2058 .byte 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08
2059 .byte 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6
2060 .byte 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a
2061 .byte 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e
2062 .byte 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e
2063 .byte 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94
2064 .byte 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf
2065 .byte 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68
2066 .byte 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
2068 .byte 0x01,0x00,0x00,0x00, 0x02,0x00,0x00,0x00 # rcon
2069 .byte 0x04,0x00,0x00,0x00, 0x08,0x00,0x00,0x00
2070 .byte 0x10,0x00,0x00,0x00, 0x20,0x00,0x00,0x00
2071 .byte 0x40,0x00,0x00,0x00, 0x80,0x00,0x00,0x00
2072 .byte 0x1B,0x00,0x00,0x00, 0x36,0x00,0x00,0x00
2075 foreach (split("\n",$code)) {
2076 s/\`([^\`]*)\`/eval $1/ge;
2078 # made-up _instructions, _xtr, _ins, _ror and _bias, cope
2079 # with byte order dependencies...
2081 s/(_[a-z]+\s+)(\$[0-9]+),([^,]+)(#.*)*$/$1$2,$2,$3/;
2083 s/_xtr\s+(\$[0-9]+),(\$[0-9]+),([0-9]+(\-2)*)/
2084 sprintf("srl\t$1,$2,%d",$big_endian ? eval($3)
2085 : eval("24-$3"))/e or
2086 s/_ins\s+(\$[0-9]+),(\$[0-9]+),([0-9]+)/
2087 sprintf("sll\t$1,$2,%d",$big_endian ? eval($3)
2088 : eval("24-$3"))/e or
2089 s/_ins2\s+(\$[0-9]+),(\$[0-9]+),([0-9]+)/
2090 sprintf("ins\t$1,$2,%d,8",$big_endian ? eval($3)
2091 : eval("24-$3"))/e or
2092 s/_ror\s+(\$[0-9]+),(\$[0-9]+),(\-?[0-9]+)/
2093 sprintf("srl\t$1,$2,%d",$big_endian ? eval($3)
2094 : eval("$3*-1"))/e or
2095 s/_bias\s+(\$[0-9]+),(\$[0-9]+),([0-9]+)/
2096 sprintf("sll\t$1,$2,%d",$big_endian ? eval($3)
2097 : eval("($3-16)&31"))/e;
2099 s/srl\s+(\$[0-9]+),(\$[0-9]+),\-([0-9]+)/
2100 sprintf("sll\t$1,$2,$3")/e or
2101 s/srl\s+(\$[0-9]+),(\$[0-9]+),0/
2102 sprintf("and\t$1,$2,0xff")/e or
2103 s/(sll\s+\$[0-9]+,\$[0-9]+,0)/#$1/;
2106 # convert lwl/lwr and swr/swl to little-endian order
2107 if (!$big_endian && /^\s+[sl]w[lr]\s+/) {
2108 s/([sl]wl.*)([0-9]+)\((\$[0-9]+)\)/
2109 sprintf("$1%d($3)",eval("$2-$2%4+($2%4-1)&3"))/e or
2110 s/([sl]wr.*)([0-9]+)\((\$[0-9]+)\)/
2111 sprintf("$1%d($3)",eval("$2-$2%4+($2%4+1)&3"))/e;
2115 s/(rotr\s+\$[0-9]+,\$[0-9]+),([0-9]+)/sprintf("$1,%d",32-$2)/e;
2116 s/(ext\s+\$[0-9]+,\$[0-9]+),([0-9]+),8/sprintf("$1,%d,8",24-$2)/e;