Blame crypto/aes/asm/aes-mips.pl

Packit c4476c
#! /usr/bin/env perl
Packit c4476c
# Copyright 2010-2020 The OpenSSL Project Authors. All Rights Reserved.
Packit c4476c
#
Packit c4476c
# Licensed under the OpenSSL license (the "License").  You may not use
Packit c4476c
# this file except in compliance with the License.  You can obtain a copy
Packit c4476c
# in the file LICENSE in the source distribution or at
Packit c4476c
# https://www.openssl.org/source/license.html
Packit c4476c
Packit c4476c
Packit c4476c
# ====================================================================
Packit c4476c
# Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
Packit c4476c
# project. The module is, however, dual licensed under OpenSSL and
Packit c4476c
# CRYPTOGAMS licenses depending on where you obtain it. For further
Packit c4476c
# details see http://www.openssl.org/~appro/cryptogams/.
Packit c4476c
# ====================================================================
Packit c4476c
Packit c4476c
# AES for MIPS
Packit c4476c
Packit c4476c
# October 2010
Packit c4476c
#
Packit c4476c
# Code uses 1K[+256B] S-box and on single-issue core [such as R5000]
Packit c4476c
# spends ~68 cycles per byte processed with 128-bit key. This is ~16%
Packit c4476c
# faster than gcc-generated code, which is not very impressive. But
Packit c4476c
# recall that compressed S-box requires extra processing, namely
Packit c4476c
# additional rotations. Rotations are implemented with lwl/lwr pairs,
Packit c4476c
# which is normally used for loading unaligned data. Another cool
Packit c4476c
# thing about this module is its endian neutrality, which means that
Packit c4476c
# it processes data without ever changing byte order...
Packit c4476c
Packit c4476c
# September 2012
Packit c4476c
#
Packit c4476c
# Add MIPS32R2 (~10% less instructions) and SmartMIPS ASE (further
Packit c4476c
# ~25% less instructions) code. Note that there is no run-time switch,
Packit c4476c
# instead, code path is chosen upon pre-process time, pass -mips32r2
Packit c4476c
# or/and -msmartmips.
Packit c4476c
Packit c4476c
######################################################################
Packit c4476c
# There is a number of MIPS ABI in use, O32 and N32/64 are most
Packit c4476c
# widely used. Then there is a new contender: NUBI. It appears that if
Packit c4476c
# one picks the latter, it's possible to arrange code in ABI neutral
Packit c4476c
# manner. Therefore let's stick to NUBI register layout:
Packit c4476c
#
Packit c4476c
($zero,$at,$t0,$t1,$t2)=map("\$$_",(0..2,24,25));
Packit c4476c
($a0,$a1,$a2,$a3,$a4,$a5,$a6,$a7)=map("\$$_",(4..11));
Packit c4476c
($s0,$s1,$s2,$s3,$s4,$s5,$s6,$s7,$s8,$s9,$s10,$s11)=map("\$$_",(12..23));
Packit c4476c
($gp,$tp,$sp,$fp,$ra)=map("\$$_",(3,28..31));
Packit c4476c
#
Packit c4476c
# The return value is placed in $a0. Following coding rules facilitate
Packit c4476c
# interoperability:
Packit c4476c
#
Packit c4476c
# - never ever touch $tp, "thread pointer", former $gp;
Packit c4476c
# - copy return value to $t0, former $v0 [or to $a0 if you're adapting
Packit c4476c
#   old code];
Packit c4476c
# - on O32 populate $a4-$a7 with 'lw $aN,4*N($sp)' if necessary;
Packit c4476c
#
Packit c4476c
# For reference here is register layout for N32/64 MIPS ABIs:
Packit c4476c
#
Packit c4476c
# ($zero,$at,$v0,$v1)=map("\$$_",(0..3));
Packit c4476c
# ($a0,$a1,$a2,$a3,$a4,$a5,$a6,$a7)=map("\$$_",(4..11));
Packit c4476c
# ($t0,$t1,$t2,$t3,$t8,$t9)=map("\$$_",(12..15,24,25));
Packit c4476c
# ($s0,$s1,$s2,$s3,$s4,$s5,$s6,$s7)=map("\$$_",(16..23));
Packit c4476c
# ($gp,$sp,$fp,$ra)=map("\$$_",(28..31));
Packit c4476c
#
Packit c4476c
$flavour = shift || "o32"; # supported flavours are o32,n32,64,nubi32,nubi64
Packit c4476c
Packit c4476c
if ($flavour =~ /64|n32/i) {
Packit c4476c
	$PTR_LA="dla";
Packit c4476c
	$PTR_ADD="daddu";	# incidentally works even on n32
Packit c4476c
	$PTR_SUB="dsubu";	# incidentally works even on n32
Packit c4476c
	$PTR_INS="dins";
Packit c4476c
	$REG_S="sd";
Packit c4476c
	$REG_L="ld";
Packit c4476c
	$PTR_SLL="dsll";	# incidentally works even on n32
Packit c4476c
	$SZREG=8;
Packit c4476c
} else {
Packit c4476c
	$PTR_LA="la";
Packit c4476c
	$PTR_ADD="addu";
Packit c4476c
	$PTR_SUB="subu";
Packit c4476c
	$PTR_INS="ins";
Packit c4476c
	$REG_S="sw";
Packit c4476c
	$REG_L="lw";
Packit c4476c
	$PTR_SLL="sll";
Packit c4476c
	$SZREG=4;
Packit c4476c
}
Packit c4476c
$pf = ($flavour =~ /nubi/i) ? $t0 : $t2;
Packit c4476c
#
Packit c4476c
# <appro@openssl.org>
Packit c4476c
#
Packit c4476c
######################################################################
Packit c4476c
Packit c4476c
$big_endian=(`echo MIPSEB | $ENV{CC} -E -`=~/MIPSEB/)?0:1 if ($ENV{CC});
Packit c4476c
Packit c4476c
for (@ARGV) {	$output=$_ if (/\w[\w\-]*\.\w+$/);	}
Packit c4476c
open STDOUT,">$output";
Packit c4476c
Packit c4476c
if (!defined($big_endian))
Packit c4476c
{    $big_endian=(unpack('L',pack('N',1))==1);   }
Packit c4476c
Packit c4476c
while (($output=shift) && ($output!~/\w[\w\-]*\.\w+$/)) {}
Packit c4476c
open STDOUT,">$output";
Packit c4476c
Packit c4476c
my ($MSB,$LSB)=(0,3);	# automatically converted to little-endian
Packit c4476c
Packit c4476c
$code.=<<___;
Packit c4476c
#include "mips_arch.h"
Packit c4476c
Packit c4476c
.text
Packit c4476c
#if !defined(__mips_eabi) && (!defined(__vxworks) || defined(__pic__))
Packit c4476c
.option	pic2
Packit c4476c
#endif
Packit c4476c
.set	noat
Packit c4476c
___
Packit c4476c

Packit c4476c
{{{
Packit c4476c
my $FRAMESIZE=16*$SZREG;
Packit c4476c
my $SAVED_REGS_MASK = ($flavour =~ /nubi/i) ? "0xc0fff008" : "0xc0ff0000";
Packit c4476c
Packit c4476c
my ($inp,$out,$key,$Tbl,$s0,$s1,$s2,$s3)=($a0,$a1,$a2,$a3,$a4,$a5,$a6,$a7);
Packit c4476c
my ($i0,$i1,$i2,$i3)=($at,$t0,$t1,$t2);
Packit c4476c
my ($t0,$t1,$t2,$t3,$t4,$t5,$t6,$t7,$t8,$t9,$t10,$t11) = map("\$$_",(12..23));
Packit c4476c
my ($key0,$cnt)=($gp,$fp);
Packit c4476c
Packit c4476c
# instruction ordering is "stolen" from output from MIPSpro assembler
Packit c4476c
# invoked with -mips3 -O3 arguments...
Packit c4476c
$code.=<<___;
Packit c4476c
.align	5
Packit c4476c
.ent	_mips_AES_encrypt
Packit c4476c
_mips_AES_encrypt:
Packit c4476c
	.frame	$sp,0,$ra
Packit c4476c
	.set	reorder
Packit c4476c
	lw	$t0,0($key)
Packit c4476c
	lw	$t1,4($key)
Packit c4476c
	lw	$t2,8($key)
Packit c4476c
	lw	$t3,12($key)
Packit c4476c
	lw	$cnt,240($key)
Packit c4476c
	$PTR_ADD $key0,$key,16
Packit c4476c
Packit c4476c
	xor	$s0,$t0
Packit c4476c
	xor	$s1,$t1
Packit c4476c
	xor	$s2,$t2
Packit c4476c
	xor	$s3,$t3
Packit c4476c
Packit c4476c
	subu	$cnt,1
Packit c4476c
#if defined(__mips_smartmips)
Packit c4476c
	ext	$i0,$s1,16,8
Packit c4476c
.Loop_enc:
Packit c4476c
	ext	$i1,$s2,16,8
Packit c4476c
	ext	$i2,$s3,16,8
Packit c4476c
	ext	$i3,$s0,16,8
Packit c4476c
	lwxs	$t0,$i0($Tbl)		# Te1[s1>>16]
Packit c4476c
	ext	$i0,$s2,8,8
Packit c4476c
	lwxs	$t1,$i1($Tbl)		# Te1[s2>>16]
Packit c4476c
	ext	$i1,$s3,8,8
Packit c4476c
	lwxs	$t2,$i2($Tbl)		# Te1[s3>>16]
Packit c4476c
	ext	$i2,$s0,8,8
Packit c4476c
	lwxs	$t3,$i3($Tbl)		# Te1[s0>>16]
Packit c4476c
	ext	$i3,$s1,8,8
Packit c4476c
Packit c4476c
	lwxs	$t4,$i0($Tbl)		# Te2[s2>>8]
Packit c4476c
	ext	$i0,$s3,0,8
Packit c4476c
	lwxs	$t5,$i1($Tbl)		# Te2[s3>>8]
Packit c4476c
	ext	$i1,$s0,0,8
Packit c4476c
	lwxs	$t6,$i2($Tbl)		# Te2[s0>>8]
Packit c4476c
	ext	$i2,$s1,0,8
Packit c4476c
	lwxs	$t7,$i3($Tbl)		# Te2[s1>>8]
Packit c4476c
	ext	$i3,$s2,0,8
Packit c4476c
Packit c4476c
	lwxs	$t8,$i0($Tbl)		# Te3[s3]
Packit c4476c
	ext	$i0,$s0,24,8
Packit c4476c
	lwxs	$t9,$i1($Tbl)		# Te3[s0]
Packit c4476c
	ext	$i1,$s1,24,8
Packit c4476c
	lwxs	$t10,$i2($Tbl)		# Te3[s1]
Packit c4476c
	ext	$i2,$s2,24,8
Packit c4476c
	lwxs	$t11,$i3($Tbl)		# Te3[s2]
Packit c4476c
	ext	$i3,$s3,24,8
Packit c4476c
Packit c4476c
	rotr	$t0,$t0,8
Packit c4476c
	rotr	$t1,$t1,8
Packit c4476c
	rotr	$t2,$t2,8
Packit c4476c
	rotr	$t3,$t3,8
Packit c4476c
Packit c4476c
	rotr	$t4,$t4,16
Packit c4476c
	rotr	$t5,$t5,16
Packit c4476c
	rotr	$t6,$t6,16
Packit c4476c
	rotr	$t7,$t7,16
Packit c4476c
Packit c4476c
	xor	$t0,$t4
Packit c4476c
	lwxs	$t4,$i0($Tbl)		# Te0[s0>>24]
Packit c4476c
	xor	$t1,$t5
Packit c4476c
	lwxs	$t5,$i1($Tbl)		# Te0[s1>>24]
Packit c4476c
	xor	$t2,$t6
Packit c4476c
	lwxs	$t6,$i2($Tbl)		# Te0[s2>>24]
Packit c4476c
	xor	$t3,$t7
Packit c4476c
	lwxs	$t7,$i3($Tbl)		# Te0[s3>>24]
Packit c4476c
Packit c4476c
	rotr	$t8,$t8,24
Packit c4476c
	lw	$s0,0($key0)
Packit c4476c
	rotr	$t9,$t9,24
Packit c4476c
	lw	$s1,4($key0)
Packit c4476c
	rotr	$t10,$t10,24
Packit c4476c
	lw	$s2,8($key0)
Packit c4476c
	rotr	$t11,$t11,24
Packit c4476c
	lw	$s3,12($key0)
Packit c4476c
Packit c4476c
	xor	$t0,$t8
Packit c4476c
	xor	$t1,$t9
Packit c4476c
	xor	$t2,$t10
Packit c4476c
	xor	$t3,$t11
Packit c4476c
Packit c4476c
	xor	$t0,$t4
Packit c4476c
	xor	$t1,$t5
Packit c4476c
	xor	$t2,$t6
Packit c4476c
	xor	$t3,$t7
Packit c4476c
Packit c4476c
	subu	$cnt,1
Packit c4476c
	$PTR_ADD $key0,16
Packit c4476c
	xor	$s0,$t0
Packit c4476c
	xor	$s1,$t1
Packit c4476c
	xor	$s2,$t2
Packit c4476c
	xor	$s3,$t3
Packit c4476c
	.set	noreorder
Packit c4476c
	bnez	$cnt,.Loop_enc
Packit c4476c
	ext	$i0,$s1,16,8
Packit c4476c
Packit c4476c
	_xtr	$i0,$s1,16-2
Packit c4476c
#else
Packit c4476c
	_xtr	$i0,$s1,16-2
Packit c4476c
.Loop_enc:
Packit c4476c
	_xtr	$i1,$s2,16-2
Packit c4476c
	_xtr	$i2,$s3,16-2
Packit c4476c
	_xtr	$i3,$s0,16-2
Packit c4476c
	and	$i0,0x3fc
Packit c4476c
	and	$i1,0x3fc
Packit c4476c
	and	$i2,0x3fc
Packit c4476c
	and	$i3,0x3fc
Packit c4476c
	$PTR_ADD $i0,$Tbl
Packit c4476c
	$PTR_ADD $i1,$Tbl
Packit c4476c
	$PTR_ADD $i2,$Tbl
Packit c4476c
	$PTR_ADD $i3,$Tbl
Packit c4476c
#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
Packit c4476c
	lw	$t0,0($i0)		# Te1[s1>>16]
Packit c4476c
	_xtr	$i0,$s2,8-2
Packit c4476c
	lw	$t1,0($i1)		# Te1[s2>>16]
Packit c4476c
	_xtr	$i1,$s3,8-2
Packit c4476c
	lw	$t2,0($i2)		# Te1[s3>>16]
Packit c4476c
	_xtr	$i2,$s0,8-2
Packit c4476c
	lw	$t3,0($i3)		# Te1[s0>>16]
Packit c4476c
	_xtr	$i3,$s1,8-2
Packit c4476c
#else
Packit c4476c
	lwl	$t0,3($i0)		# Te1[s1>>16]
Packit c4476c
	lwl	$t1,3($i1)		# Te1[s2>>16]
Packit c4476c
	lwl	$t2,3($i2)		# Te1[s3>>16]
Packit c4476c
	lwl	$t3,3($i3)		# Te1[s0>>16]
Packit c4476c
	lwr	$t0,2($i0)		# Te1[s1>>16]
Packit c4476c
	_xtr	$i0,$s2,8-2
Packit c4476c
	lwr	$t1,2($i1)		# Te1[s2>>16]
Packit c4476c
	_xtr	$i1,$s3,8-2
Packit c4476c
	lwr	$t2,2($i2)		# Te1[s3>>16]
Packit c4476c
	_xtr	$i2,$s0,8-2
Packit c4476c
	lwr	$t3,2($i3)		# Te1[s0>>16]
Packit c4476c
	_xtr	$i3,$s1,8-2
Packit c4476c
#endif
Packit c4476c
	and	$i0,0x3fc
Packit c4476c
	and	$i1,0x3fc
Packit c4476c
	and	$i2,0x3fc
Packit c4476c
	and	$i3,0x3fc
Packit c4476c
	$PTR_ADD $i0,$Tbl
Packit c4476c
	$PTR_ADD $i1,$Tbl
Packit c4476c
	$PTR_ADD $i2,$Tbl
Packit c4476c
	$PTR_ADD $i3,$Tbl
Packit c4476c
#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
Packit c4476c
	rotr	$t0,$t0,8
Packit c4476c
	rotr	$t1,$t1,8
Packit c4476c
	rotr	$t2,$t2,8
Packit c4476c
	rotr	$t3,$t3,8
Packit c4476c
# if defined(_MIPSEL)
Packit c4476c
	lw	$t4,0($i0)		# Te2[s2>>8]
Packit c4476c
	_xtr	$i0,$s3,0-2
Packit c4476c
	lw	$t5,0($i1)		# Te2[s3>>8]
Packit c4476c
	_xtr	$i1,$s0,0-2
Packit c4476c
	lw	$t6,0($i2)		# Te2[s0>>8]
Packit c4476c
	_xtr	$i2,$s1,0-2
Packit c4476c
	lw	$t7,0($i3)		# Te2[s1>>8]
Packit c4476c
	_xtr	$i3,$s2,0-2
Packit c4476c
Packit c4476c
	and	$i0,0x3fc
Packit c4476c
	and	$i1,0x3fc
Packit c4476c
	and	$i2,0x3fc
Packit c4476c
	and	$i3,0x3fc
Packit c4476c
	$PTR_ADD $i0,$Tbl
Packit c4476c
	$PTR_ADD $i1,$Tbl
Packit c4476c
	$PTR_ADD $i2,$Tbl
Packit c4476c
	$PTR_ADD $i3,$Tbl
Packit c4476c
	lw	$t8,0($i0)		# Te3[s3]
Packit c4476c
	$PTR_INS $i0,$s0,2,8
Packit c4476c
	lw	$t9,0($i1)		# Te3[s0]
Packit c4476c
	$PTR_INS $i1,$s1,2,8
Packit c4476c
	lw	$t10,0($i2)		# Te3[s1]
Packit c4476c
	$PTR_INS $i2,$s2,2,8
Packit c4476c
	lw	$t11,0($i3)		# Te3[s2]
Packit c4476c
	$PTR_INS $i3,$s3,2,8
Packit c4476c
# else
Packit c4476c
	lw	$t4,0($i0)		# Te2[s2>>8]
Packit c4476c
	$PTR_INS $i0,$s3,2,8
Packit c4476c
	lw	$t5,0($i1)		# Te2[s3>>8]
Packit c4476c
	$PTR_INS $i1,$s0,2,8
Packit c4476c
	lw	$t6,0($i2)		# Te2[s0>>8]
Packit c4476c
	$PTR_INS $i2,$s1,2,8
Packit c4476c
	lw	$t7,0($i3)		# Te2[s1>>8]
Packit c4476c
	$PTR_INS $i3,$s2,2,8
Packit c4476c
Packit c4476c
	lw	$t8,0($i0)		# Te3[s3]
Packit c4476c
	_xtr	$i0,$s0,24-2
Packit c4476c
	lw	$t9,0($i1)		# Te3[s0]
Packit c4476c
	_xtr	$i1,$s1,24-2
Packit c4476c
	lw	$t10,0($i2)		# Te3[s1]
Packit c4476c
	_xtr	$i2,$s2,24-2
Packit c4476c
	lw	$t11,0($i3)		# Te3[s2]
Packit c4476c
	_xtr	$i3,$s3,24-2
Packit c4476c
Packit c4476c
	and	$i0,0x3fc
Packit c4476c
	and	$i1,0x3fc
Packit c4476c
	and	$i2,0x3fc
Packit c4476c
	and	$i3,0x3fc
Packit c4476c
	$PTR_ADD $i0,$Tbl
Packit c4476c
	$PTR_ADD $i1,$Tbl
Packit c4476c
	$PTR_ADD $i2,$Tbl
Packit c4476c
	$PTR_ADD $i3,$Tbl
Packit c4476c
# endif
Packit c4476c
	rotr	$t4,$t4,16
Packit c4476c
	rotr	$t5,$t5,16
Packit c4476c
	rotr	$t6,$t6,16
Packit c4476c
	rotr	$t7,$t7,16
Packit c4476c
Packit c4476c
	rotr	$t8,$t8,24
Packit c4476c
	rotr	$t9,$t9,24
Packit c4476c
	rotr	$t10,$t10,24
Packit c4476c
	rotr	$t11,$t11,24
Packit c4476c
#else
Packit c4476c
	lwl	$t4,2($i0)		# Te2[s2>>8]
Packit c4476c
	lwl	$t5,2($i1)		# Te2[s3>>8]
Packit c4476c
	lwl	$t6,2($i2)		# Te2[s0>>8]
Packit c4476c
	lwl	$t7,2($i3)		# Te2[s1>>8]
Packit c4476c
	lwr	$t4,1($i0)		# Te2[s2>>8]
Packit c4476c
	_xtr	$i0,$s3,0-2
Packit c4476c
	lwr	$t5,1($i1)		# Te2[s3>>8]
Packit c4476c
	_xtr	$i1,$s0,0-2
Packit c4476c
	lwr	$t6,1($i2)		# Te2[s0>>8]
Packit c4476c
	_xtr	$i2,$s1,0-2
Packit c4476c
	lwr	$t7,1($i3)		# Te2[s1>>8]
Packit c4476c
	_xtr	$i3,$s2,0-2
Packit c4476c
Packit c4476c
	and	$i0,0x3fc
Packit c4476c
	and	$i1,0x3fc
Packit c4476c
	and	$i2,0x3fc
Packit c4476c
	and	$i3,0x3fc
Packit c4476c
	$PTR_ADD $i0,$Tbl
Packit c4476c
	$PTR_ADD $i1,$Tbl
Packit c4476c
	$PTR_ADD $i2,$Tbl
Packit c4476c
	$PTR_ADD $i3,$Tbl
Packit c4476c
	lwl	$t8,1($i0)		# Te3[s3]
Packit c4476c
	lwl	$t9,1($i1)		# Te3[s0]
Packit c4476c
	lwl	$t10,1($i2)		# Te3[s1]
Packit c4476c
	lwl	$t11,1($i3)		# Te3[s2]
Packit c4476c
	lwr	$t8,0($i0)		# Te3[s3]
Packit c4476c
	_xtr	$i0,$s0,24-2
Packit c4476c
	lwr	$t9,0($i1)		# Te3[s0]
Packit c4476c
	_xtr	$i1,$s1,24-2
Packit c4476c
	lwr	$t10,0($i2)		# Te3[s1]
Packit c4476c
	_xtr	$i2,$s2,24-2
Packit c4476c
	lwr	$t11,0($i3)		# Te3[s2]
Packit c4476c
	_xtr	$i3,$s3,24-2
Packit c4476c
Packit c4476c
	and	$i0,0x3fc
Packit c4476c
	and	$i1,0x3fc
Packit c4476c
	and	$i2,0x3fc
Packit c4476c
	and	$i3,0x3fc
Packit c4476c
	$PTR_ADD $i0,$Tbl
Packit c4476c
	$PTR_ADD $i1,$Tbl
Packit c4476c
	$PTR_ADD $i2,$Tbl
Packit c4476c
	$PTR_ADD $i3,$Tbl
Packit c4476c
#endif
Packit c4476c
	xor	$t0,$t4
Packit c4476c
	lw	$t4,0($i0)		# Te0[s0>>24]
Packit c4476c
	xor	$t1,$t5
Packit c4476c
	lw	$t5,0($i1)		# Te0[s1>>24]
Packit c4476c
	xor	$t2,$t6
Packit c4476c
	lw	$t6,0($i2)		# Te0[s2>>24]
Packit c4476c
	xor	$t3,$t7
Packit c4476c
	lw	$t7,0($i3)		# Te0[s3>>24]
Packit c4476c
Packit c4476c
	xor	$t0,$t8
Packit c4476c
	lw	$s0,0($key0)
Packit c4476c
	xor	$t1,$t9
Packit c4476c
	lw	$s1,4($key0)
Packit c4476c
	xor	$t2,$t10
Packit c4476c
	lw	$s2,8($key0)
Packit c4476c
	xor	$t3,$t11
Packit c4476c
	lw	$s3,12($key0)
Packit c4476c
Packit c4476c
	xor	$t0,$t4
Packit c4476c
	xor	$t1,$t5
Packit c4476c
	xor	$t2,$t6
Packit c4476c
	xor	$t3,$t7
Packit c4476c
Packit c4476c
	subu	$cnt,1
Packit c4476c
	$PTR_ADD $key0,16
Packit c4476c
	xor	$s0,$t0
Packit c4476c
	xor	$s1,$t1
Packit c4476c
	xor	$s2,$t2
Packit c4476c
	xor	$s3,$t3
Packit c4476c
	.set	noreorder
Packit c4476c
	bnez	$cnt,.Loop_enc
Packit c4476c
	_xtr	$i0,$s1,16-2
Packit c4476c
#endif
Packit c4476c
Packit c4476c
	.set	reorder
Packit c4476c
	_xtr	$i1,$s2,16-2
Packit c4476c
	_xtr	$i2,$s3,16-2
Packit c4476c
	_xtr	$i3,$s0,16-2
Packit c4476c
	and	$i0,0x3fc
Packit c4476c
	and	$i1,0x3fc
Packit c4476c
	and	$i2,0x3fc
Packit c4476c
	and	$i3,0x3fc
Packit c4476c
	$PTR_ADD $i0,$Tbl
Packit c4476c
	$PTR_ADD $i1,$Tbl
Packit c4476c
	$PTR_ADD $i2,$Tbl
Packit c4476c
	$PTR_ADD $i3,$Tbl
Packit c4476c
	lbu	$t0,2($i0)		# Te4[s1>>16]
Packit c4476c
	_xtr	$i0,$s2,8-2
Packit c4476c
	lbu	$t1,2($i1)		# Te4[s2>>16]
Packit c4476c
	_xtr	$i1,$s3,8-2
Packit c4476c
	lbu	$t2,2($i2)		# Te4[s3>>16]
Packit c4476c
	_xtr	$i2,$s0,8-2
Packit c4476c
	lbu	$t3,2($i3)		# Te4[s0>>16]
Packit c4476c
	_xtr	$i3,$s1,8-2
Packit c4476c
Packit c4476c
	and	$i0,0x3fc
Packit c4476c
	and	$i1,0x3fc
Packit c4476c
	and	$i2,0x3fc
Packit c4476c
	and	$i3,0x3fc
Packit c4476c
	$PTR_ADD $i0,$Tbl
Packit c4476c
	$PTR_ADD $i1,$Tbl
Packit c4476c
	$PTR_ADD $i2,$Tbl
Packit c4476c
	$PTR_ADD $i3,$Tbl
Packit c4476c
#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
Packit c4476c
# if defined(_MIPSEL)
Packit c4476c
	lbu	$t4,2($i0)		# Te4[s2>>8]
Packit c4476c
	$PTR_INS $i0,$s0,2,8
Packit c4476c
	lbu	$t5,2($i1)		# Te4[s3>>8]
Packit c4476c
	$PTR_INS $i1,$s1,2,8
Packit c4476c
	lbu	$t6,2($i2)		# Te4[s0>>8]
Packit c4476c
	$PTR_INS $i2,$s2,2,8
Packit c4476c
	lbu	$t7,2($i3)		# Te4[s1>>8]
Packit c4476c
	$PTR_INS $i3,$s3,2,8
Packit c4476c
Packit c4476c
	lbu	$t8,2($i0)		# Te4[s0>>24]
Packit c4476c
	_xtr	$i0,$s3,0-2
Packit c4476c
	lbu	$t9,2($i1)		# Te4[s1>>24]
Packit c4476c
	_xtr	$i1,$s0,0-2
Packit c4476c
	lbu	$t10,2($i2)		# Te4[s2>>24]
Packit c4476c
	_xtr	$i2,$s1,0-2
Packit c4476c
	lbu	$t11,2($i3)		# Te4[s3>>24]
Packit c4476c
	_xtr	$i3,$s2,0-2
Packit c4476c
Packit c4476c
	and	$i0,0x3fc
Packit c4476c
	and	$i1,0x3fc
Packit c4476c
	and	$i2,0x3fc
Packit c4476c
	and	$i3,0x3fc
Packit c4476c
	$PTR_ADD $i0,$Tbl
Packit c4476c
	$PTR_ADD $i1,$Tbl
Packit c4476c
	$PTR_ADD $i2,$Tbl
Packit c4476c
	$PTR_ADD $i3,$Tbl
Packit c4476c
# else
Packit c4476c
	lbu	$t4,2($i0)		# Te4[s2>>8]
Packit c4476c
	_xtr	$i0,$s0,24-2
Packit c4476c
	lbu	$t5,2($i1)		# Te4[s3>>8]
Packit c4476c
	_xtr	$i1,$s1,24-2
Packit c4476c
	lbu	$t6,2($i2)		# Te4[s0>>8]
Packit c4476c
	_xtr	$i2,$s2,24-2
Packit c4476c
	lbu	$t7,2($i3)		# Te4[s1>>8]
Packit c4476c
	_xtr	$i3,$s3,24-2
Packit c4476c
Packit c4476c
	and	$i0,0x3fc
Packit c4476c
	and	$i1,0x3fc
Packit c4476c
	and	$i2,0x3fc
Packit c4476c
	and	$i3,0x3fc
Packit c4476c
	$PTR_ADD $i0,$Tbl
Packit c4476c
	$PTR_ADD $i1,$Tbl
Packit c4476c
	$PTR_ADD $i2,$Tbl
Packit c4476c
	$PTR_ADD $i3,$Tbl
Packit c4476c
	lbu	$t8,2($i0)		# Te4[s0>>24]
Packit c4476c
	$PTR_INS $i0,$s3,2,8
Packit c4476c
	lbu	$t9,2($i1)		# Te4[s1>>24]
Packit c4476c
	$PTR_INS $i1,$s0,2,8
Packit c4476c
	lbu	$t10,2($i2)		# Te4[s2>>24]
Packit c4476c
	$PTR_INS $i2,$s1,2,8
Packit c4476c
	lbu	$t11,2($i3)		# Te4[s3>>24]
Packit c4476c
	$PTR_INS $i3,$s2,2,8
Packit c4476c
# endif
Packit c4476c
	_ins	$t0,16
Packit c4476c
	_ins	$t1,16
Packit c4476c
	_ins	$t2,16
Packit c4476c
	_ins	$t3,16
Packit c4476c
Packit c4476c
	_ins2	$t0,$t4,8
Packit c4476c
	lbu	$t4,2($i0)		# Te4[s3]
Packit c4476c
	_ins2	$t1,$t5,8
Packit c4476c
	lbu	$t5,2($i1)		# Te4[s0]
Packit c4476c
	_ins2	$t2,$t6,8
Packit c4476c
	lbu	$t6,2($i2)		# Te4[s1]
Packit c4476c
	_ins2	$t3,$t7,8
Packit c4476c
	lbu	$t7,2($i3)		# Te4[s2]
Packit c4476c
Packit c4476c
	_ins2	$t0,$t8,24
Packit c4476c
	lw	$s0,0($key0)
Packit c4476c
	_ins2	$t1,$t9,24
Packit c4476c
	lw	$s1,4($key0)
Packit c4476c
	_ins2	$t2,$t10,24
Packit c4476c
	lw	$s2,8($key0)
Packit c4476c
	_ins2	$t3,$t11,24
Packit c4476c
	lw	$s3,12($key0)
Packit c4476c
Packit c4476c
	_ins2	$t0,$t4,0
Packit c4476c
	_ins2	$t1,$t5,0
Packit c4476c
	_ins2	$t2,$t6,0
Packit c4476c
	_ins2	$t3,$t7,0
Packit c4476c
#else
Packit c4476c
	lbu	$t4,2($i0)		# Te4[s2>>8]
Packit c4476c
	_xtr	$i0,$s0,24-2
Packit c4476c
	lbu	$t5,2($i1)		# Te4[s3>>8]
Packit c4476c
	_xtr	$i1,$s1,24-2
Packit c4476c
	lbu	$t6,2($i2)		# Te4[s0>>8]
Packit c4476c
	_xtr	$i2,$s2,24-2
Packit c4476c
	lbu	$t7,2($i3)		# Te4[s1>>8]
Packit c4476c
	_xtr	$i3,$s3,24-2
Packit c4476c
Packit c4476c
	and	$i0,0x3fc
Packit c4476c
	and	$i1,0x3fc
Packit c4476c
	and	$i2,0x3fc
Packit c4476c
	and	$i3,0x3fc
Packit c4476c
	$PTR_ADD $i0,$Tbl
Packit c4476c
	$PTR_ADD $i1,$Tbl
Packit c4476c
	$PTR_ADD $i2,$Tbl
Packit c4476c
	$PTR_ADD $i3,$Tbl
Packit c4476c
	lbu	$t8,2($i0)		# Te4[s0>>24]
Packit c4476c
	_xtr	$i0,$s3,0-2
Packit c4476c
	lbu	$t9,2($i1)		# Te4[s1>>24]
Packit c4476c
	_xtr	$i1,$s0,0-2
Packit c4476c
	lbu	$t10,2($i2)		# Te4[s2>>24]
Packit c4476c
	_xtr	$i2,$s1,0-2
Packit c4476c
	lbu	$t11,2($i3)		# Te4[s3>>24]
Packit c4476c
	_xtr	$i3,$s2,0-2
Packit c4476c
Packit c4476c
	and	$i0,0x3fc
Packit c4476c
	and	$i1,0x3fc
Packit c4476c
	and	$i2,0x3fc
Packit c4476c
	and	$i3,0x3fc
Packit c4476c
	$PTR_ADD $i0,$Tbl
Packit c4476c
	$PTR_ADD $i1,$Tbl
Packit c4476c
	$PTR_ADD $i2,$Tbl
Packit c4476c
	$PTR_ADD $i3,$Tbl
Packit c4476c
Packit c4476c
	_ins	$t0,16
Packit c4476c
	_ins	$t1,16
Packit c4476c
	_ins	$t2,16
Packit c4476c
	_ins	$t3,16
Packit c4476c
Packit c4476c
	_ins	$t4,8
Packit c4476c
	_ins	$t5,8
Packit c4476c
	_ins	$t6,8
Packit c4476c
	_ins	$t7,8
Packit c4476c
Packit c4476c
	xor	$t0,$t4
Packit c4476c
	lbu	$t4,2($i0)		# Te4[s3]
Packit c4476c
	xor	$t1,$t5
Packit c4476c
	lbu	$t5,2($i1)		# Te4[s0]
Packit c4476c
	xor	$t2,$t6
Packit c4476c
	lbu	$t6,2($i2)		# Te4[s1]
Packit c4476c
	xor	$t3,$t7
Packit c4476c
	lbu	$t7,2($i3)		# Te4[s2]
Packit c4476c
Packit c4476c
	_ins	$t8,24
Packit c4476c
	lw	$s0,0($key0)
Packit c4476c
	_ins	$t9,24
Packit c4476c
	lw	$s1,4($key0)
Packit c4476c
	_ins	$t10,24
Packit c4476c
	lw	$s2,8($key0)
Packit c4476c
	_ins	$t11,24
Packit c4476c
	lw	$s3,12($key0)
Packit c4476c
Packit c4476c
	xor	$t0,$t8
Packit c4476c
	xor	$t1,$t9
Packit c4476c
	xor	$t2,$t10
Packit c4476c
	xor	$t3,$t11
Packit c4476c
Packit c4476c
	_ins	$t4,0
Packit c4476c
	_ins	$t5,0
Packit c4476c
	_ins	$t6,0
Packit c4476c
	_ins	$t7,0
Packit c4476c
Packit c4476c
	xor	$t0,$t4
Packit c4476c
	xor	$t1,$t5
Packit c4476c
	xor	$t2,$t6
Packit c4476c
	xor	$t3,$t7
Packit c4476c
#endif
Packit c4476c
	xor	$s0,$t0
Packit c4476c
	xor	$s1,$t1
Packit c4476c
	xor	$s2,$t2
Packit c4476c
	xor	$s3,$t3
Packit c4476c
Packit c4476c
	jr	$ra
Packit c4476c
.end	_mips_AES_encrypt
Packit c4476c
Packit c4476c
.align	5
Packit c4476c
.globl	AES_encrypt
Packit c4476c
.ent	AES_encrypt
Packit c4476c
AES_encrypt:
Packit c4476c
	.frame	$sp,$FRAMESIZE,$ra
Packit c4476c
	.mask	$SAVED_REGS_MASK,-$SZREG
Packit c4476c
	.set	noreorder
Packit c4476c
___
Packit c4476c
$code.=<<___ if ($flavour =~ /o32/i);	# o32 PIC-ification
Packit c4476c
	.cpload	$pf
Packit c4476c
___
Packit c4476c
$code.=<<___;
Packit c4476c
	$PTR_SUB $sp,$FRAMESIZE
Packit c4476c
	$REG_S	$ra,$FRAMESIZE-1*$SZREG($sp)
Packit c4476c
	$REG_S	$fp,$FRAMESIZE-2*$SZREG($sp)
Packit c4476c
	$REG_S	$s11,$FRAMESIZE-3*$SZREG($sp)
Packit c4476c
	$REG_S	$s10,$FRAMESIZE-4*$SZREG($sp)
Packit c4476c
	$REG_S	$s9,$FRAMESIZE-5*$SZREG($sp)
Packit c4476c
	$REG_S	$s8,$FRAMESIZE-6*$SZREG($sp)
Packit c4476c
	$REG_S	$s7,$FRAMESIZE-7*$SZREG($sp)
Packit c4476c
	$REG_S	$s6,$FRAMESIZE-8*$SZREG($sp)
Packit c4476c
	$REG_S	$s5,$FRAMESIZE-9*$SZREG($sp)
Packit c4476c
	$REG_S	$s4,$FRAMESIZE-10*$SZREG($sp)
Packit c4476c
___
Packit c4476c
$code.=<<___ if ($flavour =~ /nubi/i);	# optimize non-nubi prologue
Packit c4476c
	$REG_S	\$15,$FRAMESIZE-11*$SZREG($sp)
Packit c4476c
	$REG_S	\$14,$FRAMESIZE-12*$SZREG($sp)
Packit c4476c
	$REG_S	\$13,$FRAMESIZE-13*$SZREG($sp)
Packit c4476c
	$REG_S	\$12,$FRAMESIZE-14*$SZREG($sp)
Packit c4476c
	$REG_S	$gp,$FRAMESIZE-15*$SZREG($sp)
Packit c4476c
___
Packit c4476c
$code.=<<___ if ($flavour !~ /o32/i);	# non-o32 PIC-ification
Packit c4476c
	.cplocal	$Tbl
Packit c4476c
	.cpsetup	$pf,$zero,AES_encrypt
Packit c4476c
___
Packit c4476c
$code.=<<___;
Packit c4476c
	.set	reorder
Packit c4476c
	$PTR_LA	$Tbl,AES_Te		# PIC-ified 'load address'
Packit c4476c
Packit c4476c
#if defined(_MIPS_ARCH_MIPS32R6) || defined(_MIPS_ARCH_MIPS64R6)
Packit c4476c
	lw	$s0,0($inp)
Packit c4476c
	lw	$s1,4($inp)
Packit c4476c
	lw	$s2,8($inp)
Packit c4476c
	lw	$s3,12($inp)
Packit c4476c
#else
Packit c4476c
	lwl	$s0,0+$MSB($inp)
Packit c4476c
	lwl	$s1,4+$MSB($inp)
Packit c4476c
	lwl	$s2,8+$MSB($inp)
Packit c4476c
	lwl	$s3,12+$MSB($inp)
Packit c4476c
	lwr	$s0,0+$LSB($inp)
Packit c4476c
	lwr	$s1,4+$LSB($inp)
Packit c4476c
	lwr	$s2,8+$LSB($inp)
Packit c4476c
	lwr	$s3,12+$LSB($inp)
Packit c4476c
#endif
Packit c4476c
Packit c4476c
	bal	_mips_AES_encrypt
Packit c4476c
Packit c4476c
#if defined(_MIPS_ARCH_MIPS32R6) || defined(_MIPS_ARCH_MIPS64R6)
Packit c4476c
	sw	$s0,0($out)
Packit c4476c
	sw	$s1,4($out)
Packit c4476c
	sw	$s2,8($out)
Packit c4476c
	sw	$s3,12($out)
Packit c4476c
#else
Packit c4476c
	swr	$s0,0+$LSB($out)
Packit c4476c
	swr	$s1,4+$LSB($out)
Packit c4476c
	swr	$s2,8+$LSB($out)
Packit c4476c
	swr	$s3,12+$LSB($out)
Packit c4476c
	swl	$s0,0+$MSB($out)
Packit c4476c
	swl	$s1,4+$MSB($out)
Packit c4476c
	swl	$s2,8+$MSB($out)
Packit c4476c
	swl	$s3,12+$MSB($out)
Packit c4476c
#endif
Packit c4476c
Packit c4476c
	.set	noreorder
Packit c4476c
	$REG_L	$ra,$FRAMESIZE-1*$SZREG($sp)
Packit c4476c
	$REG_L	$fp,$FRAMESIZE-2*$SZREG($sp)
Packit c4476c
	$REG_L	$s11,$FRAMESIZE-3*$SZREG($sp)
Packit c4476c
	$REG_L	$s10,$FRAMESIZE-4*$SZREG($sp)
Packit c4476c
	$REG_L	$s9,$FRAMESIZE-5*$SZREG($sp)
Packit c4476c
	$REG_L	$s8,$FRAMESIZE-6*$SZREG($sp)
Packit c4476c
	$REG_L	$s7,$FRAMESIZE-7*$SZREG($sp)
Packit c4476c
	$REG_L	$s6,$FRAMESIZE-8*$SZREG($sp)
Packit c4476c
	$REG_L	$s5,$FRAMESIZE-9*$SZREG($sp)
Packit c4476c
	$REG_L	$s4,$FRAMESIZE-10*$SZREG($sp)
Packit c4476c
___
Packit c4476c
$code.=<<___ if ($flavour =~ /nubi/i);
Packit c4476c
	$REG_L	\$15,$FRAMESIZE-11*$SZREG($sp)
Packit c4476c
	$REG_L	\$14,$FRAMESIZE-12*$SZREG($sp)
Packit c4476c
	$REG_L	\$13,$FRAMESIZE-13*$SZREG($sp)
Packit c4476c
	$REG_L	\$12,$FRAMESIZE-14*$SZREG($sp)
Packit c4476c
	$REG_L	$gp,$FRAMESIZE-15*$SZREG($sp)
Packit c4476c
___
Packit c4476c
$code.=<<___;
Packit c4476c
	jr	$ra
Packit c4476c
	$PTR_ADD $sp,$FRAMESIZE
Packit c4476c
.end	AES_encrypt
Packit c4476c
___
Packit c4476c

Packit c4476c
$code.=<<___;
Packit c4476c
.align	5
Packit c4476c
.ent	_mips_AES_decrypt
Packit c4476c
_mips_AES_decrypt:
Packit c4476c
	.frame	$sp,0,$ra
Packit c4476c
	.set	reorder
Packit c4476c
	lw	$t0,0($key)
Packit c4476c
	lw	$t1,4($key)
Packit c4476c
	lw	$t2,8($key)
Packit c4476c
	lw	$t3,12($key)
Packit c4476c
	lw	$cnt,240($key)
Packit c4476c
	$PTR_ADD $key0,$key,16
Packit c4476c
Packit c4476c
	xor	$s0,$t0
Packit c4476c
	xor	$s1,$t1
Packit c4476c
	xor	$s2,$t2
Packit c4476c
	xor	$s3,$t3
Packit c4476c
Packit c4476c
	subu	$cnt,1
Packit c4476c
#if defined(__mips_smartmips)
Packit c4476c
	ext	$i0,$s3,16,8
Packit c4476c
.Loop_dec:
Packit c4476c
	ext	$i1,$s0,16,8
Packit c4476c
	ext	$i2,$s1,16,8
Packit c4476c
	ext	$i3,$s2,16,8
Packit c4476c
	lwxs	$t0,$i0($Tbl)		# Td1[s3>>16]
Packit c4476c
	ext	$i0,$s2,8,8
Packit c4476c
	lwxs	$t1,$i1($Tbl)		# Td1[s0>>16]
Packit c4476c
	ext	$i1,$s3,8,8
Packit c4476c
	lwxs	$t2,$i2($Tbl)		# Td1[s1>>16]
Packit c4476c
	ext	$i2,$s0,8,8
Packit c4476c
	lwxs	$t3,$i3($Tbl)		# Td1[s2>>16]
Packit c4476c
	ext	$i3,$s1,8,8
Packit c4476c
Packit c4476c
	lwxs	$t4,$i0($Tbl)		# Td2[s2>>8]
Packit c4476c
	ext	$i0,$s1,0,8
Packit c4476c
	lwxs	$t5,$i1($Tbl)		# Td2[s3>>8]
Packit c4476c
	ext	$i1,$s2,0,8
Packit c4476c
	lwxs	$t6,$i2($Tbl)		# Td2[s0>>8]
Packit c4476c
	ext	$i2,$s3,0,8
Packit c4476c
	lwxs	$t7,$i3($Tbl)		# Td2[s1>>8]
Packit c4476c
	ext	$i3,$s0,0,8
Packit c4476c
Packit c4476c
	lwxs	$t8,$i0($Tbl)		# Td3[s1]
Packit c4476c
	ext	$i0,$s0,24,8
Packit c4476c
	lwxs	$t9,$i1($Tbl)		# Td3[s2]
Packit c4476c
	ext	$i1,$s1,24,8
Packit c4476c
	lwxs	$t10,$i2($Tbl)		# Td3[s3]
Packit c4476c
	ext	$i2,$s2,24,8
Packit c4476c
	lwxs	$t11,$i3($Tbl)		# Td3[s0]
Packit c4476c
	ext	$i3,$s3,24,8
Packit c4476c
Packit c4476c
	rotr	$t0,$t0,8
Packit c4476c
	rotr	$t1,$t1,8
Packit c4476c
	rotr	$t2,$t2,8
Packit c4476c
	rotr	$t3,$t3,8
Packit c4476c
Packit c4476c
	rotr	$t4,$t4,16
Packit c4476c
	rotr	$t5,$t5,16
Packit c4476c
	rotr	$t6,$t6,16
Packit c4476c
	rotr	$t7,$t7,16
Packit c4476c
Packit c4476c
	xor	$t0,$t4
Packit c4476c
	lwxs	$t4,$i0($Tbl)		# Td0[s0>>24]
Packit c4476c
	xor	$t1,$t5
Packit c4476c
	lwxs	$t5,$i1($Tbl)		# Td0[s1>>24]
Packit c4476c
	xor	$t2,$t6
Packit c4476c
	lwxs	$t6,$i2($Tbl)		# Td0[s2>>24]
Packit c4476c
	xor	$t3,$t7
Packit c4476c
	lwxs	$t7,$i3($Tbl)		# Td0[s3>>24]
Packit c4476c
Packit c4476c
	rotr	$t8,$t8,24
Packit c4476c
	lw	$s0,0($key0)
Packit c4476c
	rotr	$t9,$t9,24
Packit c4476c
	lw	$s1,4($key0)
Packit c4476c
	rotr	$t10,$t10,24
Packit c4476c
	lw	$s2,8($key0)
Packit c4476c
	rotr	$t11,$t11,24
Packit c4476c
	lw	$s3,12($key0)
Packit c4476c
Packit c4476c
	xor	$t0,$t8
Packit c4476c
	xor	$t1,$t9
Packit c4476c
	xor	$t2,$t10
Packit c4476c
	xor	$t3,$t11
Packit c4476c
Packit c4476c
	xor	$t0,$t4
Packit c4476c
	xor	$t1,$t5
Packit c4476c
	xor	$t2,$t6
Packit c4476c
	xor	$t3,$t7
Packit c4476c
Packit c4476c
	subu	$cnt,1
Packit c4476c
	$PTR_ADD $key0,16
Packit c4476c
	xor	$s0,$t0
Packit c4476c
	xor	$s1,$t1
Packit c4476c
	xor	$s2,$t2
Packit c4476c
	xor	$s3,$t3
Packit c4476c
	.set	noreorder
Packit c4476c
	bnez	$cnt,.Loop_dec
Packit c4476c
	ext	$i0,$s3,16,8
Packit c4476c
Packit c4476c
	_xtr	$i0,$s3,16-2
Packit c4476c
#else
Packit c4476c
	_xtr	$i0,$s3,16-2
Packit c4476c
.Loop_dec:
Packit c4476c
	_xtr	$i1,$s0,16-2
Packit c4476c
	_xtr	$i2,$s1,16-2
Packit c4476c
	_xtr	$i3,$s2,16-2
Packit c4476c
	and	$i0,0x3fc
Packit c4476c
	and	$i1,0x3fc
Packit c4476c
	and	$i2,0x3fc
Packit c4476c
	and	$i3,0x3fc
Packit c4476c
	$PTR_ADD $i0,$Tbl
Packit c4476c
	$PTR_ADD $i1,$Tbl
Packit c4476c
	$PTR_ADD $i2,$Tbl
Packit c4476c
	$PTR_ADD $i3,$Tbl
Packit c4476c
#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
Packit c4476c
	lw	$t0,0($i0)		# Td1[s3>>16]
Packit c4476c
	_xtr	$i0,$s2,8-2
Packit c4476c
	lw	$t1,0($i1)		# Td1[s0>>16]
Packit c4476c
	_xtr	$i1,$s3,8-2
Packit c4476c
	lw	$t2,0($i2)		# Td1[s1>>16]
Packit c4476c
	_xtr	$i2,$s0,8-2
Packit c4476c
	lw	$t3,0($i3)		# Td1[s2>>16]
Packit c4476c
	_xtr	$i3,$s1,8-2
Packit c4476c
#else
Packit c4476c
	lwl	$t0,3($i0)		# Td1[s3>>16]
Packit c4476c
	lwl	$t1,3($i1)		# Td1[s0>>16]
Packit c4476c
	lwl	$t2,3($i2)		# Td1[s1>>16]
Packit c4476c
	lwl	$t3,3($i3)		# Td1[s2>>16]
Packit c4476c
	lwr	$t0,2($i0)		# Td1[s3>>16]
Packit c4476c
	_xtr	$i0,$s2,8-2
Packit c4476c
	lwr	$t1,2($i1)		# Td1[s0>>16]
Packit c4476c
	_xtr	$i1,$s3,8-2
Packit c4476c
	lwr	$t2,2($i2)		# Td1[s1>>16]
Packit c4476c
	_xtr	$i2,$s0,8-2
Packit c4476c
	lwr	$t3,2($i3)		# Td1[s2>>16]
Packit c4476c
	_xtr	$i3,$s1,8-2
Packit c4476c
#endif
Packit c4476c
Packit c4476c
	and	$i0,0x3fc
Packit c4476c
	and	$i1,0x3fc
Packit c4476c
	and	$i2,0x3fc
Packit c4476c
	and	$i3,0x3fc
Packit c4476c
	$PTR_ADD $i0,$Tbl
Packit c4476c
	$PTR_ADD $i1,$Tbl
Packit c4476c
	$PTR_ADD $i2,$Tbl
Packit c4476c
	$PTR_ADD $i3,$Tbl
Packit c4476c
#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
Packit c4476c
	rotr	$t0,$t0,8
Packit c4476c
	rotr	$t1,$t1,8
Packit c4476c
	rotr	$t2,$t2,8
Packit c4476c
	rotr	$t3,$t3,8
Packit c4476c
# if defined(_MIPSEL)
Packit c4476c
	lw	$t4,0($i0)		# Td2[s2>>8]
Packit c4476c
	_xtr	$i0,$s1,0-2
Packit c4476c
	lw	$t5,0($i1)		# Td2[s3>>8]
Packit c4476c
	_xtr	$i1,$s2,0-2
Packit c4476c
	lw	$t6,0($i2)		# Td2[s0>>8]
Packit c4476c
	_xtr	$i2,$s3,0-2
Packit c4476c
	lw	$t7,0($i3)		# Td2[s1>>8]
Packit c4476c
	_xtr	$i3,$s0,0-2
Packit c4476c
Packit c4476c
	and	$i0,0x3fc
Packit c4476c
	and	$i1,0x3fc
Packit c4476c
	and	$i2,0x3fc
Packit c4476c
	and	$i3,0x3fc
Packit c4476c
	$PTR_ADD $i0,$Tbl
Packit c4476c
	$PTR_ADD $i1,$Tbl
Packit c4476c
	$PTR_ADD $i2,$Tbl
Packit c4476c
	$PTR_ADD $i3,$Tbl
Packit c4476c
	lw	$t8,0($i0)		# Td3[s1]
Packit c4476c
	$PTR_INS $i0,$s0,2,8
Packit c4476c
	lw	$t9,0($i1)		# Td3[s2]
Packit c4476c
	$PTR_INS $i1,$s1,2,8
Packit c4476c
	lw	$t10,0($i2)		# Td3[s3]
Packit c4476c
	$PTR_INS $i2,$s2,2,8
Packit c4476c
	lw	$t11,0($i3)		# Td3[s0]
Packit c4476c
	$PTR_INS $i3,$s3,2,8
Packit c4476c
#else
Packit c4476c
	lw	$t4,0($i0)		# Td2[s2>>8]
Packit c4476c
	$PTR_INS $i0,$s1,2,8
Packit c4476c
	lw	$t5,0($i1)		# Td2[s3>>8]
Packit c4476c
	$PTR_INS $i1,$s2,2,8
Packit c4476c
	lw	$t6,0($i2)		# Td2[s0>>8]
Packit c4476c
	$PTR_INS $i2,$s3,2,8
Packit c4476c
	lw	$t7,0($i3)		# Td2[s1>>8]
Packit c4476c
	$PTR_INS $i3,$s0,2,8
Packit c4476c
Packit c4476c
	lw	$t8,0($i0)		# Td3[s1]
Packit c4476c
	_xtr	$i0,$s0,24-2
Packit c4476c
	lw	$t9,0($i1)		# Td3[s2]
Packit c4476c
	_xtr	$i1,$s1,24-2
Packit c4476c
	lw	$t10,0($i2)		# Td3[s3]
Packit c4476c
	_xtr	$i2,$s2,24-2
Packit c4476c
	lw	$t11,0($i3)		# Td3[s0]
Packit c4476c
	_xtr	$i3,$s3,24-2
Packit c4476c
Packit c4476c
	and	$i0,0x3fc
Packit c4476c
	and	$i1,0x3fc
Packit c4476c
	and	$i2,0x3fc
Packit c4476c
	and	$i3,0x3fc
Packit c4476c
	$PTR_ADD $i0,$Tbl
Packit c4476c
	$PTR_ADD $i1,$Tbl
Packit c4476c
	$PTR_ADD $i2,$Tbl
Packit c4476c
	$PTR_ADD $i3,$Tbl
Packit c4476c
#endif
Packit c4476c
	rotr	$t4,$t4,16
Packit c4476c
	rotr	$t5,$t5,16
Packit c4476c
	rotr	$t6,$t6,16
Packit c4476c
	rotr	$t7,$t7,16
Packit c4476c
Packit c4476c
	rotr	$t8,$t8,24
Packit c4476c
	rotr	$t9,$t9,24
Packit c4476c
	rotr	$t10,$t10,24
Packit c4476c
	rotr	$t11,$t11,24
Packit c4476c
#else
Packit c4476c
	lwl	$t4,2($i0)		# Td2[s2>>8]
Packit c4476c
	lwl	$t5,2($i1)		# Td2[s3>>8]
Packit c4476c
	lwl	$t6,2($i2)		# Td2[s0>>8]
Packit c4476c
	lwl	$t7,2($i3)		# Td2[s1>>8]
Packit c4476c
	lwr	$t4,1($i0)		# Td2[s2>>8]
Packit c4476c
	_xtr	$i0,$s1,0-2
Packit c4476c
	lwr	$t5,1($i1)		# Td2[s3>>8]
Packit c4476c
	_xtr	$i1,$s2,0-2
Packit c4476c
	lwr	$t6,1($i2)		# Td2[s0>>8]
Packit c4476c
	_xtr	$i2,$s3,0-2
Packit c4476c
	lwr	$t7,1($i3)		# Td2[s1>>8]
Packit c4476c
	_xtr	$i3,$s0,0-2
Packit c4476c
Packit c4476c
	and	$i0,0x3fc
Packit c4476c
	and	$i1,0x3fc
Packit c4476c
	and	$i2,0x3fc
Packit c4476c
	and	$i3,0x3fc
Packit c4476c
	$PTR_ADD $i0,$Tbl
Packit c4476c
	$PTR_ADD $i1,$Tbl
Packit c4476c
	$PTR_ADD $i2,$Tbl
Packit c4476c
	$PTR_ADD $i3,$Tbl
Packit c4476c
	lwl	$t8,1($i0)		# Td3[s1]
Packit c4476c
	lwl	$t9,1($i1)		# Td3[s2]
Packit c4476c
	lwl	$t10,1($i2)		# Td3[s3]
Packit c4476c
	lwl	$t11,1($i3)		# Td3[s0]
Packit c4476c
	lwr	$t8,0($i0)		# Td3[s1]
Packit c4476c
	_xtr	$i0,$s0,24-2
Packit c4476c
	lwr	$t9,0($i1)		# Td3[s2]
Packit c4476c
	_xtr	$i1,$s1,24-2
Packit c4476c
	lwr	$t10,0($i2)		# Td3[s3]
Packit c4476c
	_xtr	$i2,$s2,24-2
Packit c4476c
	lwr	$t11,0($i3)		# Td3[s0]
Packit c4476c
	_xtr	$i3,$s3,24-2
Packit c4476c
Packit c4476c
	and	$i0,0x3fc
Packit c4476c
	and	$i1,0x3fc
Packit c4476c
	and	$i2,0x3fc
Packit c4476c
	and	$i3,0x3fc
Packit c4476c
	$PTR_ADD $i0,$Tbl
Packit c4476c
	$PTR_ADD $i1,$Tbl
Packit c4476c
	$PTR_ADD $i2,$Tbl
Packit c4476c
	$PTR_ADD $i3,$Tbl
Packit c4476c
#endif
Packit c4476c
Packit c4476c
	xor	$t0,$t4
Packit c4476c
	lw	$t4,0($i0)		# Td0[s0>>24]
Packit c4476c
	xor	$t1,$t5
Packit c4476c
	lw	$t5,0($i1)		# Td0[s1>>24]
Packit c4476c
	xor	$t2,$t6
Packit c4476c
	lw	$t6,0($i2)		# Td0[s2>>24]
Packit c4476c
	xor	$t3,$t7
Packit c4476c
	lw	$t7,0($i3)		# Td0[s3>>24]
Packit c4476c
Packit c4476c
	xor	$t0,$t8
Packit c4476c
	lw	$s0,0($key0)
Packit c4476c
	xor	$t1,$t9
Packit c4476c
	lw	$s1,4($key0)
Packit c4476c
	xor	$t2,$t10
Packit c4476c
	lw	$s2,8($key0)
Packit c4476c
	xor	$t3,$t11
Packit c4476c
	lw	$s3,12($key0)
Packit c4476c
Packit c4476c
	xor	$t0,$t4
Packit c4476c
	xor	$t1,$t5
Packit c4476c
	xor	$t2,$t6
Packit c4476c
	xor	$t3,$t7
Packit c4476c
Packit c4476c
	subu	$cnt,1
Packit c4476c
	$PTR_ADD $key0,16
Packit c4476c
	xor	$s0,$t0
Packit c4476c
	xor	$s1,$t1
Packit c4476c
	xor	$s2,$t2
Packit c4476c
	xor	$s3,$t3
Packit c4476c
	.set	noreorder
Packit c4476c
	bnez	$cnt,.Loop_dec
Packit c4476c
	_xtr	$i0,$s3,16-2
Packit c4476c
#endif
Packit c4476c
Packit c4476c
	.set	reorder
Packit c4476c
	lw	$t4,1024($Tbl)		# prefetch Td4
Packit c4476c
	_xtr	$i0,$s3,16
Packit c4476c
	lw	$t5,1024+32($Tbl)
Packit c4476c
	_xtr	$i1,$s0,16
Packit c4476c
	lw	$t6,1024+64($Tbl)
Packit c4476c
	_xtr	$i2,$s1,16
Packit c4476c
	lw	$t7,1024+96($Tbl)
Packit c4476c
	_xtr	$i3,$s2,16
Packit c4476c
	lw	$t8,1024+128($Tbl)
Packit c4476c
	and	$i0,0xff
Packit c4476c
	lw	$t9,1024+160($Tbl)
Packit c4476c
	and	$i1,0xff
Packit c4476c
	lw	$t10,1024+192($Tbl)
Packit c4476c
	and	$i2,0xff
Packit c4476c
	lw	$t11,1024+224($Tbl)
Packit c4476c
	and	$i3,0xff
Packit c4476c
Packit c4476c
	$PTR_ADD $i0,$Tbl
Packit c4476c
	$PTR_ADD $i1,$Tbl
Packit c4476c
	$PTR_ADD $i2,$Tbl
Packit c4476c
	$PTR_ADD $i3,$Tbl
Packit c4476c
	lbu	$t0,1024($i0)		# Td4[s3>>16]
Packit c4476c
	_xtr	$i0,$s2,8
Packit c4476c
	lbu	$t1,1024($i1)		# Td4[s0>>16]
Packit c4476c
	_xtr	$i1,$s3,8
Packit c4476c
	lbu	$t2,1024($i2)		# Td4[s1>>16]
Packit c4476c
	_xtr	$i2,$s0,8
Packit c4476c
	lbu	$t3,1024($i3)		# Td4[s2>>16]
Packit c4476c
	_xtr	$i3,$s1,8
Packit c4476c
Packit c4476c
	and	$i0,0xff
Packit c4476c
	and	$i1,0xff
Packit c4476c
	and	$i2,0xff
Packit c4476c
	and	$i3,0xff
Packit c4476c
	$PTR_ADD $i0,$Tbl
Packit c4476c
	$PTR_ADD $i1,$Tbl
Packit c4476c
	$PTR_ADD $i2,$Tbl
Packit c4476c
	$PTR_ADD $i3,$Tbl
Packit c4476c
#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
Packit c4476c
# if defined(_MIPSEL)
Packit c4476c
	lbu	$t4,1024($i0)		# Td4[s2>>8]
Packit c4476c
	$PTR_INS $i0,$s0,0,8
Packit c4476c
	lbu	$t5,1024($i1)		# Td4[s3>>8]
Packit c4476c
	$PTR_INS $i1,$s1,0,8
Packit c4476c
	lbu	$t6,1024($i2)		# Td4[s0>>8]
Packit c4476c
	$PTR_INS $i2,$s2,0,8
Packit c4476c
	lbu	$t7,1024($i3)		# Td4[s1>>8]
Packit c4476c
	$PTR_INS $i3,$s3,0,8
Packit c4476c
Packit c4476c
	lbu	$t8,1024($i0)		# Td4[s0>>24]
Packit c4476c
	_xtr	$i0,$s1,0
Packit c4476c
	lbu	$t9,1024($i1)		# Td4[s1>>24]
Packit c4476c
	_xtr	$i1,$s2,0
Packit c4476c
	lbu	$t10,1024($i2)		# Td4[s2>>24]
Packit c4476c
	_xtr	$i2,$s3,0
Packit c4476c
	lbu	$t11,1024($i3)		# Td4[s3>>24]
Packit c4476c
	_xtr	$i3,$s0,0
Packit c4476c
Packit c4476c
	$PTR_ADD $i0,$Tbl
Packit c4476c
	$PTR_ADD $i1,$Tbl
Packit c4476c
	$PTR_ADD $i2,$Tbl
Packit c4476c
	$PTR_ADD $i3,$Tbl
Packit c4476c
# else
Packit c4476c
	lbu	$t4,1024($i0)		# Td4[s2>>8]
Packit c4476c
	_xtr	$i0,$s0,24
Packit c4476c
	lbu	$t5,1024($i1)		# Td4[s3>>8]
Packit c4476c
	_xtr	$i1,$s1,24
Packit c4476c
	lbu	$t6,1024($i2)		# Td4[s0>>8]
Packit c4476c
	_xtr	$i2,$s2,24
Packit c4476c
	lbu	$t7,1024($i3)		# Td4[s1>>8]
Packit c4476c
	_xtr	$i3,$s3,24
Packit c4476c
Packit c4476c
	$PTR_ADD $i0,$Tbl
Packit c4476c
	$PTR_ADD $i1,$Tbl
Packit c4476c
	$PTR_ADD $i2,$Tbl
Packit c4476c
	$PTR_ADD $i3,$Tbl
Packit c4476c
	lbu	$t8,1024($i0)		# Td4[s0>>24]
Packit c4476c
	$PTR_INS $i0,$s1,0,8
Packit c4476c
	lbu	$t9,1024($i1)		# Td4[s1>>24]
Packit c4476c
	$PTR_INS $i1,$s2,0,8
Packit c4476c
	lbu	$t10,1024($i2)		# Td4[s2>>24]
Packit c4476c
	$PTR_INS $i2,$s3,0,8
Packit c4476c
	lbu	$t11,1024($i3)		# Td4[s3>>24]
Packit c4476c
	$PTR_INS $i3,$s0,0,8
Packit c4476c
# endif
Packit c4476c
	_ins	$t0,16
Packit c4476c
	_ins	$t1,16
Packit c4476c
	_ins	$t2,16
Packit c4476c
	_ins	$t3,16
Packit c4476c
Packit c4476c
	_ins2	$t0,$t4,8
Packit c4476c
	lbu	$t4,1024($i0)		# Td4[s1]
Packit c4476c
	_ins2	$t1,$t5,8
Packit c4476c
	lbu	$t5,1024($i1)		# Td4[s2]
Packit c4476c
	_ins2	$t2,$t6,8
Packit c4476c
	lbu	$t6,1024($i2)		# Td4[s3]
Packit c4476c
	_ins2	$t3,$t7,8
Packit c4476c
	lbu	$t7,1024($i3)		# Td4[s0]
Packit c4476c
Packit c4476c
	_ins2	$t0,$t8,24
Packit c4476c
	lw	$s0,0($key0)
Packit c4476c
	_ins2	$t1,$t9,24
Packit c4476c
	lw	$s1,4($key0)
Packit c4476c
	_ins2	$t2,$t10,24
Packit c4476c
	lw	$s2,8($key0)
Packit c4476c
	_ins2	$t3,$t11,24
Packit c4476c
	lw	$s3,12($key0)
Packit c4476c
Packit c4476c
	_ins2	$t0,$t4,0
Packit c4476c
	_ins2	$t1,$t5,0
Packit c4476c
	_ins2	$t2,$t6,0
Packit c4476c
	_ins2	$t3,$t7,0
Packit c4476c
#else
Packit c4476c
	lbu	$t4,1024($i0)		# Td4[s2>>8]
Packit c4476c
	_xtr	$i0,$s0,24
Packit c4476c
	lbu	$t5,1024($i1)		# Td4[s3>>8]
Packit c4476c
	_xtr	$i1,$s1,24
Packit c4476c
	lbu	$t6,1024($i2)		# Td4[s0>>8]
Packit c4476c
	_xtr	$i2,$s2,24
Packit c4476c
	lbu	$t7,1024($i3)		# Td4[s1>>8]
Packit c4476c
	_xtr	$i3,$s3,24
Packit c4476c
Packit c4476c
	$PTR_ADD $i0,$Tbl
Packit c4476c
	$PTR_ADD $i1,$Tbl
Packit c4476c
	$PTR_ADD $i2,$Tbl
Packit c4476c
	$PTR_ADD $i3,$Tbl
Packit c4476c
	lbu	$t8,1024($i0)		# Td4[s0>>24]
Packit c4476c
	_xtr	$i0,$s1,0
Packit c4476c
	lbu	$t9,1024($i1)		# Td4[s1>>24]
Packit c4476c
	_xtr	$i1,$s2,0
Packit c4476c
	lbu	$t10,1024($i2)		# Td4[s2>>24]
Packit c4476c
	_xtr	$i2,$s3,0
Packit c4476c
	lbu	$t11,1024($i3)		# Td4[s3>>24]
Packit c4476c
	_xtr	$i3,$s0,0
Packit c4476c
Packit c4476c
	$PTR_ADD $i0,$Tbl
Packit c4476c
	$PTR_ADD $i1,$Tbl
Packit c4476c
	$PTR_ADD $i2,$Tbl
Packit c4476c
	$PTR_ADD $i3,$Tbl
Packit c4476c
Packit c4476c
	_ins	$t0,16
Packit c4476c
	_ins	$t1,16
Packit c4476c
	_ins	$t2,16
Packit c4476c
	_ins	$t3,16
Packit c4476c
Packit c4476c
	_ins	$t4,8
Packit c4476c
	_ins	$t5,8
Packit c4476c
	_ins	$t6,8
Packit c4476c
	_ins	$t7,8
Packit c4476c
Packit c4476c
	xor	$t0,$t4
Packit c4476c
	lbu	$t4,1024($i0)		# Td4[s1]
Packit c4476c
	xor	$t1,$t5
Packit c4476c
	lbu	$t5,1024($i1)		# Td4[s2]
Packit c4476c
	xor	$t2,$t6
Packit c4476c
	lbu	$t6,1024($i2)		# Td4[s3]
Packit c4476c
	xor	$t3,$t7
Packit c4476c
	lbu	$t7,1024($i3)		# Td4[s0]
Packit c4476c
Packit c4476c
	_ins	$t8,24
Packit c4476c
	lw	$s0,0($key0)
Packit c4476c
	_ins	$t9,24
Packit c4476c
	lw	$s1,4($key0)
Packit c4476c
	_ins	$t10,24
Packit c4476c
	lw	$s2,8($key0)
Packit c4476c
	_ins	$t11,24
Packit c4476c
	lw	$s3,12($key0)
Packit c4476c
Packit c4476c
	xor	$t0,$t8
Packit c4476c
	xor	$t1,$t9
Packit c4476c
	xor	$t2,$t10
Packit c4476c
	xor	$t3,$t11
Packit c4476c
Packit c4476c
	_ins	$t4,0
Packit c4476c
	_ins	$t5,0
Packit c4476c
	_ins	$t6,0
Packit c4476c
	_ins	$t7,0
Packit c4476c
Packit c4476c
	xor	$t0,$t4
Packit c4476c
	xor	$t1,$t5
Packit c4476c
	xor	$t2,$t6
Packit c4476c
	xor	$t3,$t7
Packit c4476c
#endif
Packit c4476c
Packit c4476c
	xor	$s0,$t0
Packit c4476c
	xor	$s1,$t1
Packit c4476c
	xor	$s2,$t2
Packit c4476c
	xor	$s3,$t3
Packit c4476c
Packit c4476c
	jr	$ra
Packit c4476c
.end	_mips_AES_decrypt
Packit c4476c
Packit c4476c
.align	5
Packit c4476c
.globl	AES_decrypt
Packit c4476c
.ent	AES_decrypt
Packit c4476c
AES_decrypt:
Packit c4476c
	.frame	$sp,$FRAMESIZE,$ra
Packit c4476c
	.mask	$SAVED_REGS_MASK,-$SZREG
Packit c4476c
	.set	noreorder
Packit c4476c
___
Packit c4476c
$code.=<<___ if ($flavour =~ /o32/i);	# o32 PIC-ification
Packit c4476c
	.cpload	$pf
Packit c4476c
___
Packit c4476c
$code.=<<___;
Packit c4476c
	$PTR_SUB $sp,$FRAMESIZE
Packit c4476c
	$REG_S	$ra,$FRAMESIZE-1*$SZREG($sp)
Packit c4476c
	$REG_S	$fp,$FRAMESIZE-2*$SZREG($sp)
Packit c4476c
	$REG_S	$s11,$FRAMESIZE-3*$SZREG($sp)
Packit c4476c
	$REG_S	$s10,$FRAMESIZE-4*$SZREG($sp)
Packit c4476c
	$REG_S	$s9,$FRAMESIZE-5*$SZREG($sp)
Packit c4476c
	$REG_S	$s8,$FRAMESIZE-6*$SZREG($sp)
Packit c4476c
	$REG_S	$s7,$FRAMESIZE-7*$SZREG($sp)
Packit c4476c
	$REG_S	$s6,$FRAMESIZE-8*$SZREG($sp)
Packit c4476c
	$REG_S	$s5,$FRAMESIZE-9*$SZREG($sp)
Packit c4476c
	$REG_S	$s4,$FRAMESIZE-10*$SZREG($sp)
Packit c4476c
___
Packit c4476c
$code.=<<___ if ($flavour =~ /nubi/i);	# optimize non-nubi prologue
Packit c4476c
	$REG_S	\$15,$FRAMESIZE-11*$SZREG($sp)
Packit c4476c
	$REG_S	\$14,$FRAMESIZE-12*$SZREG($sp)
Packit c4476c
	$REG_S	\$13,$FRAMESIZE-13*$SZREG($sp)
Packit c4476c
	$REG_S	\$12,$FRAMESIZE-14*$SZREG($sp)
Packit c4476c
	$REG_S	$gp,$FRAMESIZE-15*$SZREG($sp)
Packit c4476c
___
Packit c4476c
$code.=<<___ if ($flavour !~ /o32/i);	# non-o32 PIC-ification
Packit c4476c
	.cplocal	$Tbl
Packit c4476c
	.cpsetup	$pf,$zero,AES_decrypt
Packit c4476c
___
Packit c4476c
$code.=<<___;
Packit c4476c
	.set	reorder
Packit c4476c
	$PTR_LA	$Tbl,AES_Td		# PIC-ified 'load address'
Packit c4476c
Packit c4476c
#if defined(_MIPS_ARCH_MIPS32R6) || defined(_MIPS_ARCH_MIPS64R6)
Packit c4476c
	lw	$s0,0($inp)
Packit c4476c
	lw	$s1,4($inp)
Packit c4476c
	lw	$s2,8($inp)
Packit c4476c
	lw	$s3,12($inp)
Packit c4476c
#else
Packit c4476c
	lwl	$s0,0+$MSB($inp)
Packit c4476c
	lwl	$s1,4+$MSB($inp)
Packit c4476c
	lwl	$s2,8+$MSB($inp)
Packit c4476c
	lwl	$s3,12+$MSB($inp)
Packit c4476c
	lwr	$s0,0+$LSB($inp)
Packit c4476c
	lwr	$s1,4+$LSB($inp)
Packit c4476c
	lwr	$s2,8+$LSB($inp)
Packit c4476c
	lwr	$s3,12+$LSB($inp)
Packit c4476c
#endif
Packit c4476c
Packit c4476c
	bal	_mips_AES_decrypt
Packit c4476c
Packit c4476c
#if defined(_MIPS_ARCH_MIPS32R6) || defined(_MIPS_ARCH_MIPS64R6)
Packit c4476c
	sw	$s0,0($out)
Packit c4476c
	sw	$s1,4($out)
Packit c4476c
	sw	$s2,8($out)
Packit c4476c
	sw	$s3,12($out)
Packit c4476c
#else
Packit c4476c
	swr	$s0,0+$LSB($out)
Packit c4476c
	swr	$s1,4+$LSB($out)
Packit c4476c
	swr	$s2,8+$LSB($out)
Packit c4476c
	swr	$s3,12+$LSB($out)
Packit c4476c
	swl	$s0,0+$MSB($out)
Packit c4476c
	swl	$s1,4+$MSB($out)
Packit c4476c
	swl	$s2,8+$MSB($out)
Packit c4476c
	swl	$s3,12+$MSB($out)
Packit c4476c
#endif
Packit c4476c
Packit c4476c
	.set	noreorder
Packit c4476c
	$REG_L	$ra,$FRAMESIZE-1*$SZREG($sp)
Packit c4476c
	$REG_L	$fp,$FRAMESIZE-2*$SZREG($sp)
Packit c4476c
	$REG_L	$s11,$FRAMESIZE-3*$SZREG($sp)
Packit c4476c
	$REG_L	$s10,$FRAMESIZE-4*$SZREG($sp)
Packit c4476c
	$REG_L	$s9,$FRAMESIZE-5*$SZREG($sp)
Packit c4476c
	$REG_L	$s8,$FRAMESIZE-6*$SZREG($sp)
Packit c4476c
	$REG_L	$s7,$FRAMESIZE-7*$SZREG($sp)
Packit c4476c
	$REG_L	$s6,$FRAMESIZE-8*$SZREG($sp)
Packit c4476c
	$REG_L	$s5,$FRAMESIZE-9*$SZREG($sp)
Packit c4476c
	$REG_L	$s4,$FRAMESIZE-10*$SZREG($sp)
Packit c4476c
___
Packit c4476c
$code.=<<___ if ($flavour =~ /nubi/i);
Packit c4476c
	$REG_L	\$15,$FRAMESIZE-11*$SZREG($sp)
Packit c4476c
	$REG_L	\$14,$FRAMESIZE-12*$SZREG($sp)
Packit c4476c
	$REG_L	\$13,$FRAMESIZE-13*$SZREG($sp)
Packit c4476c
	$REG_L	\$12,$FRAMESIZE-14*$SZREG($sp)
Packit c4476c
	$REG_L	$gp,$FRAMESIZE-15*$SZREG($sp)
Packit c4476c
___
Packit c4476c
$code.=<<___;
Packit c4476c
	jr	$ra
Packit c4476c
	$PTR_ADD $sp,$FRAMESIZE
Packit c4476c
.end	AES_decrypt
Packit c4476c
___
Packit c4476c
}}}
Packit c4476c

Packit c4476c
{{{
Packit c4476c
my $FRAMESIZE=8*$SZREG;
Packit c4476c
my $SAVED_REGS_MASK = ($flavour =~ /nubi/i) ? "0xc000f008" : "0xc0000000";
Packit c4476c
Packit c4476c
my ($inp,$bits,$key,$Tbl)=($a0,$a1,$a2,$a3);
Packit c4476c
my ($rk0,$rk1,$rk2,$rk3,$rk4,$rk5,$rk6,$rk7)=($a4,$a5,$a6,$a7,$s0,$s1,$s2,$s3);
Packit c4476c
my ($i0,$i1,$i2,$i3)=($at,$t0,$t1,$t2);
Packit c4476c
my ($rcon,$cnt)=($gp,$fp);
Packit c4476c
Packit c4476c
$code.=<<___;
Packit c4476c
.align	5
Packit c4476c
.ent	_mips_AES_set_encrypt_key
Packit c4476c
_mips_AES_set_encrypt_key:
Packit c4476c
	.frame	$sp,0,$ra
Packit c4476c
	.set	noreorder
Packit c4476c
	beqz	$inp,.Lekey_done
Packit c4476c
	li	$t0,-1
Packit c4476c
	beqz	$key,.Lekey_done
Packit c4476c
	$PTR_ADD $rcon,$Tbl,256
Packit c4476c
Packit c4476c
	.set	reorder
Packit c4476c
#if defined(_MIPS_ARCH_MIPS32R6) || defined(_MIPS_ARCH_MIPS64R6)
Packit c4476c
	lw	$rk0,0($inp)		# load 128 bits
Packit c4476c
	lw	$rk1,4($inp)
Packit c4476c
	lw	$rk2,8($inp)
Packit c4476c
	lw	$rk3,12($inp)
Packit c4476c
#else
Packit c4476c
	lwl	$rk0,0+$MSB($inp)	# load 128 bits
Packit c4476c
	lwl	$rk1,4+$MSB($inp)
Packit c4476c
	lwl	$rk2,8+$MSB($inp)
Packit c4476c
	lwl	$rk3,12+$MSB($inp)
Packit c4476c
	lwr	$rk0,0+$LSB($inp)
Packit c4476c
	lwr	$rk1,4+$LSB($inp)
Packit c4476c
	lwr	$rk2,8+$LSB($inp)
Packit c4476c
	lwr	$rk3,12+$LSB($inp)
Packit c4476c
#endif
Packit c4476c
	li	$at,128
Packit c4476c
	.set	noreorder
Packit c4476c
	beq	$bits,$at,.L128bits
Packit c4476c
	li	$cnt,10
Packit c4476c
Packit c4476c
	.set	reorder
Packit c4476c
#if defined(_MIPS_ARCH_MIPS32R6) || defined(_MIPS_ARCH_MIPS64R6)
Packit c4476c
	lw	$rk4,16($inp)		# load 192 bits
Packit c4476c
	lw	$rk5,20($inp)
Packit c4476c
#else
Packit c4476c
	lwl	$rk4,16+$MSB($inp)	# load 192 bits
Packit c4476c
	lwl	$rk5,20+$MSB($inp)
Packit c4476c
	lwr	$rk4,16+$LSB($inp)
Packit c4476c
	lwr	$rk5,20+$LSB($inp)
Packit c4476c
#endif
Packit c4476c
	li	$at,192
Packit c4476c
	.set	noreorder
Packit c4476c
	beq	$bits,$at,.L192bits
Packit c4476c
	li	$cnt,8
Packit c4476c
Packit c4476c
	.set	reorder
Packit c4476c
#if defined(_MIPS_ARCH_MIPS32R6) || defined(_MIPS_ARCH_MIPS64R6)
Packit c4476c
	lw	$rk6,24($inp)		# load 256 bits
Packit c4476c
	lw	$rk7,28($inp)
Packit c4476c
#else
Packit c4476c
	lwl	$rk6,24+$MSB($inp)	# load 256 bits
Packit c4476c
	lwl	$rk7,28+$MSB($inp)
Packit c4476c
	lwr	$rk6,24+$LSB($inp)
Packit c4476c
	lwr	$rk7,28+$LSB($inp)
Packit c4476c
#endif
Packit c4476c
	li	$at,256
Packit c4476c
	.set	noreorder
Packit c4476c
	beq	$bits,$at,.L256bits
Packit c4476c
	li	$cnt,7
Packit c4476c
Packit c4476c
	b	.Lekey_done
Packit c4476c
	li	$t0,-2
Packit c4476c
Packit c4476c
.align	4
Packit c4476c
.L128bits:
Packit c4476c
	.set	reorder
Packit c4476c
	srl	$i0,$rk3,16
Packit c4476c
	srl	$i1,$rk3,8
Packit c4476c
	and	$i0,0xff
Packit c4476c
	and	$i1,0xff
Packit c4476c
	and	$i2,$rk3,0xff
Packit c4476c
	srl	$i3,$rk3,24
Packit c4476c
	$PTR_ADD $i0,$Tbl
Packit c4476c
	$PTR_ADD $i1,$Tbl
Packit c4476c
	$PTR_ADD $i2,$Tbl
Packit c4476c
	$PTR_ADD $i3,$Tbl
Packit c4476c
	lbu	$i0,0($i0)
Packit c4476c
	lbu	$i1,0($i1)
Packit c4476c
	lbu	$i2,0($i2)
Packit c4476c
	lbu	$i3,0($i3)
Packit c4476c
Packit c4476c
	sw	$rk0,0($key)
Packit c4476c
	sw	$rk1,4($key)
Packit c4476c
	sw	$rk2,8($key)
Packit c4476c
	sw	$rk3,12($key)
Packit c4476c
	subu	$cnt,1
Packit c4476c
	$PTR_ADD $key,16
Packit c4476c
Packit c4476c
	_bias	$i0,24
Packit c4476c
	_bias	$i1,16
Packit c4476c
	_bias	$i2,8
Packit c4476c
	_bias	$i3,0
Packit c4476c
Packit c4476c
	xor	$rk0,$i0
Packit c4476c
	lw	$i0,0($rcon)
Packit c4476c
	xor	$rk0,$i1
Packit c4476c
	xor	$rk0,$i2
Packit c4476c
	xor	$rk0,$i3
Packit c4476c
	xor	$rk0,$i0
Packit c4476c
Packit c4476c
	xor	$rk1,$rk0
Packit c4476c
	xor	$rk2,$rk1
Packit c4476c
	xor	$rk3,$rk2
Packit c4476c
Packit c4476c
	.set	noreorder
Packit c4476c
	bnez	$cnt,.L128bits
Packit c4476c
	$PTR_ADD $rcon,4
Packit c4476c
Packit c4476c
	sw	$rk0,0($key)
Packit c4476c
	sw	$rk1,4($key)
Packit c4476c
	sw	$rk2,8($key)
Packit c4476c
	li	$cnt,10
Packit c4476c
	sw	$rk3,12($key)
Packit c4476c
	li	$t0,0
Packit c4476c
	sw	$cnt,80($key)
Packit c4476c
	b	.Lekey_done
Packit c4476c
	$PTR_SUB $key,10*16
Packit c4476c
Packit c4476c
.align	4
Packit c4476c
.L192bits:
Packit c4476c
	.set	reorder
Packit c4476c
	srl	$i0,$rk5,16
Packit c4476c
	srl	$i1,$rk5,8
Packit c4476c
	and	$i0,0xff
Packit c4476c
	and	$i1,0xff
Packit c4476c
	and	$i2,$rk5,0xff
Packit c4476c
	srl	$i3,$rk5,24
Packit c4476c
	$PTR_ADD $i0,$Tbl
Packit c4476c
	$PTR_ADD $i1,$Tbl
Packit c4476c
	$PTR_ADD $i2,$Tbl
Packit c4476c
	$PTR_ADD $i3,$Tbl
Packit c4476c
	lbu	$i0,0($i0)
Packit c4476c
	lbu	$i1,0($i1)
Packit c4476c
	lbu	$i2,0($i2)
Packit c4476c
	lbu	$i3,0($i3)
Packit c4476c
Packit c4476c
	sw	$rk0,0($key)
Packit c4476c
	sw	$rk1,4($key)
Packit c4476c
	sw	$rk2,8($key)
Packit c4476c
	sw	$rk3,12($key)
Packit c4476c
	sw	$rk4,16($key)
Packit c4476c
	sw	$rk5,20($key)
Packit c4476c
	subu	$cnt,1
Packit c4476c
	$PTR_ADD $key,24
Packit c4476c
Packit c4476c
	_bias	$i0,24
Packit c4476c
	_bias	$i1,16
Packit c4476c
	_bias	$i2,8
Packit c4476c
	_bias	$i3,0
Packit c4476c
Packit c4476c
	xor	$rk0,$i0
Packit c4476c
	lw	$i0,0($rcon)
Packit c4476c
	xor	$rk0,$i1
Packit c4476c
	xor	$rk0,$i2
Packit c4476c
	xor	$rk0,$i3
Packit c4476c
	xor	$rk0,$i0
Packit c4476c
Packit c4476c
	xor	$rk1,$rk0
Packit c4476c
	xor	$rk2,$rk1
Packit c4476c
	xor	$rk3,$rk2
Packit c4476c
	xor	$rk4,$rk3
Packit c4476c
	xor	$rk5,$rk4
Packit c4476c
Packit c4476c
	.set	noreorder
Packit c4476c
	bnez	$cnt,.L192bits
Packit c4476c
	$PTR_ADD $rcon,4
Packit c4476c
Packit c4476c
	sw	$rk0,0($key)
Packit c4476c
	sw	$rk1,4($key)
Packit c4476c
	sw	$rk2,8($key)
Packit c4476c
	li	$cnt,12
Packit c4476c
	sw	$rk3,12($key)
Packit c4476c
	li	$t0,0
Packit c4476c
	sw	$cnt,48($key)
Packit c4476c
	b	.Lekey_done
Packit c4476c
	$PTR_SUB $key,12*16
Packit c4476c
Packit c4476c
.align	4
Packit c4476c
.L256bits:
Packit c4476c
	.set	reorder
Packit c4476c
	srl	$i0,$rk7,16
Packit c4476c
	srl	$i1,$rk7,8
Packit c4476c
	and	$i0,0xff
Packit c4476c
	and	$i1,0xff
Packit c4476c
	and	$i2,$rk7,0xff
Packit c4476c
	srl	$i3,$rk7,24
Packit c4476c
	$PTR_ADD $i0,$Tbl
Packit c4476c
	$PTR_ADD $i1,$Tbl
Packit c4476c
	$PTR_ADD $i2,$Tbl
Packit c4476c
	$PTR_ADD $i3,$Tbl
Packit c4476c
	lbu	$i0,0($i0)
Packit c4476c
	lbu	$i1,0($i1)
Packit c4476c
	lbu	$i2,0($i2)
Packit c4476c
	lbu	$i3,0($i3)
Packit c4476c
Packit c4476c
	sw	$rk0,0($key)
Packit c4476c
	sw	$rk1,4($key)
Packit c4476c
	sw	$rk2,8($key)
Packit c4476c
	sw	$rk3,12($key)
Packit c4476c
	sw	$rk4,16($key)
Packit c4476c
	sw	$rk5,20($key)
Packit c4476c
	sw	$rk6,24($key)
Packit c4476c
	sw	$rk7,28($key)
Packit c4476c
	subu	$cnt,1
Packit c4476c
Packit c4476c
	_bias	$i0,24
Packit c4476c
	_bias	$i1,16
Packit c4476c
	_bias	$i2,8
Packit c4476c
	_bias	$i3,0
Packit c4476c
Packit c4476c
	xor	$rk0,$i0
Packit c4476c
	lw	$i0,0($rcon)
Packit c4476c
	xor	$rk0,$i1
Packit c4476c
	xor	$rk0,$i2
Packit c4476c
	xor	$rk0,$i3
Packit c4476c
	xor	$rk0,$i0
Packit c4476c
Packit c4476c
	xor	$rk1,$rk0
Packit c4476c
	xor	$rk2,$rk1
Packit c4476c
	xor	$rk3,$rk2
Packit c4476c
	beqz	$cnt,.L256bits_done
Packit c4476c
Packit c4476c
	srl	$i0,$rk3,24
Packit c4476c
	srl	$i1,$rk3,16
Packit c4476c
	srl	$i2,$rk3,8
Packit c4476c
	and	$i3,$rk3,0xff
Packit c4476c
	and	$i1,0xff
Packit c4476c
	and	$i2,0xff
Packit c4476c
	$PTR_ADD $i0,$Tbl
Packit c4476c
	$PTR_ADD $i1,$Tbl
Packit c4476c
	$PTR_ADD $i2,$Tbl
Packit c4476c
	$PTR_ADD $i3,$Tbl
Packit c4476c
	lbu	$i0,0($i0)
Packit c4476c
	lbu	$i1,0($i1)
Packit c4476c
	lbu	$i2,0($i2)
Packit c4476c
	lbu	$i3,0($i3)
Packit c4476c
	sll	$i0,24
Packit c4476c
	sll	$i1,16
Packit c4476c
	sll	$i2,8
Packit c4476c
Packit c4476c
	xor	$rk4,$i0
Packit c4476c
	xor	$rk4,$i1
Packit c4476c
	xor	$rk4,$i2
Packit c4476c
	xor	$rk4,$i3
Packit c4476c
Packit c4476c
	xor	$rk5,$rk4
Packit c4476c
	xor	$rk6,$rk5
Packit c4476c
	xor	$rk7,$rk6
Packit c4476c
Packit c4476c
	$PTR_ADD $key,32
Packit c4476c
	.set	noreorder
Packit c4476c
	b	.L256bits
Packit c4476c
	$PTR_ADD $rcon,4
Packit c4476c
Packit c4476c
.L256bits_done:
Packit c4476c
	sw	$rk0,32($key)
Packit c4476c
	sw	$rk1,36($key)
Packit c4476c
	sw	$rk2,40($key)
Packit c4476c
	li	$cnt,14
Packit c4476c
	sw	$rk3,44($key)
Packit c4476c
	li	$t0,0
Packit c4476c
	sw	$cnt,48($key)
Packit c4476c
	$PTR_SUB $key,12*16
Packit c4476c
Packit c4476c
.Lekey_done:
Packit c4476c
	jr	$ra
Packit c4476c
	nop
Packit c4476c
.end	_mips_AES_set_encrypt_key
Packit c4476c
Packit c4476c
.globl	AES_set_encrypt_key
Packit c4476c
.ent	AES_set_encrypt_key
Packit c4476c
AES_set_encrypt_key:
Packit c4476c
	.frame	$sp,$FRAMESIZE,$ra
Packit c4476c
	.mask	$SAVED_REGS_MASK,-$SZREG
Packit c4476c
	.set	noreorder
Packit c4476c
___
Packit c4476c
$code.=<<___ if ($flavour =~ /o32/i);	# o32 PIC-ification
Packit c4476c
	.cpload	$pf
Packit c4476c
___
Packit c4476c
$code.=<<___;
Packit c4476c
	$PTR_SUB $sp,$FRAMESIZE
Packit c4476c
	$REG_S	$ra,$FRAMESIZE-1*$SZREG($sp)
Packit c4476c
	$REG_S	$fp,$FRAMESIZE-2*$SZREG($sp)
Packit c4476c
___
Packit c4476c
$code.=<<___ if ($flavour =~ /nubi/i);	# optimize non-nubi prologue
Packit c4476c
	$REG_S	$s3,$FRAMESIZE-3*$SZREG($sp)
Packit c4476c
	$REG_S	$s2,$FRAMESIZE-4*$SZREG($sp)
Packit c4476c
	$REG_S	$s1,$FRAMESIZE-5*$SZREG($sp)
Packit c4476c
	$REG_S	$s0,$FRAMESIZE-6*$SZREG($sp)
Packit c4476c
	$REG_S	$gp,$FRAMESIZE-7*$SZREG($sp)
Packit c4476c
___
Packit c4476c
$code.=<<___ if ($flavour !~ /o32/i);	# non-o32 PIC-ification
Packit c4476c
	.cplocal	$Tbl
Packit c4476c
	.cpsetup	$pf,$zero,AES_set_encrypt_key
Packit c4476c
___
Packit c4476c
$code.=<<___;
Packit c4476c
	.set	reorder
Packit c4476c
	$PTR_LA	$Tbl,AES_Te4		# PIC-ified 'load address'
Packit c4476c
Packit c4476c
	bal	_mips_AES_set_encrypt_key
Packit c4476c
Packit c4476c
	.set	noreorder
Packit c4476c
	move	$a0,$t0
Packit c4476c
	$REG_L	$ra,$FRAMESIZE-1*$SZREG($sp)
Packit c4476c
	$REG_L	$fp,$FRAMESIZE-2*$SZREG($sp)
Packit c4476c
___
Packit c4476c
$code.=<<___ if ($flavour =~ /nubi/i);
Packit c4476c
	$REG_L	$s3,$FRAMESIZE-11*$SZREG($sp)
Packit c4476c
	$REG_L	$s2,$FRAMESIZE-12*$SZREG($sp)
Packit c4476c
	$REG_L	$s1,$FRAMESIZE-13*$SZREG($sp)
Packit c4476c
	$REG_L	$s0,$FRAMESIZE-14*$SZREG($sp)
Packit c4476c
	$REG_L	$gp,$FRAMESIZE-15*$SZREG($sp)
Packit c4476c
___
Packit c4476c
$code.=<<___;
Packit c4476c
	jr	$ra
Packit c4476c
	$PTR_ADD $sp,$FRAMESIZE
Packit c4476c
.end	AES_set_encrypt_key
Packit c4476c
___
Packit c4476c

Packit c4476c
my ($head,$tail)=($inp,$bits);
Packit c4476c
my ($tp1,$tp2,$tp4,$tp8,$tp9,$tpb,$tpd,$tpe)=($a4,$a5,$a6,$a7,$s0,$s1,$s2,$s3);
Packit c4476c
my ($m,$x80808080,$x7f7f7f7f,$x1b1b1b1b)=($at,$t0,$t1,$t2);
Packit c4476c
$code.=<<___;
Packit c4476c
.align	5
Packit c4476c
.globl	AES_set_decrypt_key
Packit c4476c
.ent	AES_set_decrypt_key
Packit c4476c
AES_set_decrypt_key:
Packit c4476c
	.frame	$sp,$FRAMESIZE,$ra
Packit c4476c
	.mask	$SAVED_REGS_MASK,-$SZREG
Packit c4476c
	.set	noreorder
Packit c4476c
___
Packit c4476c
$code.=<<___ if ($flavour =~ /o32/i);	# o32 PIC-ification
Packit c4476c
	.cpload	$pf
Packit c4476c
___
Packit c4476c
$code.=<<___;
Packit c4476c
	$PTR_SUB $sp,$FRAMESIZE
Packit c4476c
	$REG_S	$ra,$FRAMESIZE-1*$SZREG($sp)
Packit c4476c
	$REG_S	$fp,$FRAMESIZE-2*$SZREG($sp)
Packit c4476c
___
Packit c4476c
$code.=<<___ if ($flavour =~ /nubi/i);	# optimize non-nubi prologue
Packit c4476c
	$REG_S	$s3,$FRAMESIZE-3*$SZREG($sp)
Packit c4476c
	$REG_S	$s2,$FRAMESIZE-4*$SZREG($sp)
Packit c4476c
	$REG_S	$s1,$FRAMESIZE-5*$SZREG($sp)
Packit c4476c
	$REG_S	$s0,$FRAMESIZE-6*$SZREG($sp)
Packit c4476c
	$REG_S	$gp,$FRAMESIZE-7*$SZREG($sp)
Packit c4476c
___
Packit c4476c
$code.=<<___ if ($flavour !~ /o32/i);	# non-o32 PIC-ification
Packit c4476c
	.cplocal	$Tbl
Packit c4476c
	.cpsetup	$pf,$zero,AES_set_decrypt_key
Packit c4476c
___
Packit c4476c
$code.=<<___;
Packit c4476c
	.set	reorder
Packit c4476c
	$PTR_LA	$Tbl,AES_Te4		# PIC-ified 'load address'
Packit c4476c
Packit c4476c
	bal	_mips_AES_set_encrypt_key
Packit c4476c
Packit c4476c
	bltz	$t0,.Ldkey_done
Packit c4476c
Packit c4476c
	sll	$at,$cnt,4
Packit c4476c
	$PTR_ADD $head,$key,0
Packit c4476c
	$PTR_ADD $tail,$key,$at
Packit c4476c
.align	4
Packit c4476c
.Lswap:
Packit c4476c
	lw	$rk0,0($head)
Packit c4476c
	lw	$rk1,4($head)
Packit c4476c
	lw	$rk2,8($head)
Packit c4476c
	lw	$rk3,12($head)
Packit c4476c
	lw	$rk4,0($tail)
Packit c4476c
	lw	$rk5,4($tail)
Packit c4476c
	lw	$rk6,8($tail)
Packit c4476c
	lw	$rk7,12($tail)
Packit c4476c
	sw	$rk0,0($tail)
Packit c4476c
	sw	$rk1,4($tail)
Packit c4476c
	sw	$rk2,8($tail)
Packit c4476c
	sw	$rk3,12($tail)
Packit c4476c
	$PTR_ADD $head,16
Packit c4476c
	$PTR_SUB $tail,16
Packit c4476c
	sw	$rk4,-16($head)
Packit c4476c
	sw	$rk5,-12($head)
Packit c4476c
	sw	$rk6,-8($head)
Packit c4476c
	sw	$rk7,-4($head)
Packit c4476c
	bne	$head,$tail,.Lswap
Packit c4476c
Packit c4476c
	lw	$tp1,16($key)		# modulo-scheduled
Packit c4476c
	lui	$x80808080,0x8080
Packit c4476c
	subu	$cnt,1
Packit c4476c
	or	$x80808080,0x8080
Packit c4476c
	sll	$cnt,2
Packit c4476c
	$PTR_ADD $key,16
Packit c4476c
	lui	$x1b1b1b1b,0x1b1b
Packit c4476c
	nor	$x7f7f7f7f,$zero,$x80808080
Packit c4476c
	or	$x1b1b1b1b,0x1b1b
Packit c4476c
.align	4
Packit c4476c
.Lmix:
Packit c4476c
	and	$m,$tp1,$x80808080
Packit c4476c
	and	$tp2,$tp1,$x7f7f7f7f
Packit c4476c
	srl	$tp4,$m,7
Packit c4476c
	addu	$tp2,$tp2		# tp2<<1
Packit c4476c
	subu	$m,$tp4
Packit c4476c
	and	$m,$x1b1b1b1b
Packit c4476c
	xor	$tp2,$m
Packit c4476c
Packit c4476c
	and	$m,$tp2,$x80808080
Packit c4476c
	and	$tp4,$tp2,$x7f7f7f7f
Packit c4476c
	srl	$tp8,$m,7
Packit c4476c
	addu	$tp4,$tp4		# tp4<<1
Packit c4476c
	subu	$m,$tp8
Packit c4476c
	and	$m,$x1b1b1b1b
Packit c4476c
	xor	$tp4,$m
Packit c4476c
Packit c4476c
	and	$m,$tp4,$x80808080
Packit c4476c
	and	$tp8,$tp4,$x7f7f7f7f
Packit c4476c
	srl	$tp9,$m,7
Packit c4476c
	addu	$tp8,$tp8		# tp8<<1
Packit c4476c
	subu	$m,$tp9
Packit c4476c
	and	$m,$x1b1b1b1b
Packit c4476c
	xor	$tp8,$m
Packit c4476c
Packit c4476c
	xor	$tp9,$tp8,$tp1
Packit c4476c
	xor	$tpe,$tp8,$tp4
Packit c4476c
	xor	$tpb,$tp9,$tp2
Packit c4476c
	xor	$tpd,$tp9,$tp4
Packit c4476c
Packit c4476c
#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
Packit c4476c
	rotr	$tp1,$tpd,16
Packit c4476c
	 xor	$tpe,$tp2
Packit c4476c
	rotr	$tp2,$tp9,8
Packit c4476c
	xor	$tpe,$tp1
Packit c4476c
	rotr	$tp4,$tpb,24
Packit c4476c
	xor	$tpe,$tp2
Packit c4476c
	lw	$tp1,4($key)		# modulo-scheduled
Packit c4476c
	xor	$tpe,$tp4
Packit c4476c
#else
Packit c4476c
	_ror	$tp1,$tpd,16
Packit c4476c
	 xor	$tpe,$tp2
Packit c4476c
	_ror	$tp2,$tpd,-16
Packit c4476c
	xor	$tpe,$tp1
Packit c4476c
	_ror	$tp1,$tp9,8
Packit c4476c
	xor	$tpe,$tp2
Packit c4476c
	_ror	$tp2,$tp9,-24
Packit c4476c
	xor	$tpe,$tp1
Packit c4476c
	_ror	$tp1,$tpb,24
Packit c4476c
	xor	$tpe,$tp2
Packit c4476c
	_ror	$tp2,$tpb,-8
Packit c4476c
	xor	$tpe,$tp1
Packit c4476c
	lw	$tp1,4($key)		# modulo-scheduled
Packit c4476c
	xor	$tpe,$tp2
Packit c4476c
#endif
Packit c4476c
	subu	$cnt,1
Packit c4476c
	sw	$tpe,0($key)
Packit c4476c
	$PTR_ADD $key,4
Packit c4476c
	bnez	$cnt,.Lmix
Packit c4476c
Packit c4476c
	li	$t0,0
Packit c4476c
.Ldkey_done:
Packit c4476c
	.set	noreorder
Packit c4476c
	move	$a0,$t0
Packit c4476c
	$REG_L	$ra,$FRAMESIZE-1*$SZREG($sp)
Packit c4476c
	$REG_L	$fp,$FRAMESIZE-2*$SZREG($sp)
Packit c4476c
___
Packit c4476c
$code.=<<___ if ($flavour =~ /nubi/i);
Packit c4476c
	$REG_L	$s3,$FRAMESIZE-11*$SZREG($sp)
Packit c4476c
	$REG_L	$s2,$FRAMESIZE-12*$SZREG($sp)
Packit c4476c
	$REG_L	$s1,$FRAMESIZE-13*$SZREG($sp)
Packit c4476c
	$REG_L	$s0,$FRAMESIZE-14*$SZREG($sp)
Packit c4476c
	$REG_L	$gp,$FRAMESIZE-15*$SZREG($sp)
Packit c4476c
___
Packit c4476c
$code.=<<___;
Packit c4476c
	jr	$ra
Packit c4476c
	$PTR_ADD $sp,$FRAMESIZE
Packit c4476c
.end	AES_set_decrypt_key
Packit c4476c
___
Packit c4476c
}}}
Packit c4476c
Packit c4476c
######################################################################
Packit c4476c
# Tables are kept in endian-neutral manner
Packit c4476c
$code.=<<___;
Packit c4476c
.rdata
Packit c4476c
.align	10
Packit c4476c
AES_Te:
Packit c4476c
.byte	0xc6,0x63,0x63,0xa5,	0xf8,0x7c,0x7c,0x84	# Te0
Packit c4476c
.byte	0xee,0x77,0x77,0x99,	0xf6,0x7b,0x7b,0x8d
Packit c4476c
.byte	0xff,0xf2,0xf2,0x0d,	0xd6,0x6b,0x6b,0xbd
Packit c4476c
.byte	0xde,0x6f,0x6f,0xb1,	0x91,0xc5,0xc5,0x54
Packit c4476c
.byte	0x60,0x30,0x30,0x50,	0x02,0x01,0x01,0x03
Packit c4476c
.byte	0xce,0x67,0x67,0xa9,	0x56,0x2b,0x2b,0x7d
Packit c4476c
.byte	0xe7,0xfe,0xfe,0x19,	0xb5,0xd7,0xd7,0x62
Packit c4476c
.byte	0x4d,0xab,0xab,0xe6,	0xec,0x76,0x76,0x9a
Packit c4476c
.byte	0x8f,0xca,0xca,0x45,	0x1f,0x82,0x82,0x9d
Packit c4476c
.byte	0x89,0xc9,0xc9,0x40,	0xfa,0x7d,0x7d,0x87
Packit c4476c
.byte	0xef,0xfa,0xfa,0x15,	0xb2,0x59,0x59,0xeb
Packit c4476c
.byte	0x8e,0x47,0x47,0xc9,	0xfb,0xf0,0xf0,0x0b
Packit c4476c
.byte	0x41,0xad,0xad,0xec,	0xb3,0xd4,0xd4,0x67
Packit c4476c
.byte	0x5f,0xa2,0xa2,0xfd,	0x45,0xaf,0xaf,0xea
Packit c4476c
.byte	0x23,0x9c,0x9c,0xbf,	0x53,0xa4,0xa4,0xf7
Packit c4476c
.byte	0xe4,0x72,0x72,0x96,	0x9b,0xc0,0xc0,0x5b
Packit c4476c
.byte	0x75,0xb7,0xb7,0xc2,	0xe1,0xfd,0xfd,0x1c
Packit c4476c
.byte	0x3d,0x93,0x93,0xae,	0x4c,0x26,0x26,0x6a
Packit c4476c
.byte	0x6c,0x36,0x36,0x5a,	0x7e,0x3f,0x3f,0x41
Packit c4476c
.byte	0xf5,0xf7,0xf7,0x02,	0x83,0xcc,0xcc,0x4f
Packit c4476c
.byte	0x68,0x34,0x34,0x5c,	0x51,0xa5,0xa5,0xf4
Packit c4476c
.byte	0xd1,0xe5,0xe5,0x34,	0xf9,0xf1,0xf1,0x08
Packit c4476c
.byte	0xe2,0x71,0x71,0x93,	0xab,0xd8,0xd8,0x73
Packit c4476c
.byte	0x62,0x31,0x31,0x53,	0x2a,0x15,0x15,0x3f
Packit c4476c
.byte	0x08,0x04,0x04,0x0c,	0x95,0xc7,0xc7,0x52
Packit c4476c
.byte	0x46,0x23,0x23,0x65,	0x9d,0xc3,0xc3,0x5e
Packit c4476c
.byte	0x30,0x18,0x18,0x28,	0x37,0x96,0x96,0xa1
Packit c4476c
.byte	0x0a,0x05,0x05,0x0f,	0x2f,0x9a,0x9a,0xb5
Packit c4476c
.byte	0x0e,0x07,0x07,0x09,	0x24,0x12,0x12,0x36
Packit c4476c
.byte	0x1b,0x80,0x80,0x9b,	0xdf,0xe2,0xe2,0x3d
Packit c4476c
.byte	0xcd,0xeb,0xeb,0x26,	0x4e,0x27,0x27,0x69
Packit c4476c
.byte	0x7f,0xb2,0xb2,0xcd,	0xea,0x75,0x75,0x9f
Packit c4476c
.byte	0x12,0x09,0x09,0x1b,	0x1d,0x83,0x83,0x9e
Packit c4476c
.byte	0x58,0x2c,0x2c,0x74,	0x34,0x1a,0x1a,0x2e
Packit c4476c
.byte	0x36,0x1b,0x1b,0x2d,	0xdc,0x6e,0x6e,0xb2
Packit c4476c
.byte	0xb4,0x5a,0x5a,0xee,	0x5b,0xa0,0xa0,0xfb
Packit c4476c
.byte	0xa4,0x52,0x52,0xf6,	0x76,0x3b,0x3b,0x4d
Packit c4476c
.byte	0xb7,0xd6,0xd6,0x61,	0x7d,0xb3,0xb3,0xce
Packit c4476c
.byte	0x52,0x29,0x29,0x7b,	0xdd,0xe3,0xe3,0x3e
Packit c4476c
.byte	0x5e,0x2f,0x2f,0x71,	0x13,0x84,0x84,0x97
Packit c4476c
.byte	0xa6,0x53,0x53,0xf5,	0xb9,0xd1,0xd1,0x68
Packit c4476c
.byte	0x00,0x00,0x00,0x00,	0xc1,0xed,0xed,0x2c
Packit c4476c
.byte	0x40,0x20,0x20,0x60,	0xe3,0xfc,0xfc,0x1f
Packit c4476c
.byte	0x79,0xb1,0xb1,0xc8,	0xb6,0x5b,0x5b,0xed
Packit c4476c
.byte	0xd4,0x6a,0x6a,0xbe,	0x8d,0xcb,0xcb,0x46
Packit c4476c
.byte	0x67,0xbe,0xbe,0xd9,	0x72,0x39,0x39,0x4b
Packit c4476c
.byte	0x94,0x4a,0x4a,0xde,	0x98,0x4c,0x4c,0xd4
Packit c4476c
.byte	0xb0,0x58,0x58,0xe8,	0x85,0xcf,0xcf,0x4a
Packit c4476c
.byte	0xbb,0xd0,0xd0,0x6b,	0xc5,0xef,0xef,0x2a
Packit c4476c
.byte	0x4f,0xaa,0xaa,0xe5,	0xed,0xfb,0xfb,0x16
Packit c4476c
.byte	0x86,0x43,0x43,0xc5,	0x9a,0x4d,0x4d,0xd7
Packit c4476c
.byte	0x66,0x33,0x33,0x55,	0x11,0x85,0x85,0x94
Packit c4476c
.byte	0x8a,0x45,0x45,0xcf,	0xe9,0xf9,0xf9,0x10
Packit c4476c
.byte	0x04,0x02,0x02,0x06,	0xfe,0x7f,0x7f,0x81
Packit c4476c
.byte	0xa0,0x50,0x50,0xf0,	0x78,0x3c,0x3c,0x44
Packit c4476c
.byte	0x25,0x9f,0x9f,0xba,	0x4b,0xa8,0xa8,0xe3
Packit c4476c
.byte	0xa2,0x51,0x51,0xf3,	0x5d,0xa3,0xa3,0xfe
Packit c4476c
.byte	0x80,0x40,0x40,0xc0,	0x05,0x8f,0x8f,0x8a
Packit c4476c
.byte	0x3f,0x92,0x92,0xad,	0x21,0x9d,0x9d,0xbc
Packit c4476c
.byte	0x70,0x38,0x38,0x48,	0xf1,0xf5,0xf5,0x04
Packit c4476c
.byte	0x63,0xbc,0xbc,0xdf,	0x77,0xb6,0xb6,0xc1
Packit c4476c
.byte	0xaf,0xda,0xda,0x75,	0x42,0x21,0x21,0x63
Packit c4476c
.byte	0x20,0x10,0x10,0x30,	0xe5,0xff,0xff,0x1a
Packit c4476c
.byte	0xfd,0xf3,0xf3,0x0e,	0xbf,0xd2,0xd2,0x6d
Packit c4476c
.byte	0x81,0xcd,0xcd,0x4c,	0x18,0x0c,0x0c,0x14
Packit c4476c
.byte	0x26,0x13,0x13,0x35,	0xc3,0xec,0xec,0x2f
Packit c4476c
.byte	0xbe,0x5f,0x5f,0xe1,	0x35,0x97,0x97,0xa2
Packit c4476c
.byte	0x88,0x44,0x44,0xcc,	0x2e,0x17,0x17,0x39
Packit c4476c
.byte	0x93,0xc4,0xc4,0x57,	0x55,0xa7,0xa7,0xf2
Packit c4476c
.byte	0xfc,0x7e,0x7e,0x82,	0x7a,0x3d,0x3d,0x47
Packit c4476c
.byte	0xc8,0x64,0x64,0xac,	0xba,0x5d,0x5d,0xe7
Packit c4476c
.byte	0x32,0x19,0x19,0x2b,	0xe6,0x73,0x73,0x95
Packit c4476c
.byte	0xc0,0x60,0x60,0xa0,	0x19,0x81,0x81,0x98
Packit c4476c
.byte	0x9e,0x4f,0x4f,0xd1,	0xa3,0xdc,0xdc,0x7f
Packit c4476c
.byte	0x44,0x22,0x22,0x66,	0x54,0x2a,0x2a,0x7e
Packit c4476c
.byte	0x3b,0x90,0x90,0xab,	0x0b,0x88,0x88,0x83
Packit c4476c
.byte	0x8c,0x46,0x46,0xca,	0xc7,0xee,0xee,0x29
Packit c4476c
.byte	0x6b,0xb8,0xb8,0xd3,	0x28,0x14,0x14,0x3c
Packit c4476c
.byte	0xa7,0xde,0xde,0x79,	0xbc,0x5e,0x5e,0xe2
Packit c4476c
.byte	0x16,0x0b,0x0b,0x1d,	0xad,0xdb,0xdb,0x76
Packit c4476c
.byte	0xdb,0xe0,0xe0,0x3b,	0x64,0x32,0x32,0x56
Packit c4476c
.byte	0x74,0x3a,0x3a,0x4e,	0x14,0x0a,0x0a,0x1e
Packit c4476c
.byte	0x92,0x49,0x49,0xdb,	0x0c,0x06,0x06,0x0a
Packit c4476c
.byte	0x48,0x24,0x24,0x6c,	0xb8,0x5c,0x5c,0xe4
Packit c4476c
.byte	0x9f,0xc2,0xc2,0x5d,	0xbd,0xd3,0xd3,0x6e
Packit c4476c
.byte	0x43,0xac,0xac,0xef,	0xc4,0x62,0x62,0xa6
Packit c4476c
.byte	0x39,0x91,0x91,0xa8,	0x31,0x95,0x95,0xa4
Packit c4476c
.byte	0xd3,0xe4,0xe4,0x37,	0xf2,0x79,0x79,0x8b
Packit c4476c
.byte	0xd5,0xe7,0xe7,0x32,	0x8b,0xc8,0xc8,0x43
Packit c4476c
.byte	0x6e,0x37,0x37,0x59,	0xda,0x6d,0x6d,0xb7
Packit c4476c
.byte	0x01,0x8d,0x8d,0x8c,	0xb1,0xd5,0xd5,0x64
Packit c4476c
.byte	0x9c,0x4e,0x4e,0xd2,	0x49,0xa9,0xa9,0xe0
Packit c4476c
.byte	0xd8,0x6c,0x6c,0xb4,	0xac,0x56,0x56,0xfa
Packit c4476c
.byte	0xf3,0xf4,0xf4,0x07,	0xcf,0xea,0xea,0x25
Packit c4476c
.byte	0xca,0x65,0x65,0xaf,	0xf4,0x7a,0x7a,0x8e
Packit c4476c
.byte	0x47,0xae,0xae,0xe9,	0x10,0x08,0x08,0x18
Packit c4476c
.byte	0x6f,0xba,0xba,0xd5,	0xf0,0x78,0x78,0x88
Packit c4476c
.byte	0x4a,0x25,0x25,0x6f,	0x5c,0x2e,0x2e,0x72
Packit c4476c
.byte	0x38,0x1c,0x1c,0x24,	0x57,0xa6,0xa6,0xf1
Packit c4476c
.byte	0x73,0xb4,0xb4,0xc7,	0x97,0xc6,0xc6,0x51
Packit c4476c
.byte	0xcb,0xe8,0xe8,0x23,	0xa1,0xdd,0xdd,0x7c
Packit c4476c
.byte	0xe8,0x74,0x74,0x9c,	0x3e,0x1f,0x1f,0x21
Packit c4476c
.byte	0x96,0x4b,0x4b,0xdd,	0x61,0xbd,0xbd,0xdc
Packit c4476c
.byte	0x0d,0x8b,0x8b,0x86,	0x0f,0x8a,0x8a,0x85
Packit c4476c
.byte	0xe0,0x70,0x70,0x90,	0x7c,0x3e,0x3e,0x42
Packit c4476c
.byte	0x71,0xb5,0xb5,0xc4,	0xcc,0x66,0x66,0xaa
Packit c4476c
.byte	0x90,0x48,0x48,0xd8,	0x06,0x03,0x03,0x05
Packit c4476c
.byte	0xf7,0xf6,0xf6,0x01,	0x1c,0x0e,0x0e,0x12
Packit c4476c
.byte	0xc2,0x61,0x61,0xa3,	0x6a,0x35,0x35,0x5f
Packit c4476c
.byte	0xae,0x57,0x57,0xf9,	0x69,0xb9,0xb9,0xd0
Packit c4476c
.byte	0x17,0x86,0x86,0x91,	0x99,0xc1,0xc1,0x58
Packit c4476c
.byte	0x3a,0x1d,0x1d,0x27,	0x27,0x9e,0x9e,0xb9
Packit c4476c
.byte	0xd9,0xe1,0xe1,0x38,	0xeb,0xf8,0xf8,0x13
Packit c4476c
.byte	0x2b,0x98,0x98,0xb3,	0x22,0x11,0x11,0x33
Packit c4476c
.byte	0xd2,0x69,0x69,0xbb,	0xa9,0xd9,0xd9,0x70
Packit c4476c
.byte	0x07,0x8e,0x8e,0x89,	0x33,0x94,0x94,0xa7
Packit c4476c
.byte	0x2d,0x9b,0x9b,0xb6,	0x3c,0x1e,0x1e,0x22
Packit c4476c
.byte	0x15,0x87,0x87,0x92,	0xc9,0xe9,0xe9,0x20
Packit c4476c
.byte	0x87,0xce,0xce,0x49,	0xaa,0x55,0x55,0xff
Packit c4476c
.byte	0x50,0x28,0x28,0x78,	0xa5,0xdf,0xdf,0x7a
Packit c4476c
.byte	0x03,0x8c,0x8c,0x8f,	0x59,0xa1,0xa1,0xf8
Packit c4476c
.byte	0x09,0x89,0x89,0x80,	0x1a,0x0d,0x0d,0x17
Packit c4476c
.byte	0x65,0xbf,0xbf,0xda,	0xd7,0xe6,0xe6,0x31
Packit c4476c
.byte	0x84,0x42,0x42,0xc6,	0xd0,0x68,0x68,0xb8
Packit c4476c
.byte	0x82,0x41,0x41,0xc3,	0x29,0x99,0x99,0xb0
Packit c4476c
.byte	0x5a,0x2d,0x2d,0x77,	0x1e,0x0f,0x0f,0x11
Packit c4476c
.byte	0x7b,0xb0,0xb0,0xcb,	0xa8,0x54,0x54,0xfc
Packit c4476c
.byte	0x6d,0xbb,0xbb,0xd6,	0x2c,0x16,0x16,0x3a
Packit c4476c
Packit c4476c
AES_Td:
Packit c4476c
.byte	0x51,0xf4,0xa7,0x50,	0x7e,0x41,0x65,0x53	# Td0
Packit c4476c
.byte	0x1a,0x17,0xa4,0xc3,	0x3a,0x27,0x5e,0x96
Packit c4476c
.byte	0x3b,0xab,0x6b,0xcb,	0x1f,0x9d,0x45,0xf1
Packit c4476c
.byte	0xac,0xfa,0x58,0xab,	0x4b,0xe3,0x03,0x93
Packit c4476c
.byte	0x20,0x30,0xfa,0x55,	0xad,0x76,0x6d,0xf6
Packit c4476c
.byte	0x88,0xcc,0x76,0x91,	0xf5,0x02,0x4c,0x25
Packit c4476c
.byte	0x4f,0xe5,0xd7,0xfc,	0xc5,0x2a,0xcb,0xd7
Packit c4476c
.byte	0x26,0x35,0x44,0x80,	0xb5,0x62,0xa3,0x8f
Packit c4476c
.byte	0xde,0xb1,0x5a,0x49,	0x25,0xba,0x1b,0x67
Packit c4476c
.byte	0x45,0xea,0x0e,0x98,	0x5d,0xfe,0xc0,0xe1
Packit c4476c
.byte	0xc3,0x2f,0x75,0x02,	0x81,0x4c,0xf0,0x12
Packit c4476c
.byte	0x8d,0x46,0x97,0xa3,	0x6b,0xd3,0xf9,0xc6
Packit c4476c
.byte	0x03,0x8f,0x5f,0xe7,	0x15,0x92,0x9c,0x95
Packit c4476c
.byte	0xbf,0x6d,0x7a,0xeb,	0x95,0x52,0x59,0xda
Packit c4476c
.byte	0xd4,0xbe,0x83,0x2d,	0x58,0x74,0x21,0xd3
Packit c4476c
.byte	0x49,0xe0,0x69,0x29,	0x8e,0xc9,0xc8,0x44
Packit c4476c
.byte	0x75,0xc2,0x89,0x6a,	0xf4,0x8e,0x79,0x78
Packit c4476c
.byte	0x99,0x58,0x3e,0x6b,	0x27,0xb9,0x71,0xdd
Packit c4476c
.byte	0xbe,0xe1,0x4f,0xb6,	0xf0,0x88,0xad,0x17
Packit c4476c
.byte	0xc9,0x20,0xac,0x66,	0x7d,0xce,0x3a,0xb4
Packit c4476c
.byte	0x63,0xdf,0x4a,0x18,	0xe5,0x1a,0x31,0x82
Packit c4476c
.byte	0x97,0x51,0x33,0x60,	0x62,0x53,0x7f,0x45
Packit c4476c
.byte	0xb1,0x64,0x77,0xe0,	0xbb,0x6b,0xae,0x84
Packit c4476c
.byte	0xfe,0x81,0xa0,0x1c,	0xf9,0x08,0x2b,0x94
Packit c4476c
.byte	0x70,0x48,0x68,0x58,	0x8f,0x45,0xfd,0x19
Packit c4476c
.byte	0x94,0xde,0x6c,0x87,	0x52,0x7b,0xf8,0xb7
Packit c4476c
.byte	0xab,0x73,0xd3,0x23,	0x72,0x4b,0x02,0xe2
Packit c4476c
.byte	0xe3,0x1f,0x8f,0x57,	0x66,0x55,0xab,0x2a
Packit c4476c
.byte	0xb2,0xeb,0x28,0x07,	0x2f,0xb5,0xc2,0x03
Packit c4476c
.byte	0x86,0xc5,0x7b,0x9a,	0xd3,0x37,0x08,0xa5
Packit c4476c
.byte	0x30,0x28,0x87,0xf2,	0x23,0xbf,0xa5,0xb2
Packit c4476c
.byte	0x02,0x03,0x6a,0xba,	0xed,0x16,0x82,0x5c
Packit c4476c
.byte	0x8a,0xcf,0x1c,0x2b,	0xa7,0x79,0xb4,0x92
Packit c4476c
.byte	0xf3,0x07,0xf2,0xf0,	0x4e,0x69,0xe2,0xa1
Packit c4476c
.byte	0x65,0xda,0xf4,0xcd,	0x06,0x05,0xbe,0xd5
Packit c4476c
.byte	0xd1,0x34,0x62,0x1f,	0xc4,0xa6,0xfe,0x8a
Packit c4476c
.byte	0x34,0x2e,0x53,0x9d,	0xa2,0xf3,0x55,0xa0
Packit c4476c
.byte	0x05,0x8a,0xe1,0x32,	0xa4,0xf6,0xeb,0x75
Packit c4476c
.byte	0x0b,0x83,0xec,0x39,	0x40,0x60,0xef,0xaa
Packit c4476c
.byte	0x5e,0x71,0x9f,0x06,	0xbd,0x6e,0x10,0x51
Packit c4476c
.byte	0x3e,0x21,0x8a,0xf9,	0x96,0xdd,0x06,0x3d
Packit c4476c
.byte	0xdd,0x3e,0x05,0xae,	0x4d,0xe6,0xbd,0x46
Packit c4476c
.byte	0x91,0x54,0x8d,0xb5,	0x71,0xc4,0x5d,0x05
Packit c4476c
.byte	0x04,0x06,0xd4,0x6f,	0x60,0x50,0x15,0xff
Packit c4476c
.byte	0x19,0x98,0xfb,0x24,	0xd6,0xbd,0xe9,0x97
Packit c4476c
.byte	0x89,0x40,0x43,0xcc,	0x67,0xd9,0x9e,0x77
Packit c4476c
.byte	0xb0,0xe8,0x42,0xbd,	0x07,0x89,0x8b,0x88
Packit c4476c
.byte	0xe7,0x19,0x5b,0x38,	0x79,0xc8,0xee,0xdb
Packit c4476c
.byte	0xa1,0x7c,0x0a,0x47,	0x7c,0x42,0x0f,0xe9
Packit c4476c
.byte	0xf8,0x84,0x1e,0xc9,	0x00,0x00,0x00,0x00
Packit c4476c
.byte	0x09,0x80,0x86,0x83,	0x32,0x2b,0xed,0x48
Packit c4476c
.byte	0x1e,0x11,0x70,0xac,	0x6c,0x5a,0x72,0x4e
Packit c4476c
.byte	0xfd,0x0e,0xff,0xfb,	0x0f,0x85,0x38,0x56
Packit c4476c
.byte	0x3d,0xae,0xd5,0x1e,	0x36,0x2d,0x39,0x27
Packit c4476c
.byte	0x0a,0x0f,0xd9,0x64,	0x68,0x5c,0xa6,0x21
Packit c4476c
.byte	0x9b,0x5b,0x54,0xd1,	0x24,0x36,0x2e,0x3a
Packit c4476c
.byte	0x0c,0x0a,0x67,0xb1,	0x93,0x57,0xe7,0x0f
Packit c4476c
.byte	0xb4,0xee,0x96,0xd2,	0x1b,0x9b,0x91,0x9e
Packit c4476c
.byte	0x80,0xc0,0xc5,0x4f,	0x61,0xdc,0x20,0xa2
Packit c4476c
.byte	0x5a,0x77,0x4b,0x69,	0x1c,0x12,0x1a,0x16
Packit c4476c
.byte	0xe2,0x93,0xba,0x0a,	0xc0,0xa0,0x2a,0xe5
Packit c4476c
.byte	0x3c,0x22,0xe0,0x43,	0x12,0x1b,0x17,0x1d
Packit c4476c
.byte	0x0e,0x09,0x0d,0x0b,	0xf2,0x8b,0xc7,0xad
Packit c4476c
.byte	0x2d,0xb6,0xa8,0xb9,	0x14,0x1e,0xa9,0xc8
Packit c4476c
.byte	0x57,0xf1,0x19,0x85,	0xaf,0x75,0x07,0x4c
Packit c4476c
.byte	0xee,0x99,0xdd,0xbb,	0xa3,0x7f,0x60,0xfd
Packit c4476c
.byte	0xf7,0x01,0x26,0x9f,	0x5c,0x72,0xf5,0xbc
Packit c4476c
.byte	0x44,0x66,0x3b,0xc5,	0x5b,0xfb,0x7e,0x34
Packit c4476c
.byte	0x8b,0x43,0x29,0x76,	0xcb,0x23,0xc6,0xdc
Packit c4476c
.byte	0xb6,0xed,0xfc,0x68,	0xb8,0xe4,0xf1,0x63
Packit c4476c
.byte	0xd7,0x31,0xdc,0xca,	0x42,0x63,0x85,0x10
Packit c4476c
.byte	0x13,0x97,0x22,0x40,	0x84,0xc6,0x11,0x20
Packit c4476c
.byte	0x85,0x4a,0x24,0x7d,	0xd2,0xbb,0x3d,0xf8
Packit c4476c
.byte	0xae,0xf9,0x32,0x11,	0xc7,0x29,0xa1,0x6d
Packit c4476c
.byte	0x1d,0x9e,0x2f,0x4b,	0xdc,0xb2,0x30,0xf3
Packit c4476c
.byte	0x0d,0x86,0x52,0xec,	0x77,0xc1,0xe3,0xd0
Packit c4476c
.byte	0x2b,0xb3,0x16,0x6c,	0xa9,0x70,0xb9,0x99
Packit c4476c
.byte	0x11,0x94,0x48,0xfa,	0x47,0xe9,0x64,0x22
Packit c4476c
.byte	0xa8,0xfc,0x8c,0xc4,	0xa0,0xf0,0x3f,0x1a
Packit c4476c
.byte	0x56,0x7d,0x2c,0xd8,	0x22,0x33,0x90,0xef
Packit c4476c
.byte	0x87,0x49,0x4e,0xc7,	0xd9,0x38,0xd1,0xc1
Packit c4476c
.byte	0x8c,0xca,0xa2,0xfe,	0x98,0xd4,0x0b,0x36
Packit c4476c
.byte	0xa6,0xf5,0x81,0xcf,	0xa5,0x7a,0xde,0x28
Packit c4476c
.byte	0xda,0xb7,0x8e,0x26,	0x3f,0xad,0xbf,0xa4
Packit c4476c
.byte	0x2c,0x3a,0x9d,0xe4,	0x50,0x78,0x92,0x0d
Packit c4476c
.byte	0x6a,0x5f,0xcc,0x9b,	0x54,0x7e,0x46,0x62
Packit c4476c
.byte	0xf6,0x8d,0x13,0xc2,	0x90,0xd8,0xb8,0xe8
Packit c4476c
.byte	0x2e,0x39,0xf7,0x5e,	0x82,0xc3,0xaf,0xf5
Packit c4476c
.byte	0x9f,0x5d,0x80,0xbe,	0x69,0xd0,0x93,0x7c
Packit c4476c
.byte	0x6f,0xd5,0x2d,0xa9,	0xcf,0x25,0x12,0xb3
Packit c4476c
.byte	0xc8,0xac,0x99,0x3b,	0x10,0x18,0x7d,0xa7
Packit c4476c
.byte	0xe8,0x9c,0x63,0x6e,	0xdb,0x3b,0xbb,0x7b
Packit c4476c
.byte	0xcd,0x26,0x78,0x09,	0x6e,0x59,0x18,0xf4
Packit c4476c
.byte	0xec,0x9a,0xb7,0x01,	0x83,0x4f,0x9a,0xa8
Packit c4476c
.byte	0xe6,0x95,0x6e,0x65,	0xaa,0xff,0xe6,0x7e
Packit c4476c
.byte	0x21,0xbc,0xcf,0x08,	0xef,0x15,0xe8,0xe6
Packit c4476c
.byte	0xba,0xe7,0x9b,0xd9,	0x4a,0x6f,0x36,0xce
Packit c4476c
.byte	0xea,0x9f,0x09,0xd4,	0x29,0xb0,0x7c,0xd6
Packit c4476c
.byte	0x31,0xa4,0xb2,0xaf,	0x2a,0x3f,0x23,0x31
Packit c4476c
.byte	0xc6,0xa5,0x94,0x30,	0x35,0xa2,0x66,0xc0
Packit c4476c
.byte	0x74,0x4e,0xbc,0x37,	0xfc,0x82,0xca,0xa6
Packit c4476c
.byte	0xe0,0x90,0xd0,0xb0,	0x33,0xa7,0xd8,0x15
Packit c4476c
.byte	0xf1,0x04,0x98,0x4a,	0x41,0xec,0xda,0xf7
Packit c4476c
.byte	0x7f,0xcd,0x50,0x0e,	0x17,0x91,0xf6,0x2f
Packit c4476c
.byte	0x76,0x4d,0xd6,0x8d,	0x43,0xef,0xb0,0x4d
Packit c4476c
.byte	0xcc,0xaa,0x4d,0x54,	0xe4,0x96,0x04,0xdf
Packit c4476c
.byte	0x9e,0xd1,0xb5,0xe3,	0x4c,0x6a,0x88,0x1b
Packit c4476c
.byte	0xc1,0x2c,0x1f,0xb8,	0x46,0x65,0x51,0x7f
Packit c4476c
.byte	0x9d,0x5e,0xea,0x04,	0x01,0x8c,0x35,0x5d
Packit c4476c
.byte	0xfa,0x87,0x74,0x73,	0xfb,0x0b,0x41,0x2e
Packit c4476c
.byte	0xb3,0x67,0x1d,0x5a,	0x92,0xdb,0xd2,0x52
Packit c4476c
.byte	0xe9,0x10,0x56,0x33,	0x6d,0xd6,0x47,0x13
Packit c4476c
.byte	0x9a,0xd7,0x61,0x8c,	0x37,0xa1,0x0c,0x7a
Packit c4476c
.byte	0x59,0xf8,0x14,0x8e,	0xeb,0x13,0x3c,0x89
Packit c4476c
.byte	0xce,0xa9,0x27,0xee,	0xb7,0x61,0xc9,0x35
Packit c4476c
.byte	0xe1,0x1c,0xe5,0xed,	0x7a,0x47,0xb1,0x3c
Packit c4476c
.byte	0x9c,0xd2,0xdf,0x59,	0x55,0xf2,0x73,0x3f
Packit c4476c
.byte	0x18,0x14,0xce,0x79,	0x73,0xc7,0x37,0xbf
Packit c4476c
.byte	0x53,0xf7,0xcd,0xea,	0x5f,0xfd,0xaa,0x5b
Packit c4476c
.byte	0xdf,0x3d,0x6f,0x14,	0x78,0x44,0xdb,0x86
Packit c4476c
.byte	0xca,0xaf,0xf3,0x81,	0xb9,0x68,0xc4,0x3e
Packit c4476c
.byte	0x38,0x24,0x34,0x2c,	0xc2,0xa3,0x40,0x5f
Packit c4476c
.byte	0x16,0x1d,0xc3,0x72,	0xbc,0xe2,0x25,0x0c
Packit c4476c
.byte	0x28,0x3c,0x49,0x8b,	0xff,0x0d,0x95,0x41
Packit c4476c
.byte	0x39,0xa8,0x01,0x71,	0x08,0x0c,0xb3,0xde
Packit c4476c
.byte	0xd8,0xb4,0xe4,0x9c,	0x64,0x56,0xc1,0x90
Packit c4476c
.byte	0x7b,0xcb,0x84,0x61,	0xd5,0x32,0xb6,0x70
Packit c4476c
.byte	0x48,0x6c,0x5c,0x74,	0xd0,0xb8,0x57,0x42
Packit c4476c
Packit c4476c
.byte	0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38	# Td4
Packit c4476c
.byte	0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb
Packit c4476c
.byte	0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87
Packit c4476c
.byte	0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb
Packit c4476c
.byte	0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d
Packit c4476c
.byte	0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e
Packit c4476c
.byte	0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2
Packit c4476c
.byte	0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25
Packit c4476c
.byte	0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16
Packit c4476c
.byte	0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92
Packit c4476c
.byte	0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda
Packit c4476c
.byte	0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84
Packit c4476c
.byte	0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a
Packit c4476c
.byte	0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06
Packit c4476c
.byte	0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02
Packit c4476c
.byte	0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b
Packit c4476c
.byte	0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea
Packit c4476c
.byte	0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73
Packit c4476c
.byte	0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85
Packit c4476c
.byte	0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e
Packit c4476c
.byte	0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89
Packit c4476c
.byte	0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b
Packit c4476c
.byte	0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20
Packit c4476c
.byte	0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4
Packit c4476c
.byte	0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31
Packit c4476c
.byte	0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f
Packit c4476c
.byte	0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d
Packit c4476c
.byte	0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef
Packit c4476c
.byte	0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0
Packit c4476c
.byte	0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61
Packit c4476c
.byte	0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26
Packit c4476c
.byte	0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d
Packit c4476c
Packit c4476c
AES_Te4:
Packit c4476c
.byte	0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5	# Te4
Packit c4476c
.byte	0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76
Packit c4476c
.byte	0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0
Packit c4476c
.byte	0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0
Packit c4476c
.byte	0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc
Packit c4476c
.byte	0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15
Packit c4476c
.byte	0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a
Packit c4476c
.byte	0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75
Packit c4476c
.byte	0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0
Packit c4476c
.byte	0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84
Packit c4476c
.byte	0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b
Packit c4476c
.byte	0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf
Packit c4476c
.byte	0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85
Packit c4476c
.byte	0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8
Packit c4476c
.byte	0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5
Packit c4476c
.byte	0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2
Packit c4476c
.byte	0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17
Packit c4476c
.byte	0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73
Packit c4476c
.byte	0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88
Packit c4476c
.byte	0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb
Packit c4476c
.byte	0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c
Packit c4476c
.byte	0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79
Packit c4476c
.byte	0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9
Packit c4476c
.byte	0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08
Packit c4476c
.byte	0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6
Packit c4476c
.byte	0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a
Packit c4476c
.byte	0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e
Packit c4476c
.byte	0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e
Packit c4476c
.byte	0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94
Packit c4476c
.byte	0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf
Packit c4476c
.byte	0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68
Packit c4476c
.byte	0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
Packit c4476c
Packit c4476c
.byte	0x01,0x00,0x00,0x00,	0x02,0x00,0x00,0x00	# rcon
Packit c4476c
.byte	0x04,0x00,0x00,0x00,	0x08,0x00,0x00,0x00
Packit c4476c
.byte	0x10,0x00,0x00,0x00,	0x20,0x00,0x00,0x00
Packit c4476c
.byte	0x40,0x00,0x00,0x00,	0x80,0x00,0x00,0x00
Packit c4476c
.byte	0x1B,0x00,0x00,0x00,	0x36,0x00,0x00,0x00
Packit c4476c
___
Packit c4476c

Packit c4476c
foreach (split("\n",$code)) {
Packit c4476c
	s/\`([^\`]*)\`/eval $1/ge;
Packit c4476c
Packit c4476c
	# made-up _instructions, _xtr, _ins, _ror and _bias, cope
Packit c4476c
	# with byte order dependencies...
Packit c4476c
	if (/^\s+_/) {
Packit c4476c
	    s/(_[a-z]+\s+)(\$[0-9]+),([^,]+)(#.*)*$/$1$2,$2,$3/;
Packit c4476c
Packit c4476c
	    s/_xtr\s+(\$[0-9]+),(\$[0-9]+),([0-9]+(\-2)*)/
Packit c4476c
		sprintf("srl\t$1,$2,%d",$big_endian ?	eval($3)
Packit c4476c
					:		eval("24-$3"))/e or
Packit c4476c
	    s/_ins\s+(\$[0-9]+),(\$[0-9]+),([0-9]+)/
Packit c4476c
		sprintf("sll\t$1,$2,%d",$big_endian ?	eval($3)
Packit c4476c
					:		eval("24-$3"))/e or
Packit c4476c
	    s/_ins2\s+(\$[0-9]+),(\$[0-9]+),([0-9]+)/
Packit c4476c
		sprintf("ins\t$1,$2,%d,8",$big_endian ?	eval($3)
Packit c4476c
					:		eval("24-$3"))/e or
Packit c4476c
	    s/_ror\s+(\$[0-9]+),(\$[0-9]+),(\-?[0-9]+)/
Packit c4476c
		sprintf("srl\t$1,$2,%d",$big_endian ?	eval($3)
Packit c4476c
					:		eval("$3*-1"))/e or
Packit c4476c
	    s/_bias\s+(\$[0-9]+),(\$[0-9]+),([0-9]+)/
Packit c4476c
		sprintf("sll\t$1,$2,%d",$big_endian ?	eval($3)
Packit c4476c
					:		eval("($3-16)&31"))/e;
Packit c4476c
Packit c4476c
	    s/srl\s+(\$[0-9]+),(\$[0-9]+),\-([0-9]+)/
Packit c4476c
		sprintf("sll\t$1,$2,$3")/e				or
Packit c4476c
	    s/srl\s+(\$[0-9]+),(\$[0-9]+),0/
Packit c4476c
		sprintf("and\t$1,$2,0xff")/e				or
Packit c4476c
	    s/(sll\s+\$[0-9]+,\$[0-9]+,0)/#$1/;
Packit c4476c
	}
Packit c4476c
Packit c4476c
	# convert lwl/lwr and swr/swl to little-endian order
Packit c4476c
	if (!$big_endian && /^\s+[sl]w[lr]\s+/) {
Packit c4476c
	    s/([sl]wl.*)([0-9]+)\((\$[0-9]+)\)/
Packit c4476c
		sprintf("$1%d($3)",eval("$2-$2%4+($2%4-1)&3"))/e	or
Packit c4476c
	    s/([sl]wr.*)([0-9]+)\((\$[0-9]+)\)/
Packit c4476c
		sprintf("$1%d($3)",eval("$2-$2%4+($2%4+1)&3"))/e;
Packit c4476c
	}
Packit c4476c
Packit c4476c
	if (!$big_endian) {
Packit c4476c
	    s/(rotr\s+\$[0-9]+,\$[0-9]+),([0-9]+)/sprintf("$1,%d",32-$2)/e;
Packit c4476c
	    s/(ext\s+\$[0-9]+,\$[0-9]+),([0-9]+),8/sprintf("$1,%d,8",24-$2)/e;
Packit c4476c
	}
Packit c4476c
Packit c4476c
	print $_,"\n";
Packit c4476c
}
Packit c4476c
Packit c4476c
close STDOUT or die "error closing STDOUT: $!";