1238384Sjkim#!/usr/bin/env perl
2238384Sjkim
3238384Sjkim# ====================================================================
4238384Sjkim# Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
5238384Sjkim# project. The module is, however, dual licensed under OpenSSL and
6238384Sjkim# CRYPTOGAMS licenses depending on where you obtain it. For further
7238384Sjkim# details see http://www.openssl.org/~appro/cryptogams/.
8238384Sjkim# ====================================================================
9238384Sjkim
10238384Sjkim# AES for MIPS
11238384Sjkim
12238384Sjkim# October 2010
13238384Sjkim#
14238384Sjkim# Code uses 1K[+256B] S-box and on single-issue core [such as R5000]
15238384Sjkim# spends ~68 cycles per byte processed with 128-bit key. This is ~16%
16238384Sjkim# faster than gcc-generated code, which is not very impressive. But
17238384Sjkim# recall that compressed S-box requires extra processing, namely
18238384Sjkim# additional rotations. Rotations are implemented with lwl/lwr pairs,
19238384Sjkim# which is normally used for loading unaligned data. Another cool
20238384Sjkim# thing about this module is its endian neutrality, which means that
21238384Sjkim# it processes data without ever changing byte order...
22238384Sjkim
23290207Sjkim# September 2012
24290207Sjkim#
25290207Sjkim# Add MIPS32R2 (~10% less instructions) and SmartMIPS ASE (further
26290207Sjkim# ~25% less instructions) code. Note that there is no run-time switch,
27290207Sjkim# instead, code path is chosen upon pre-process time, pass -mips32r2
28290207Sjkim# or/and -msmartmips.
29290207Sjkim
30238384Sjkim######################################################################
31238384Sjkim# There is a number of MIPS ABI in use, O32 and N32/64 are most
32238384Sjkim# widely used. Then there is a new contender: NUBI. It appears that if
33238384Sjkim# one picks the latter, it's possible to arrange code in ABI neutral
34238384Sjkim# manner. Therefore let's stick to NUBI register layout:
35238384Sjkim#
36238384Sjkim($zero,$at,$t0,$t1,$t2)=map("\$$_",(0..2,24,25));
37238384Sjkim($a0,$a1,$a2,$a3,$a4,$a5,$a6,$a7)=map("\$$_",(4..11));
38238384Sjkim($s0,$s1,$s2,$s3,$s4,$s5,$s6,$s7,$s8,$s9,$s10,$s11)=map("\$$_",(12..23));
39238384Sjkim($gp,$tp,$sp,$fp,$ra)=map("\$$_",(3,28..31));
40238384Sjkim#
41238384Sjkim# The return value is placed in $a0. Following coding rules facilitate
42238384Sjkim# interoperability:
43238384Sjkim#
44238384Sjkim# - never ever touch $tp, "thread pointer", former $gp;
45238384Sjkim# - copy return value to $t0, former $v0 [or to $a0 if you're adapting
46238384Sjkim#   old code];
47238384Sjkim# - on O32 populate $a4-$a7 with 'lw $aN,4*N($sp)' if necessary;
48238384Sjkim#
49238384Sjkim# For reference here is register layout for N32/64 MIPS ABIs:
50238384Sjkim#
51238384Sjkim# ($zero,$at,$v0,$v1)=map("\$$_",(0..3));
52238384Sjkim# ($a0,$a1,$a2,$a3,$a4,$a5,$a6,$a7)=map("\$$_",(4..11));
53238384Sjkim# ($t0,$t1,$t2,$t3,$t8,$t9)=map("\$$_",(12..15,24,25));
54238384Sjkim# ($s0,$s1,$s2,$s3,$s4,$s5,$s6,$s7)=map("\$$_",(16..23));
55238384Sjkim# ($gp,$sp,$fp,$ra)=map("\$$_",(28..31));
56238384Sjkim#
57290207Sjkim$flavour = shift || "o32"; # supported flavours are o32,n32,64,nubi32,nubi64
58238384Sjkim
59238384Sjkimif ($flavour =~ /64|n32/i) {
60238384Sjkim	$PTR_ADD="dadd";	# incidentally works even on n32
61238384Sjkim	$PTR_SUB="dsub";	# incidentally works even on n32
62290207Sjkim	$PTR_INS="dins";
63238384Sjkim	$REG_S="sd";
64238384Sjkim	$REG_L="ld";
65238384Sjkim	$PTR_SLL="dsll";	# incidentally works even on n32
66238384Sjkim	$SZREG=8;
67238384Sjkim} else {
68238384Sjkim	$PTR_ADD="add";
69238384Sjkim	$PTR_SUB="sub";
70290207Sjkim	$PTR_INS="ins";
71238384Sjkim	$REG_S="sw";
72238384Sjkim	$REG_L="lw";
73238384Sjkim	$PTR_SLL="sll";
74238384Sjkim	$SZREG=4;
75238384Sjkim}
76238384Sjkim$pf = ($flavour =~ /nubi/i) ? $t0 : $t2;
77238384Sjkim#
78238384Sjkim# <appro@openssl.org>
79238384Sjkim#
80238384Sjkim######################################################################
81238384Sjkim
82276861Sjkim$big_endian=(`echo MIPSEL | $ENV{CC} -E -`=~/MIPSEL/)?1:0 if ($ENV{CC});
83238384Sjkim
84238384Sjkimfor (@ARGV) {	$output=$_ if (/^\w[\w\-]*\.\w+$/);	}
85238384Sjkimopen STDOUT,">$output";
86238384Sjkim
87238384Sjkimif (!defined($big_endian))
88238384Sjkim{    $big_endian=(unpack('L',pack('N',1))==1);   }
89238384Sjkim
90238384Sjkimwhile (($output=shift) && ($output!~/^\w[\w\-]*\.\w+$/)) {}
91238384Sjkimopen STDOUT,">$output";
92238384Sjkim
93238384Sjkimmy ($MSB,$LSB)=(0,3);	# automatically converted to little-endian
94238384Sjkim
95238384Sjkim$code.=<<___;
96238384Sjkim.text
97238384Sjkim#ifdef OPENSSL_FIPSCANISTER
98238384Sjkim# include <openssl/fipssyms.h>
99238384Sjkim#endif
100238384Sjkim
101290207Sjkim#if defined(__mips_smartmips) && !defined(_MIPS_ARCH_MIPS32R2)
102290207Sjkim#define _MIPS_ARCH_MIPS32R2
103290207Sjkim#endif
104290207Sjkim
105290207Sjkim#if !defined(__mips_eabi) && (!defined(__vxworks) || defined(__pic__))
106238384Sjkim.option	pic2
107238384Sjkim#endif
108238384Sjkim.set	noat
109238384Sjkim___
110238384Sjkim
111238384Sjkim{{{
112238384Sjkimmy $FRAMESIZE=16*$SZREG;
113238384Sjkimmy $SAVED_REGS_MASK = ($flavour =~ /nubi/i) ? 0xc0fff008 : 0xc0ff0000;
114238384Sjkim
115238384Sjkimmy ($inp,$out,$key,$Tbl,$s0,$s1,$s2,$s3)=($a0,$a1,$a2,$a3,$a4,$a5,$a6,$a7);
116238384Sjkimmy ($i0,$i1,$i2,$i3)=($at,$t0,$t1,$t2);
117238384Sjkimmy ($t0,$t1,$t2,$t3,$t4,$t5,$t6,$t7,$t8,$t9,$t10,$t11) = map("\$$_",(12..23));
118238384Sjkimmy ($key0,$cnt)=($gp,$fp);
119238384Sjkim
120238384Sjkim# instuction ordering is "stolen" from output from MIPSpro assembler
121238384Sjkim# invoked with -mips3 -O3 arguments...
122238384Sjkim$code.=<<___;
123238384Sjkim.align	5
124238384Sjkim.ent	_mips_AES_encrypt
125238384Sjkim_mips_AES_encrypt:
126238384Sjkim	.frame	$sp,0,$ra
127238384Sjkim	.set	reorder
128238384Sjkim	lw	$t0,0($key)
129238384Sjkim	lw	$t1,4($key)
130238384Sjkim	lw	$t2,8($key)
131238384Sjkim	lw	$t3,12($key)
132238384Sjkim	lw	$cnt,240($key)
133238384Sjkim	$PTR_ADD $key0,$key,16
134238384Sjkim
135238384Sjkim	xor	$s0,$t0
136238384Sjkim	xor	$s1,$t1
137238384Sjkim	xor	$s2,$t2
138238384Sjkim	xor	$s3,$t3
139238384Sjkim
140238384Sjkim	sub	$cnt,1
141290207Sjkim#if defined(__mips_smartmips)
142290207Sjkim	ext	$i0,$s1,16,8
143290207Sjkim.Loop_enc:
144290207Sjkim	ext	$i1,$s2,16,8
145290207Sjkim	ext	$i2,$s3,16,8
146290207Sjkim	ext	$i3,$s0,16,8
147290207Sjkim	lwxs	$t0,$i0($Tbl)		# Te1[s1>>16]
148290207Sjkim	ext	$i0,$s2,8,8
149290207Sjkim	lwxs	$t1,$i1($Tbl)		# Te1[s2>>16]
150290207Sjkim	ext	$i1,$s3,8,8
151290207Sjkim	lwxs	$t2,$i2($Tbl)		# Te1[s3>>16]
152290207Sjkim	ext	$i2,$s0,8,8
153290207Sjkim	lwxs	$t3,$i3($Tbl)		# Te1[s0>>16]
154290207Sjkim	ext	$i3,$s1,8,8
155290207Sjkim
156290207Sjkim	lwxs	$t4,$i0($Tbl)		# Te2[s2>>8]
157290207Sjkim	ext	$i0,$s3,0,8
158290207Sjkim	lwxs	$t5,$i1($Tbl)		# Te2[s3>>8]
159290207Sjkim	ext	$i1,$s0,0,8
160290207Sjkim	lwxs	$t6,$i2($Tbl)		# Te2[s0>>8]
161290207Sjkim	ext	$i2,$s1,0,8
162290207Sjkim	lwxs	$t7,$i3($Tbl)		# Te2[s1>>8]
163290207Sjkim	ext	$i3,$s2,0,8
164290207Sjkim
165290207Sjkim	lwxs	$t8,$i0($Tbl)		# Te3[s3]
166290207Sjkim	ext	$i0,$s0,24,8
167290207Sjkim	lwxs	$t9,$i1($Tbl)		# Te3[s0]
168290207Sjkim	ext	$i1,$s1,24,8
169290207Sjkim	lwxs	$t10,$i2($Tbl)		# Te3[s1]
170290207Sjkim	ext	$i2,$s2,24,8
171290207Sjkim	lwxs	$t11,$i3($Tbl)		# Te3[s2]
172290207Sjkim	ext	$i3,$s3,24,8
173290207Sjkim
174290207Sjkim	rotr	$t0,$t0,8
175290207Sjkim	rotr	$t1,$t1,8
176290207Sjkim	rotr	$t2,$t2,8
177290207Sjkim	rotr	$t3,$t3,8
178290207Sjkim
179290207Sjkim	rotr	$t4,$t4,16
180290207Sjkim	rotr	$t5,$t5,16
181290207Sjkim	rotr	$t6,$t6,16
182290207Sjkim	rotr	$t7,$t7,16
183290207Sjkim
184290207Sjkim	xor	$t0,$t4
185290207Sjkim	lwxs	$t4,$i0($Tbl)		# Te0[s0>>24]
186290207Sjkim	xor	$t1,$t5
187290207Sjkim	lwxs	$t5,$i1($Tbl)		# Te0[s1>>24]
188290207Sjkim	xor	$t2,$t6
189290207Sjkim	lwxs	$t6,$i2($Tbl)		# Te0[s2>>24]
190290207Sjkim	xor	$t3,$t7
191290207Sjkim	lwxs	$t7,$i3($Tbl)		# Te0[s3>>24]
192290207Sjkim
193290207Sjkim	rotr	$t8,$t8,24
194290207Sjkim	lw	$s0,0($key0)
195290207Sjkim	rotr	$t9,$t9,24
196290207Sjkim	lw	$s1,4($key0)
197290207Sjkim	rotr	$t10,$t10,24
198290207Sjkim	lw	$s2,8($key0)
199290207Sjkim	rotr	$t11,$t11,24
200290207Sjkim	lw	$s3,12($key0)
201290207Sjkim
202290207Sjkim	xor	$t0,$t8
203290207Sjkim	xor	$t1,$t9
204290207Sjkim	xor	$t2,$t10
205290207Sjkim	xor	$t3,$t11
206290207Sjkim
207290207Sjkim	xor	$t0,$t4
208290207Sjkim	xor	$t1,$t5
209290207Sjkim	xor	$t2,$t6
210290207Sjkim	xor	$t3,$t7
211290207Sjkim
212290207Sjkim	sub	$cnt,1
213290207Sjkim	$PTR_ADD $key0,16
214290207Sjkim	xor	$s0,$t0
215290207Sjkim	xor	$s1,$t1
216290207Sjkim	xor	$s2,$t2
217290207Sjkim	xor	$s3,$t3
218290207Sjkim	.set	noreorder
219290207Sjkim	bnez	$cnt,.Loop_enc
220290207Sjkim	ext	$i0,$s1,16,8
221290207Sjkim
222238384Sjkim	_xtr	$i0,$s1,16-2
223290207Sjkim#else
224290207Sjkim	_xtr	$i0,$s1,16-2
225238384Sjkim.Loop_enc:
226238384Sjkim	_xtr	$i1,$s2,16-2
227238384Sjkim	_xtr	$i2,$s3,16-2
228238384Sjkim	_xtr	$i3,$s0,16-2
229238384Sjkim	and	$i0,0x3fc
230238384Sjkim	and	$i1,0x3fc
231238384Sjkim	and	$i2,0x3fc
232238384Sjkim	and	$i3,0x3fc
233238384Sjkim	$PTR_ADD $i0,$Tbl
234238384Sjkim	$PTR_ADD $i1,$Tbl
235238384Sjkim	$PTR_ADD $i2,$Tbl
236238384Sjkim	$PTR_ADD $i3,$Tbl
237290207Sjkim#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
238290207Sjkim	lw	$t0,0($i0)		# Te1[s1>>16]
239290207Sjkim	_xtr	$i0,$s2,8-2
240290207Sjkim	lw	$t1,0($i1)		# Te1[s2>>16]
241290207Sjkim	_xtr	$i1,$s3,8-2
242290207Sjkim	lw	$t2,0($i2)		# Te1[s3>>16]
243290207Sjkim	_xtr	$i2,$s0,8-2
244290207Sjkim	lw	$t3,0($i3)		# Te1[s0>>16]
245290207Sjkim	_xtr	$i3,$s1,8-2
246290207Sjkim#else
247238384Sjkim	lwl	$t0,3($i0)		# Te1[s1>>16]
248238384Sjkim	lwl	$t1,3($i1)		# Te1[s2>>16]
249238384Sjkim	lwl	$t2,3($i2)		# Te1[s3>>16]
250238384Sjkim	lwl	$t3,3($i3)		# Te1[s0>>16]
251238384Sjkim	lwr	$t0,2($i0)		# Te1[s1>>16]
252290207Sjkim	_xtr	$i0,$s2,8-2
253238384Sjkim	lwr	$t1,2($i1)		# Te1[s2>>16]
254290207Sjkim	_xtr	$i1,$s3,8-2
255238384Sjkim	lwr	$t2,2($i2)		# Te1[s3>>16]
256290207Sjkim	_xtr	$i2,$s0,8-2
257238384Sjkim	lwr	$t3,2($i3)		# Te1[s0>>16]
258238384Sjkim	_xtr	$i3,$s1,8-2
259290207Sjkim#endif
260238384Sjkim	and	$i0,0x3fc
261238384Sjkim	and	$i1,0x3fc
262238384Sjkim	and	$i2,0x3fc
263238384Sjkim	and	$i3,0x3fc
264238384Sjkim	$PTR_ADD $i0,$Tbl
265238384Sjkim	$PTR_ADD $i1,$Tbl
266238384Sjkim	$PTR_ADD $i2,$Tbl
267238384Sjkim	$PTR_ADD $i3,$Tbl
268290207Sjkim#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
269290207Sjkim	rotr	$t0,$t0,8
270290207Sjkim	rotr	$t1,$t1,8
271290207Sjkim	rotr	$t2,$t2,8
272290207Sjkim	rotr	$t3,$t3,8
273290207Sjkim# if defined(_MIPSEL)
274290207Sjkim	lw	$t4,0($i0)		# Te2[s2>>8]
275290207Sjkim	_xtr	$i0,$s3,0-2
276290207Sjkim	lw	$t5,0($i1)		# Te2[s3>>8]
277290207Sjkim	_xtr	$i1,$s0,0-2
278290207Sjkim	lw	$t6,0($i2)		# Te2[s0>>8]
279290207Sjkim	_xtr	$i2,$s1,0-2
280290207Sjkim	lw	$t7,0($i3)		# Te2[s1>>8]
281290207Sjkim	_xtr	$i3,$s2,0-2
282290207Sjkim
283290207Sjkim	and	$i0,0x3fc
284290207Sjkim	and	$i1,0x3fc
285290207Sjkim	and	$i2,0x3fc
286290207Sjkim	and	$i3,0x3fc
287290207Sjkim	$PTR_ADD $i0,$Tbl
288290207Sjkim	$PTR_ADD $i1,$Tbl
289290207Sjkim	$PTR_ADD $i2,$Tbl
290290207Sjkim	$PTR_ADD $i3,$Tbl
291290207Sjkim	lw	$t8,0($i0)		# Te3[s3]
292290207Sjkim	$PTR_INS $i0,$s0,2,8
293290207Sjkim	lw	$t9,0($i1)		# Te3[s0]
294290207Sjkim	$PTR_INS $i1,$s1,2,8
295290207Sjkim	lw	$t10,0($i2)		# Te3[s1]
296290207Sjkim	$PTR_INS $i2,$s2,2,8
297290207Sjkim	lw	$t11,0($i3)		# Te3[s2]
298290207Sjkim	$PTR_INS $i3,$s3,2,8
299290207Sjkim# else
300290207Sjkim	lw	$t4,0($i0)		# Te2[s2>>8]
301290207Sjkim	$PTR_INS $i0,$s3,2,8
302290207Sjkim	lw	$t5,0($i1)		# Te2[s3>>8]
303290207Sjkim	$PTR_INS $i1,$s0,2,8
304290207Sjkim	lw	$t6,0($i2)		# Te2[s0>>8]
305290207Sjkim	$PTR_INS $i2,$s1,2,8
306290207Sjkim	lw	$t7,0($i3)		# Te2[s1>>8]
307290207Sjkim	$PTR_INS $i3,$s2,2,8
308290207Sjkim
309290207Sjkim	lw	$t8,0($i0)		# Te3[s3]
310290207Sjkim	_xtr	$i0,$s0,24-2
311290207Sjkim	lw	$t9,0($i1)		# Te3[s0]
312290207Sjkim	_xtr	$i1,$s1,24-2
313290207Sjkim	lw	$t10,0($i2)		# Te3[s1]
314290207Sjkim	_xtr	$i2,$s2,24-2
315290207Sjkim	lw	$t11,0($i3)		# Te3[s2]
316290207Sjkim	_xtr	$i3,$s3,24-2
317290207Sjkim
318290207Sjkim	and	$i0,0x3fc
319290207Sjkim	and	$i1,0x3fc
320290207Sjkim	and	$i2,0x3fc
321290207Sjkim	and	$i3,0x3fc
322290207Sjkim	$PTR_ADD $i0,$Tbl
323290207Sjkim	$PTR_ADD $i1,$Tbl
324290207Sjkim	$PTR_ADD $i2,$Tbl
325290207Sjkim	$PTR_ADD $i3,$Tbl
326290207Sjkim# endif
327290207Sjkim	rotr	$t4,$t4,16
328290207Sjkim	rotr	$t5,$t5,16
329290207Sjkim	rotr	$t6,$t6,16
330290207Sjkim	rotr	$t7,$t7,16
331290207Sjkim
332290207Sjkim	rotr	$t8,$t8,24
333290207Sjkim	rotr	$t9,$t9,24
334290207Sjkim	rotr	$t10,$t10,24
335290207Sjkim	rotr	$t11,$t11,24
336290207Sjkim#else
337238384Sjkim	lwl	$t4,2($i0)		# Te2[s2>>8]
338238384Sjkim	lwl	$t5,2($i1)		# Te2[s3>>8]
339238384Sjkim	lwl	$t6,2($i2)		# Te2[s0>>8]
340238384Sjkim	lwl	$t7,2($i3)		# Te2[s1>>8]
341238384Sjkim	lwr	$t4,1($i0)		# Te2[s2>>8]
342290207Sjkim	_xtr	$i0,$s3,0-2
343238384Sjkim	lwr	$t5,1($i1)		# Te2[s3>>8]
344290207Sjkim	_xtr	$i1,$s0,0-2
345238384Sjkim	lwr	$t6,1($i2)		# Te2[s0>>8]
346290207Sjkim	_xtr	$i2,$s1,0-2
347238384Sjkim	lwr	$t7,1($i3)		# Te2[s1>>8]
348290207Sjkim	_xtr	$i3,$s2,0-2
349238384Sjkim
350238384Sjkim	and	$i0,0x3fc
351238384Sjkim	and	$i1,0x3fc
352238384Sjkim	and	$i2,0x3fc
353238384Sjkim	and	$i3,0x3fc
354238384Sjkim	$PTR_ADD $i0,$Tbl
355238384Sjkim	$PTR_ADD $i1,$Tbl
356238384Sjkim	$PTR_ADD $i2,$Tbl
357238384Sjkim	$PTR_ADD $i3,$Tbl
358238384Sjkim	lwl	$t8,1($i0)		# Te3[s3]
359238384Sjkim	lwl	$t9,1($i1)		# Te3[s0]
360238384Sjkim	lwl	$t10,1($i2)		# Te3[s1]
361238384Sjkim	lwl	$t11,1($i3)		# Te3[s2]
362238384Sjkim	lwr	$t8,0($i0)		# Te3[s3]
363290207Sjkim	_xtr	$i0,$s0,24-2
364238384Sjkim	lwr	$t9,0($i1)		# Te3[s0]
365290207Sjkim	_xtr	$i1,$s1,24-2
366238384Sjkim	lwr	$t10,0($i2)		# Te3[s1]
367290207Sjkim	_xtr	$i2,$s2,24-2
368238384Sjkim	lwr	$t11,0($i3)		# Te3[s2]
369290207Sjkim	_xtr	$i3,$s3,24-2
370238384Sjkim
371238384Sjkim	and	$i0,0x3fc
372238384Sjkim	and	$i1,0x3fc
373238384Sjkim	and	$i2,0x3fc
374238384Sjkim	and	$i3,0x3fc
375238384Sjkim	$PTR_ADD $i0,$Tbl
376238384Sjkim	$PTR_ADD $i1,$Tbl
377238384Sjkim	$PTR_ADD $i2,$Tbl
378238384Sjkim	$PTR_ADD $i3,$Tbl
379290207Sjkim#endif
380238384Sjkim	xor	$t0,$t4
381290207Sjkim	lw	$t4,0($i0)		# Te0[s0>>24]
382238384Sjkim	xor	$t1,$t5
383290207Sjkim	lw	$t5,0($i1)		# Te0[s1>>24]
384238384Sjkim	xor	$t2,$t6
385290207Sjkim	lw	$t6,0($i2)		# Te0[s2>>24]
386238384Sjkim	xor	$t3,$t7
387238384Sjkim	lw	$t7,0($i3)		# Te0[s3>>24]
388238384Sjkim
389290207Sjkim	xor	$t0,$t8
390238384Sjkim	lw	$s0,0($key0)
391290207Sjkim	xor	$t1,$t9
392238384Sjkim	lw	$s1,4($key0)
393290207Sjkim	xor	$t2,$t10
394238384Sjkim	lw	$s2,8($key0)
395290207Sjkim	xor	$t3,$t11
396238384Sjkim	lw	$s3,12($key0)
397238384Sjkim
398238384Sjkim	xor	$t0,$t4
399238384Sjkim	xor	$t1,$t5
400238384Sjkim	xor	$t2,$t6
401238384Sjkim	xor	$t3,$t7
402238384Sjkim
403238384Sjkim	sub	$cnt,1
404238384Sjkim	$PTR_ADD $key0,16
405238384Sjkim	xor	$s0,$t0
406238384Sjkim	xor	$s1,$t1
407238384Sjkim	xor	$s2,$t2
408238384Sjkim	xor	$s3,$t3
409238384Sjkim	.set	noreorder
410238384Sjkim	bnez	$cnt,.Loop_enc
411238384Sjkim	_xtr	$i0,$s1,16-2
412290207Sjkim#endif
413238384Sjkim
414238384Sjkim	.set	reorder
415238384Sjkim	_xtr	$i1,$s2,16-2
416238384Sjkim	_xtr	$i2,$s3,16-2
417238384Sjkim	_xtr	$i3,$s0,16-2
418238384Sjkim	and	$i0,0x3fc
419238384Sjkim	and	$i1,0x3fc
420238384Sjkim	and	$i2,0x3fc
421238384Sjkim	and	$i3,0x3fc
422238384Sjkim	$PTR_ADD $i0,$Tbl
423238384Sjkim	$PTR_ADD $i1,$Tbl
424238384Sjkim	$PTR_ADD $i2,$Tbl
425238384Sjkim	$PTR_ADD $i3,$Tbl
426238384Sjkim	lbu	$t0,2($i0)		# Te4[s1>>16]
427290207Sjkim	_xtr	$i0,$s2,8-2
428238384Sjkim	lbu	$t1,2($i1)		# Te4[s2>>16]
429290207Sjkim	_xtr	$i1,$s3,8-2
430238384Sjkim	lbu	$t2,2($i2)		# Te4[s3>>16]
431290207Sjkim	_xtr	$i2,$s0,8-2
432238384Sjkim	lbu	$t3,2($i3)		# Te4[s0>>16]
433290207Sjkim	_xtr	$i3,$s1,8-2
434238384Sjkim
435238384Sjkim	and	$i0,0x3fc
436238384Sjkim	and	$i1,0x3fc
437238384Sjkim	and	$i2,0x3fc
438238384Sjkim	and	$i3,0x3fc
439238384Sjkim	$PTR_ADD $i0,$Tbl
440238384Sjkim	$PTR_ADD $i1,$Tbl
441238384Sjkim	$PTR_ADD $i2,$Tbl
442238384Sjkim	$PTR_ADD $i3,$Tbl
443290207Sjkim#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
444290207Sjkim# if defined(_MIPSEL)
445238384Sjkim	lbu	$t4,2($i0)		# Te4[s2>>8]
446290207Sjkim	$PTR_INS $i0,$s0,2,8
447238384Sjkim	lbu	$t5,2($i1)		# Te4[s3>>8]
448290207Sjkim	$PTR_INS $i1,$s1,2,8
449238384Sjkim	lbu	$t6,2($i2)		# Te4[s0>>8]
450290207Sjkim	$PTR_INS $i2,$s2,2,8
451238384Sjkim	lbu	$t7,2($i3)		# Te4[s1>>8]
452290207Sjkim	$PTR_INS $i3,$s3,2,8
453238384Sjkim
454290207Sjkim	lbu	$t8,2($i0)		# Te4[s0>>24]
455290207Sjkim	_xtr	$i0,$s3,0-2
456290207Sjkim	lbu	$t9,2($i1)		# Te4[s1>>24]
457290207Sjkim	_xtr	$i1,$s0,0-2
458290207Sjkim	lbu	$t10,2($i2)		# Te4[s2>>24]
459290207Sjkim	_xtr	$i2,$s1,0-2
460290207Sjkim	lbu	$t11,2($i3)		# Te4[s3>>24]
461290207Sjkim	_xtr	$i3,$s2,0-2
462290207Sjkim
463290207Sjkim	and	$i0,0x3fc
464290207Sjkim	and	$i1,0x3fc
465290207Sjkim	and	$i2,0x3fc
466290207Sjkim	and	$i3,0x3fc
467290207Sjkim	$PTR_ADD $i0,$Tbl
468290207Sjkim	$PTR_ADD $i1,$Tbl
469290207Sjkim	$PTR_ADD $i2,$Tbl
470290207Sjkim	$PTR_ADD $i3,$Tbl
471290207Sjkim# else
472290207Sjkim	lbu	$t4,2($i0)		# Te4[s2>>8]
473238384Sjkim	_xtr	$i0,$s0,24-2
474290207Sjkim	lbu	$t5,2($i1)		# Te4[s3>>8]
475238384Sjkim	_xtr	$i1,$s1,24-2
476290207Sjkim	lbu	$t6,2($i2)		# Te4[s0>>8]
477238384Sjkim	_xtr	$i2,$s2,24-2
478290207Sjkim	lbu	$t7,2($i3)		# Te4[s1>>8]
479238384Sjkim	_xtr	$i3,$s3,24-2
480290207Sjkim
481238384Sjkim	and	$i0,0x3fc
482238384Sjkim	and	$i1,0x3fc
483238384Sjkim	and	$i2,0x3fc
484238384Sjkim	and	$i3,0x3fc
485238384Sjkim	$PTR_ADD $i0,$Tbl
486238384Sjkim	$PTR_ADD $i1,$Tbl
487238384Sjkim	$PTR_ADD $i2,$Tbl
488238384Sjkim	$PTR_ADD $i3,$Tbl
489238384Sjkim	lbu	$t8,2($i0)		# Te4[s0>>24]
490290207Sjkim	$PTR_INS $i0,$s3,2,8
491238384Sjkim	lbu	$t9,2($i1)		# Te4[s1>>24]
492290207Sjkim	$PTR_INS $i1,$s0,2,8
493238384Sjkim	lbu	$t10,2($i2)		# Te4[s2>>24]
494290207Sjkim	$PTR_INS $i2,$s1,2,8
495238384Sjkim	lbu	$t11,2($i3)		# Te4[s3>>24]
496290207Sjkim	$PTR_INS $i3,$s2,2,8
497290207Sjkim# endif
498290207Sjkim	_ins	$t0,16
499290207Sjkim	_ins	$t1,16
500290207Sjkim	_ins	$t2,16
501290207Sjkim	_ins	$t3,16
502238384Sjkim
503290207Sjkim	_ins2	$t0,$t4,8
504290207Sjkim	lbu	$t4,2($i0)		# Te4[s3]
505290207Sjkim	_ins2	$t1,$t5,8
506290207Sjkim	lbu	$t5,2($i1)		# Te4[s0]
507290207Sjkim	_ins2	$t2,$t6,8
508290207Sjkim	lbu	$t6,2($i2)		# Te4[s1]
509290207Sjkim	_ins2	$t3,$t7,8
510290207Sjkim	lbu	$t7,2($i3)		# Te4[s2]
511290207Sjkim
512290207Sjkim	_ins2	$t0,$t8,24
513290207Sjkim	lw	$s0,0($key0)
514290207Sjkim	_ins2	$t1,$t9,24
515290207Sjkim	lw	$s1,4($key0)
516290207Sjkim	_ins2	$t2,$t10,24
517290207Sjkim	lw	$s2,8($key0)
518290207Sjkim	_ins2	$t3,$t11,24
519290207Sjkim	lw	$s3,12($key0)
520290207Sjkim
521290207Sjkim	_ins2	$t0,$t4,0
522290207Sjkim	_ins2	$t1,$t5,0
523290207Sjkim	_ins2	$t2,$t6,0
524290207Sjkim	_ins2	$t3,$t7,0
525290207Sjkim#else
526290207Sjkim	lbu	$t4,2($i0)		# Te4[s2>>8]
527290207Sjkim	_xtr	$i0,$s0,24-2
528290207Sjkim	lbu	$t5,2($i1)		# Te4[s3>>8]
529290207Sjkim	_xtr	$i1,$s1,24-2
530290207Sjkim	lbu	$t6,2($i2)		# Te4[s0>>8]
531290207Sjkim	_xtr	$i2,$s2,24-2
532290207Sjkim	lbu	$t7,2($i3)		# Te4[s1>>8]
533290207Sjkim	_xtr	$i3,$s3,24-2
534290207Sjkim
535290207Sjkim	and	$i0,0x3fc
536290207Sjkim	and	$i1,0x3fc
537290207Sjkim	and	$i2,0x3fc
538290207Sjkim	and	$i3,0x3fc
539290207Sjkim	$PTR_ADD $i0,$Tbl
540290207Sjkim	$PTR_ADD $i1,$Tbl
541290207Sjkim	$PTR_ADD $i2,$Tbl
542290207Sjkim	$PTR_ADD $i3,$Tbl
543290207Sjkim	lbu	$t8,2($i0)		# Te4[s0>>24]
544238384Sjkim	_xtr	$i0,$s3,0-2
545290207Sjkim	lbu	$t9,2($i1)		# Te4[s1>>24]
546238384Sjkim	_xtr	$i1,$s0,0-2
547290207Sjkim	lbu	$t10,2($i2)		# Te4[s2>>24]
548238384Sjkim	_xtr	$i2,$s1,0-2
549290207Sjkim	lbu	$t11,2($i3)		# Te4[s3>>24]
550238384Sjkim	_xtr	$i3,$s2,0-2
551290207Sjkim
552238384Sjkim	and	$i0,0x3fc
553238384Sjkim	and	$i1,0x3fc
554238384Sjkim	and	$i2,0x3fc
555238384Sjkim	and	$i3,0x3fc
556290207Sjkim	$PTR_ADD $i0,$Tbl
557290207Sjkim	$PTR_ADD $i1,$Tbl
558290207Sjkim	$PTR_ADD $i2,$Tbl
559290207Sjkim	$PTR_ADD $i3,$Tbl
560238384Sjkim
561238384Sjkim	_ins	$t0,16
562238384Sjkim	_ins	$t1,16
563238384Sjkim	_ins	$t2,16
564238384Sjkim	_ins	$t3,16
565238384Sjkim
566238384Sjkim	_ins	$t4,8
567238384Sjkim	_ins	$t5,8
568238384Sjkim	_ins	$t6,8
569238384Sjkim	_ins	$t7,8
570238384Sjkim
571238384Sjkim	xor	$t0,$t4
572290207Sjkim	lbu	$t4,2($i0)		# Te4[s3]
573238384Sjkim	xor	$t1,$t5
574290207Sjkim	lbu	$t5,2($i1)		# Te4[s0]
575238384Sjkim	xor	$t2,$t6
576290207Sjkim	lbu	$t6,2($i2)		# Te4[s1]
577238384Sjkim	xor	$t3,$t7
578238384Sjkim	lbu	$t7,2($i3)		# Te4[s2]
579238384Sjkim
580238384Sjkim	_ins	$t8,24
581290207Sjkim	lw	$s0,0($key0)
582238384Sjkim	_ins	$t9,24
583290207Sjkim	lw	$s1,4($key0)
584238384Sjkim	_ins	$t10,24
585290207Sjkim	lw	$s2,8($key0)
586238384Sjkim	_ins	$t11,24
587238384Sjkim	lw	$s3,12($key0)
588238384Sjkim
589238384Sjkim	xor	$t0,$t8
590238384Sjkim	xor	$t1,$t9
591238384Sjkim	xor	$t2,$t10
592238384Sjkim	xor	$t3,$t11
593238384Sjkim
594238384Sjkim	_ins	$t4,0
595238384Sjkim	_ins	$t5,0
596238384Sjkim	_ins	$t6,0
597238384Sjkim	_ins	$t7,0
598238384Sjkim
599238384Sjkim	xor	$t0,$t4
600238384Sjkim	xor	$t1,$t5
601238384Sjkim	xor	$t2,$t6
602238384Sjkim	xor	$t3,$t7
603290207Sjkim#endif
604238384Sjkim	xor	$s0,$t0
605238384Sjkim	xor	$s1,$t1
606238384Sjkim	xor	$s2,$t2
607238384Sjkim	xor	$s3,$t3
608238384Sjkim
609238384Sjkim	jr	$ra
610238384Sjkim.end	_mips_AES_encrypt
611238384Sjkim
612238384Sjkim.align	5
613238384Sjkim.globl	AES_encrypt
614238384Sjkim.ent	AES_encrypt
615238384SjkimAES_encrypt:
616238384Sjkim	.frame	$sp,$FRAMESIZE,$ra
617238384Sjkim	.mask	$SAVED_REGS_MASK,-$SZREG
618238384Sjkim	.set	noreorder
619238384Sjkim___
620238384Sjkim$code.=<<___ if ($flavour =~ /o32/i);	# o32 PIC-ification
621238384Sjkim	.cpload	$pf
622238384Sjkim___
623238384Sjkim$code.=<<___;
624238384Sjkim	$PTR_SUB $sp,$FRAMESIZE
625238384Sjkim	$REG_S	$ra,$FRAMESIZE-1*$SZREG($sp)
626238384Sjkim	$REG_S	$fp,$FRAMESIZE-2*$SZREG($sp)
627238384Sjkim	$REG_S	$s11,$FRAMESIZE-3*$SZREG($sp)
628238384Sjkim	$REG_S	$s10,$FRAMESIZE-4*$SZREG($sp)
629238384Sjkim	$REG_S	$s9,$FRAMESIZE-5*$SZREG($sp)
630238384Sjkim	$REG_S	$s8,$FRAMESIZE-6*$SZREG($sp)
631238384Sjkim	$REG_S	$s7,$FRAMESIZE-7*$SZREG($sp)
632238384Sjkim	$REG_S	$s6,$FRAMESIZE-8*$SZREG($sp)
633238384Sjkim	$REG_S	$s5,$FRAMESIZE-9*$SZREG($sp)
634238384Sjkim	$REG_S	$s4,$FRAMESIZE-10*$SZREG($sp)
635238384Sjkim___
636238384Sjkim$code.=<<___ if ($flavour =~ /nubi/i);	# optimize non-nubi prologue
637238384Sjkim	$REG_S	\$15,$FRAMESIZE-11*$SZREG($sp)
638238384Sjkim	$REG_S	\$14,$FRAMESIZE-12*$SZREG($sp)
639238384Sjkim	$REG_S	\$13,$FRAMESIZE-13*$SZREG($sp)
640238384Sjkim	$REG_S	\$12,$FRAMESIZE-14*$SZREG($sp)
641238384Sjkim	$REG_S	$gp,$FRAMESIZE-15*$SZREG($sp)
642238384Sjkim___
643238384Sjkim$code.=<<___ if ($flavour !~ /o32/i);	# non-o32 PIC-ification
644238384Sjkim	.cplocal	$Tbl
645238384Sjkim	.cpsetup	$pf,$zero,AES_encrypt
646238384Sjkim___
647238384Sjkim$code.=<<___;
648238384Sjkim	.set	reorder
649238384Sjkim	la	$Tbl,AES_Te		# PIC-ified 'load address'
650238384Sjkim
651238384Sjkim	lwl	$s0,0+$MSB($inp)
652238384Sjkim	lwl	$s1,4+$MSB($inp)
653238384Sjkim	lwl	$s2,8+$MSB($inp)
654238384Sjkim	lwl	$s3,12+$MSB($inp)
655238384Sjkim	lwr	$s0,0+$LSB($inp)
656238384Sjkim	lwr	$s1,4+$LSB($inp)
657238384Sjkim	lwr	$s2,8+$LSB($inp)
658238384Sjkim	lwr	$s3,12+$LSB($inp)
659238384Sjkim
660238384Sjkim	bal	_mips_AES_encrypt
661238384Sjkim
662238384Sjkim	swr	$s0,0+$LSB($out)
663238384Sjkim	swr	$s1,4+$LSB($out)
664238384Sjkim	swr	$s2,8+$LSB($out)
665238384Sjkim	swr	$s3,12+$LSB($out)
666238384Sjkim	swl	$s0,0+$MSB($out)
667238384Sjkim	swl	$s1,4+$MSB($out)
668238384Sjkim	swl	$s2,8+$MSB($out)
669238384Sjkim	swl	$s3,12+$MSB($out)
670238384Sjkim
671238384Sjkim	.set	noreorder
672238384Sjkim	$REG_L	$ra,$FRAMESIZE-1*$SZREG($sp)
673238384Sjkim	$REG_L	$fp,$FRAMESIZE-2*$SZREG($sp)
674238384Sjkim	$REG_L	$s11,$FRAMESIZE-3*$SZREG($sp)
675238384Sjkim	$REG_L	$s10,$FRAMESIZE-4*$SZREG($sp)
676238384Sjkim	$REG_L	$s9,$FRAMESIZE-5*$SZREG($sp)
677238384Sjkim	$REG_L	$s8,$FRAMESIZE-6*$SZREG($sp)
678238384Sjkim	$REG_L	$s7,$FRAMESIZE-7*$SZREG($sp)
679238384Sjkim	$REG_L	$s6,$FRAMESIZE-8*$SZREG($sp)
680238384Sjkim	$REG_L	$s5,$FRAMESIZE-9*$SZREG($sp)
681238384Sjkim	$REG_L	$s4,$FRAMESIZE-10*$SZREG($sp)
682238384Sjkim___
683238384Sjkim$code.=<<___ if ($flavour =~ /nubi/i);
684238384Sjkim	$REG_L	\$15,$FRAMESIZE-11*$SZREG($sp)
685238384Sjkim	$REG_L	\$14,$FRAMESIZE-12*$SZREG($sp)
686238384Sjkim	$REG_L	\$13,$FRAMESIZE-13*$SZREG($sp)
687238384Sjkim	$REG_L	\$12,$FRAMESIZE-14*$SZREG($sp)
688238384Sjkim	$REG_L	$gp,$FRAMESIZE-15*$SZREG($sp)
689238384Sjkim___
690238384Sjkim$code.=<<___;
691238384Sjkim	jr	$ra
692238384Sjkim	$PTR_ADD $sp,$FRAMESIZE
693238384Sjkim.end	AES_encrypt
694238384Sjkim___
695238384Sjkim
696238384Sjkim$code.=<<___;
697238384Sjkim.align	5
698238384Sjkim.ent	_mips_AES_decrypt
699238384Sjkim_mips_AES_decrypt:
700238384Sjkim	.frame	$sp,0,$ra
701238384Sjkim	.set	reorder
702238384Sjkim	lw	$t0,0($key)
703238384Sjkim	lw	$t1,4($key)
704238384Sjkim	lw	$t2,8($key)
705238384Sjkim	lw	$t3,12($key)
706238384Sjkim	lw	$cnt,240($key)
707238384Sjkim	$PTR_ADD $key0,$key,16
708238384Sjkim
709238384Sjkim	xor	$s0,$t0
710238384Sjkim	xor	$s1,$t1
711238384Sjkim	xor	$s2,$t2
712238384Sjkim	xor	$s3,$t3
713238384Sjkim
714238384Sjkim	sub	$cnt,1
715290207Sjkim#if defined(__mips_smartmips)
716290207Sjkim	ext	$i0,$s3,16,8
717290207Sjkim.Loop_dec:
718290207Sjkim	ext	$i1,$s0,16,8
719290207Sjkim	ext	$i2,$s1,16,8
720290207Sjkim	ext	$i3,$s2,16,8
721290207Sjkim	lwxs	$t0,$i0($Tbl)		# Td1[s3>>16]
722290207Sjkim	ext	$i0,$s2,8,8
723290207Sjkim	lwxs	$t1,$i1($Tbl)		# Td1[s0>>16]
724290207Sjkim	ext	$i1,$s3,8,8
725290207Sjkim	lwxs	$t2,$i2($Tbl)		# Td1[s1>>16]
726290207Sjkim	ext	$i2,$s0,8,8
727290207Sjkim	lwxs	$t3,$i3($Tbl)		# Td1[s2>>16]
728290207Sjkim	ext	$i3,$s1,8,8
729290207Sjkim
730290207Sjkim	lwxs	$t4,$i0($Tbl)		# Td2[s2>>8]
731290207Sjkim	ext	$i0,$s1,0,8
732290207Sjkim	lwxs	$t5,$i1($Tbl)		# Td2[s3>>8]
733290207Sjkim	ext	$i1,$s2,0,8
734290207Sjkim	lwxs	$t6,$i2($Tbl)		# Td2[s0>>8]
735290207Sjkim	ext	$i2,$s3,0,8
736290207Sjkim	lwxs	$t7,$i3($Tbl)		# Td2[s1>>8]
737290207Sjkim	ext	$i3,$s0,0,8
738290207Sjkim
739290207Sjkim	lwxs	$t8,$i0($Tbl)		# Td3[s1]
740290207Sjkim	ext	$i0,$s0,24,8
741290207Sjkim	lwxs	$t9,$i1($Tbl)		# Td3[s2]
742290207Sjkim	ext	$i1,$s1,24,8
743290207Sjkim	lwxs	$t10,$i2($Tbl)		# Td3[s3]
744290207Sjkim	ext	$i2,$s2,24,8
745290207Sjkim	lwxs	$t11,$i3($Tbl)		# Td3[s0]
746290207Sjkim	ext	$i3,$s3,24,8
747290207Sjkim
748290207Sjkim	rotr	$t0,$t0,8
749290207Sjkim	rotr	$t1,$t1,8
750290207Sjkim	rotr	$t2,$t2,8
751290207Sjkim	rotr	$t3,$t3,8
752290207Sjkim
753290207Sjkim	rotr	$t4,$t4,16
754290207Sjkim	rotr	$t5,$t5,16
755290207Sjkim	rotr	$t6,$t6,16
756290207Sjkim	rotr	$t7,$t7,16
757290207Sjkim
758290207Sjkim	xor	$t0,$t4
759290207Sjkim	lwxs	$t4,$i0($Tbl)		# Td0[s0>>24]
760290207Sjkim	xor	$t1,$t5
761290207Sjkim	lwxs	$t5,$i1($Tbl)		# Td0[s1>>24]
762290207Sjkim	xor	$t2,$t6
763290207Sjkim	lwxs	$t6,$i2($Tbl)		# Td0[s2>>24]
764290207Sjkim	xor	$t3,$t7
765290207Sjkim	lwxs	$t7,$i3($Tbl)		# Td0[s3>>24]
766290207Sjkim
767290207Sjkim	rotr	$t8,$t8,24
768290207Sjkim	lw	$s0,0($key0)
769290207Sjkim	rotr	$t9,$t9,24
770290207Sjkim	lw	$s1,4($key0)
771290207Sjkim	rotr	$t10,$t10,24
772290207Sjkim	lw	$s2,8($key0)
773290207Sjkim	rotr	$t11,$t11,24
774290207Sjkim	lw	$s3,12($key0)
775290207Sjkim
776290207Sjkim	xor	$t0,$t8
777290207Sjkim	xor	$t1,$t9
778290207Sjkim	xor	$t2,$t10
779290207Sjkim	xor	$t3,$t11
780290207Sjkim
781290207Sjkim	xor	$t0,$t4
782290207Sjkim	xor	$t1,$t5
783290207Sjkim	xor	$t2,$t6
784290207Sjkim	xor	$t3,$t7
785290207Sjkim
786290207Sjkim	sub	$cnt,1
787290207Sjkim	$PTR_ADD $key0,16
788290207Sjkim	xor	$s0,$t0
789290207Sjkim	xor	$s1,$t1
790290207Sjkim	xor	$s2,$t2
791290207Sjkim	xor	$s3,$t3
792290207Sjkim	.set	noreorder
793290207Sjkim	bnez	$cnt,.Loop_dec
794290207Sjkim	ext	$i0,$s3,16,8
795290207Sjkim
796238384Sjkim	_xtr	$i0,$s3,16-2
797290207Sjkim#else
798290207Sjkim	_xtr	$i0,$s3,16-2
799238384Sjkim.Loop_dec:
800238384Sjkim	_xtr	$i1,$s0,16-2
801238384Sjkim	_xtr	$i2,$s1,16-2
802238384Sjkim	_xtr	$i3,$s2,16-2
803238384Sjkim	and	$i0,0x3fc
804238384Sjkim	and	$i1,0x3fc
805238384Sjkim	and	$i2,0x3fc
806238384Sjkim	and	$i3,0x3fc
807238384Sjkim	$PTR_ADD $i0,$Tbl
808238384Sjkim	$PTR_ADD $i1,$Tbl
809238384Sjkim	$PTR_ADD $i2,$Tbl
810238384Sjkim	$PTR_ADD $i3,$Tbl
811290207Sjkim#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
812290207Sjkim	lw	$t0,0($i0)		# Td1[s3>>16]
813290207Sjkim	_xtr	$i0,$s2,8-2
814290207Sjkim	lw	$t1,0($i1)		# Td1[s0>>16]
815290207Sjkim	_xtr	$i1,$s3,8-2
816290207Sjkim	lw	$t2,0($i2)		# Td1[s1>>16]
817290207Sjkim	_xtr	$i2,$s0,8-2
818290207Sjkim	lw	$t3,0($i3)		# Td1[s2>>16]
819290207Sjkim	_xtr	$i3,$s1,8-2
820290207Sjkim#else
821238384Sjkim	lwl	$t0,3($i0)		# Td1[s3>>16]
822238384Sjkim	lwl	$t1,3($i1)		# Td1[s0>>16]
823238384Sjkim	lwl	$t2,3($i2)		# Td1[s1>>16]
824238384Sjkim	lwl	$t3,3($i3)		# Td1[s2>>16]
825238384Sjkim	lwr	$t0,2($i0)		# Td1[s3>>16]
826290207Sjkim	_xtr	$i0,$s2,8-2
827238384Sjkim	lwr	$t1,2($i1)		# Td1[s0>>16]
828290207Sjkim	_xtr	$i1,$s3,8-2
829238384Sjkim	lwr	$t2,2($i2)		# Td1[s1>>16]
830290207Sjkim	_xtr	$i2,$s0,8-2
831238384Sjkim	lwr	$t3,2($i3)		# Td1[s2>>16]
832290207Sjkim	_xtr	$i3,$s1,8-2
833290207Sjkim#endif
834238384Sjkim
835238384Sjkim	and	$i0,0x3fc
836238384Sjkim	and	$i1,0x3fc
837238384Sjkim	and	$i2,0x3fc
838238384Sjkim	and	$i3,0x3fc
839238384Sjkim	$PTR_ADD $i0,$Tbl
840238384Sjkim	$PTR_ADD $i1,$Tbl
841238384Sjkim	$PTR_ADD $i2,$Tbl
842238384Sjkim	$PTR_ADD $i3,$Tbl
843290207Sjkim#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
844290207Sjkim	rotr	$t0,$t0,8
845290207Sjkim	rotr	$t1,$t1,8
846290207Sjkim	rotr	$t2,$t2,8
847290207Sjkim	rotr	$t3,$t3,8
848290207Sjkim# if defined(_MIPSEL)
849290207Sjkim	lw	$t4,0($i0)		# Td2[s2>>8]
850290207Sjkim	_xtr	$i0,$s1,0-2
851290207Sjkim	lw	$t5,0($i1)		# Td2[s3>>8]
852290207Sjkim	_xtr	$i1,$s2,0-2
853290207Sjkim	lw	$t6,0($i2)		# Td2[s0>>8]
854290207Sjkim	_xtr	$i2,$s3,0-2
855290207Sjkim	lw	$t7,0($i3)		# Td2[s1>>8]
856290207Sjkim	_xtr	$i3,$s0,0-2
857290207Sjkim
858290207Sjkim	and	$i0,0x3fc
859290207Sjkim	and	$i1,0x3fc
860290207Sjkim	and	$i2,0x3fc
861290207Sjkim	and	$i3,0x3fc
862290207Sjkim	$PTR_ADD $i0,$Tbl
863290207Sjkim	$PTR_ADD $i1,$Tbl
864290207Sjkim	$PTR_ADD $i2,$Tbl
865290207Sjkim	$PTR_ADD $i3,$Tbl
866290207Sjkim	lw	$t8,0($i0)		# Td3[s1]
867290207Sjkim	$PTR_INS $i0,$s0,2,8
868290207Sjkim	lw	$t9,0($i1)		# Td3[s2]
869290207Sjkim	$PTR_INS $i1,$s1,2,8
870290207Sjkim	lw	$t10,0($i2)		# Td3[s3]
871290207Sjkim	$PTR_INS $i2,$s2,2,8
872290207Sjkim	lw	$t11,0($i3)		# Td3[s0]
873290207Sjkim	$PTR_INS $i3,$s3,2,8
874290207Sjkim#else
875290207Sjkim	lw	$t4,0($i0)		# Td2[s2>>8]
876290207Sjkim	$PTR_INS $i0,$s1,2,8
877290207Sjkim	lw	$t5,0($i1)		# Td2[s3>>8]
878290207Sjkim	$PTR_INS $i1,$s2,2,8
879290207Sjkim	lw	$t6,0($i2)		# Td2[s0>>8]
880290207Sjkim	$PTR_INS $i2,$s3,2,8
881290207Sjkim	lw	$t7,0($i3)		# Td2[s1>>8]
882290207Sjkim	$PTR_INS $i3,$s0,2,8
883290207Sjkim
884290207Sjkim	lw	$t8,0($i0)		# Td3[s1]
885290207Sjkim	_xtr	$i0,$s0,24-2
886290207Sjkim	lw	$t9,0($i1)		# Td3[s2]
887290207Sjkim	_xtr	$i1,$s1,24-2
888290207Sjkim	lw	$t10,0($i2)		# Td3[s3]
889290207Sjkim	_xtr	$i2,$s2,24-2
890290207Sjkim	lw	$t11,0($i3)		# Td3[s0]
891290207Sjkim	_xtr	$i3,$s3,24-2
892290207Sjkim
893290207Sjkim	and	$i0,0x3fc
894290207Sjkim	and	$i1,0x3fc
895290207Sjkim	and	$i2,0x3fc
896290207Sjkim	and	$i3,0x3fc
897290207Sjkim	$PTR_ADD $i0,$Tbl
898290207Sjkim	$PTR_ADD $i1,$Tbl
899290207Sjkim	$PTR_ADD $i2,$Tbl
900290207Sjkim	$PTR_ADD $i3,$Tbl
901290207Sjkim#endif
902290207Sjkim	rotr	$t4,$t4,16
903290207Sjkim	rotr	$t5,$t5,16
904290207Sjkim	rotr	$t6,$t6,16
905290207Sjkim	rotr	$t7,$t7,16
906290207Sjkim
907290207Sjkim	rotr	$t8,$t8,24
908290207Sjkim	rotr	$t9,$t9,24
909290207Sjkim	rotr	$t10,$t10,24
910290207Sjkim	rotr	$t11,$t11,24
911290207Sjkim#else
912238384Sjkim	lwl	$t4,2($i0)		# Td2[s2>>8]
913238384Sjkim	lwl	$t5,2($i1)		# Td2[s3>>8]
914238384Sjkim	lwl	$t6,2($i2)		# Td2[s0>>8]
915238384Sjkim	lwl	$t7,2($i3)		# Td2[s1>>8]
916238384Sjkim	lwr	$t4,1($i0)		# Td2[s2>>8]
917290207Sjkim	_xtr	$i0,$s1,0-2
918238384Sjkim	lwr	$t5,1($i1)		# Td2[s3>>8]
919290207Sjkim	_xtr	$i1,$s2,0-2
920238384Sjkim	lwr	$t6,1($i2)		# Td2[s0>>8]
921290207Sjkim	_xtr	$i2,$s3,0-2
922238384Sjkim	lwr	$t7,1($i3)		# Td2[s1>>8]
923290207Sjkim	_xtr	$i3,$s0,0-2
924238384Sjkim
925238384Sjkim	and	$i0,0x3fc
926238384Sjkim	and	$i1,0x3fc
927238384Sjkim	and	$i2,0x3fc
928238384Sjkim	and	$i3,0x3fc
929238384Sjkim	$PTR_ADD $i0,$Tbl
930238384Sjkim	$PTR_ADD $i1,$Tbl
931238384Sjkim	$PTR_ADD $i2,$Tbl
932238384Sjkim	$PTR_ADD $i3,$Tbl
933238384Sjkim	lwl	$t8,1($i0)		# Td3[s1]
934238384Sjkim	lwl	$t9,1($i1)		# Td3[s2]
935238384Sjkim	lwl	$t10,1($i2)		# Td3[s3]
936238384Sjkim	lwl	$t11,1($i3)		# Td3[s0]
937238384Sjkim	lwr	$t8,0($i0)		# Td3[s1]
938290207Sjkim	_xtr	$i0,$s0,24-2
939238384Sjkim	lwr	$t9,0($i1)		# Td3[s2]
940290207Sjkim	_xtr	$i1,$s1,24-2
941238384Sjkim	lwr	$t10,0($i2)		# Td3[s3]
942290207Sjkim	_xtr	$i2,$s2,24-2
943238384Sjkim	lwr	$t11,0($i3)		# Td3[s0]
944290207Sjkim	_xtr	$i3,$s3,24-2
945238384Sjkim
946238384Sjkim	and	$i0,0x3fc
947238384Sjkim	and	$i1,0x3fc
948238384Sjkim	and	$i2,0x3fc
949238384Sjkim	and	$i3,0x3fc
950238384Sjkim	$PTR_ADD $i0,$Tbl
951238384Sjkim	$PTR_ADD $i1,$Tbl
952238384Sjkim	$PTR_ADD $i2,$Tbl
953238384Sjkim	$PTR_ADD $i3,$Tbl
954290207Sjkim#endif
955238384Sjkim
956238384Sjkim	xor	$t0,$t4
957290207Sjkim	lw	$t4,0($i0)		# Td0[s0>>24]
958238384Sjkim	xor	$t1,$t5
959290207Sjkim	lw	$t5,0($i1)		# Td0[s1>>24]
960238384Sjkim	xor	$t2,$t6
961290207Sjkim	lw	$t6,0($i2)		# Td0[s2>>24]
962238384Sjkim	xor	$t3,$t7
963238384Sjkim	lw	$t7,0($i3)		# Td0[s3>>24]
964238384Sjkim
965290207Sjkim	xor	$t0,$t8
966238384Sjkim	lw	$s0,0($key0)
967290207Sjkim	xor	$t1,$t9
968238384Sjkim	lw	$s1,4($key0)
969290207Sjkim	xor	$t2,$t10
970238384Sjkim	lw	$s2,8($key0)
971290207Sjkim	xor	$t3,$t11
972238384Sjkim	lw	$s3,12($key0)
973238384Sjkim
974238384Sjkim	xor	$t0,$t4
975238384Sjkim	xor	$t1,$t5
976238384Sjkim	xor	$t2,$t6
977238384Sjkim	xor	$t3,$t7
978238384Sjkim
979238384Sjkim	sub	$cnt,1
980238384Sjkim	$PTR_ADD $key0,16
981238384Sjkim	xor	$s0,$t0
982238384Sjkim	xor	$s1,$t1
983238384Sjkim	xor	$s2,$t2
984238384Sjkim	xor	$s3,$t3
985238384Sjkim	.set	noreorder
986238384Sjkim	bnez	$cnt,.Loop_dec
987238384Sjkim	_xtr	$i0,$s3,16-2
988290207Sjkim#endif
989238384Sjkim
990238384Sjkim	.set	reorder
991238384Sjkim	lw	$t4,1024($Tbl)		# prefetch Td4
992290207Sjkim	_xtr	$i0,$s3,16
993238384Sjkim	lw	$t5,1024+32($Tbl)
994290207Sjkim	_xtr	$i1,$s0,16
995238384Sjkim	lw	$t6,1024+64($Tbl)
996290207Sjkim	_xtr	$i2,$s1,16
997238384Sjkim	lw	$t7,1024+96($Tbl)
998290207Sjkim	_xtr	$i3,$s2,16
999238384Sjkim	lw	$t8,1024+128($Tbl)
1000290207Sjkim	and	$i0,0xff
1001238384Sjkim	lw	$t9,1024+160($Tbl)
1002290207Sjkim	and	$i1,0xff
1003238384Sjkim	lw	$t10,1024+192($Tbl)
1004290207Sjkim	and	$i2,0xff
1005238384Sjkim	lw	$t11,1024+224($Tbl)
1006290207Sjkim	and	$i3,0xff
1007238384Sjkim
1008238384Sjkim	$PTR_ADD $i0,$Tbl
1009238384Sjkim	$PTR_ADD $i1,$Tbl
1010238384Sjkim	$PTR_ADD $i2,$Tbl
1011238384Sjkim	$PTR_ADD $i3,$Tbl
1012238384Sjkim	lbu	$t0,1024($i0)		# Td4[s3>>16]
1013290207Sjkim	_xtr	$i0,$s2,8
1014238384Sjkim	lbu	$t1,1024($i1)		# Td4[s0>>16]
1015290207Sjkim	_xtr	$i1,$s3,8
1016238384Sjkim	lbu	$t2,1024($i2)		# Td4[s1>>16]
1017290207Sjkim	_xtr	$i2,$s0,8
1018238384Sjkim	lbu	$t3,1024($i3)		# Td4[s2>>16]
1019290207Sjkim	_xtr	$i3,$s1,8
1020238384Sjkim
1021238384Sjkim	and	$i0,0xff
1022238384Sjkim	and	$i1,0xff
1023238384Sjkim	and	$i2,0xff
1024238384Sjkim	and	$i3,0xff
1025238384Sjkim	$PTR_ADD $i0,$Tbl
1026238384Sjkim	$PTR_ADD $i1,$Tbl
1027238384Sjkim	$PTR_ADD $i2,$Tbl
1028238384Sjkim	$PTR_ADD $i3,$Tbl
1029290207Sjkim#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
1030290207Sjkim# if defined(_MIPSEL)
1031238384Sjkim	lbu	$t4,1024($i0)		# Td4[s2>>8]
1032290207Sjkim	$PTR_INS $i0,$s0,0,8
1033238384Sjkim	lbu	$t5,1024($i1)		# Td4[s3>>8]
1034290207Sjkim	$PTR_INS $i1,$s1,0,8
1035238384Sjkim	lbu	$t6,1024($i2)		# Td4[s0>>8]
1036290207Sjkim	$PTR_INS $i2,$s2,0,8
1037238384Sjkim	lbu	$t7,1024($i3)		# Td4[s1>>8]
1038290207Sjkim	$PTR_INS $i3,$s3,0,8
1039238384Sjkim
1040290207Sjkim	lbu	$t8,1024($i0)		# Td4[s0>>24]
1041290207Sjkim	_xtr	$i0,$s1,0
1042290207Sjkim	lbu	$t9,1024($i1)		# Td4[s1>>24]
1043290207Sjkim	_xtr	$i1,$s2,0
1044290207Sjkim	lbu	$t10,1024($i2)		# Td4[s2>>24]
1045290207Sjkim	_xtr	$i2,$s3,0
1046290207Sjkim	lbu	$t11,1024($i3)		# Td4[s3>>24]
1047290207Sjkim	_xtr	$i3,$s0,0
1048290207Sjkim
1049290207Sjkim	$PTR_ADD $i0,$Tbl
1050290207Sjkim	$PTR_ADD $i1,$Tbl
1051290207Sjkim	$PTR_ADD $i2,$Tbl
1052290207Sjkim	$PTR_ADD $i3,$Tbl
1053290207Sjkim# else
1054290207Sjkim	lbu	$t4,1024($i0)		# Td4[s2>>8]
1055238384Sjkim	_xtr	$i0,$s0,24
1056290207Sjkim	lbu	$t5,1024($i1)		# Td4[s3>>8]
1057238384Sjkim	_xtr	$i1,$s1,24
1058290207Sjkim	lbu	$t6,1024($i2)		# Td4[s0>>8]
1059238384Sjkim	_xtr	$i2,$s2,24
1060290207Sjkim	lbu	$t7,1024($i3)		# Td4[s1>>8]
1061238384Sjkim	_xtr	$i3,$s3,24
1062290207Sjkim
1063238384Sjkim	$PTR_ADD $i0,$Tbl
1064238384Sjkim	$PTR_ADD $i1,$Tbl
1065238384Sjkim	$PTR_ADD $i2,$Tbl
1066238384Sjkim	$PTR_ADD $i3,$Tbl
1067238384Sjkim	lbu	$t8,1024($i0)		# Td4[s0>>24]
1068290207Sjkim	$PTR_INS $i0,$s1,0,8
1069238384Sjkim	lbu	$t9,1024($i1)		# Td4[s1>>24]
1070290207Sjkim	$PTR_INS $i1,$s2,0,8
1071238384Sjkim	lbu	$t10,1024($i2)		# Td4[s2>>24]
1072290207Sjkim	$PTR_INS $i2,$s3,0,8
1073238384Sjkim	lbu	$t11,1024($i3)		# Td4[s3>>24]
1074290207Sjkim	$PTR_INS $i3,$s0,0,8
1075290207Sjkim# endif
1076290207Sjkim	_ins	$t0,16
1077290207Sjkim	_ins	$t1,16
1078290207Sjkim	_ins	$t2,16
1079290207Sjkim	_ins	$t3,16
1080238384Sjkim
1081290207Sjkim	_ins2	$t0,$t4,8
1082290207Sjkim	lbu	$t4,1024($i0)		# Td4[s1]
1083290207Sjkim	_ins2	$t1,$t5,8
1084290207Sjkim	lbu	$t5,1024($i1)		# Td4[s2]
1085290207Sjkim	_ins2	$t2,$t6,8
1086290207Sjkim	lbu	$t6,1024($i2)		# Td4[s3]
1087290207Sjkim	_ins2	$t3,$t7,8
1088290207Sjkim	lbu	$t7,1024($i3)		# Td4[s0]
1089290207Sjkim
1090290207Sjkim	_ins2	$t0,$t8,24
1091290207Sjkim	lw	$s0,0($key0)
1092290207Sjkim	_ins2	$t1,$t9,24
1093290207Sjkim	lw	$s1,4($key0)
1094290207Sjkim	_ins2	$t2,$t10,24
1095290207Sjkim	lw	$s2,8($key0)
1096290207Sjkim	_ins2	$t3,$t11,24
1097290207Sjkim	lw	$s3,12($key0)
1098290207Sjkim
1099290207Sjkim	_ins2	$t0,$t4,0
1100290207Sjkim	_ins2	$t1,$t5,0
1101290207Sjkim	_ins2	$t2,$t6,0
1102290207Sjkim	_ins2	$t3,$t7,0
1103290207Sjkim#else
1104290207Sjkim	lbu	$t4,1024($i0)		# Td4[s2>>8]
1105290207Sjkim	_xtr	$i0,$s0,24
1106290207Sjkim	lbu	$t5,1024($i1)		# Td4[s3>>8]
1107290207Sjkim	_xtr	$i1,$s1,24
1108290207Sjkim	lbu	$t6,1024($i2)		# Td4[s0>>8]
1109290207Sjkim	_xtr	$i2,$s2,24
1110290207Sjkim	lbu	$t7,1024($i3)		# Td4[s1>>8]
1111290207Sjkim	_xtr	$i3,$s3,24
1112290207Sjkim
1113290207Sjkim	$PTR_ADD $i0,$Tbl
1114290207Sjkim	$PTR_ADD $i1,$Tbl
1115290207Sjkim	$PTR_ADD $i2,$Tbl
1116290207Sjkim	$PTR_ADD $i3,$Tbl
1117290207Sjkim	lbu	$t8,1024($i0)		# Td4[s0>>24]
1118238384Sjkim	_xtr	$i0,$s1,0
1119290207Sjkim	lbu	$t9,1024($i1)		# Td4[s1>>24]
1120238384Sjkim	_xtr	$i1,$s2,0
1121290207Sjkim	lbu	$t10,1024($i2)		# Td4[s2>>24]
1122238384Sjkim	_xtr	$i2,$s3,0
1123290207Sjkim	lbu	$t11,1024($i3)		# Td4[s3>>24]
1124238384Sjkim	_xtr	$i3,$s0,0
1125238384Sjkim
1126290207Sjkim	$PTR_ADD $i0,$Tbl
1127290207Sjkim	$PTR_ADD $i1,$Tbl
1128290207Sjkim	$PTR_ADD $i2,$Tbl
1129290207Sjkim	$PTR_ADD $i3,$Tbl
1130290207Sjkim
1131238384Sjkim	_ins	$t0,16
1132238384Sjkim	_ins	$t1,16
1133238384Sjkim	_ins	$t2,16
1134238384Sjkim	_ins	$t3,16
1135238384Sjkim
1136238384Sjkim	_ins	$t4,8
1137238384Sjkim	_ins	$t5,8
1138238384Sjkim	_ins	$t6,8
1139238384Sjkim	_ins	$t7,8
1140238384Sjkim
1141238384Sjkim	xor	$t0,$t4
1142290207Sjkim	lbu	$t4,1024($i0)		# Td4[s1]
1143238384Sjkim	xor	$t1,$t5
1144290207Sjkim	lbu	$t5,1024($i1)		# Td4[s2]
1145238384Sjkim	xor	$t2,$t6
1146290207Sjkim	lbu	$t6,1024($i2)		# Td4[s3]
1147238384Sjkim	xor	$t3,$t7
1148238384Sjkim	lbu	$t7,1024($i3)		# Td4[s0]
1149238384Sjkim
1150238384Sjkim	_ins	$t8,24
1151290207Sjkim	lw	$s0,0($key0)
1152238384Sjkim	_ins	$t9,24
1153290207Sjkim	lw	$s1,4($key0)
1154238384Sjkim	_ins	$t10,24
1155290207Sjkim	lw	$s2,8($key0)
1156238384Sjkim	_ins	$t11,24
1157238384Sjkim	lw	$s3,12($key0)
1158238384Sjkim
1159290207Sjkim	xor	$t0,$t8
1160290207Sjkim	xor	$t1,$t9
1161290207Sjkim	xor	$t2,$t10
1162290207Sjkim	xor	$t3,$t11
1163290207Sjkim
1164238384Sjkim	_ins	$t4,0
1165238384Sjkim	_ins	$t5,0
1166238384Sjkim	_ins	$t6,0
1167238384Sjkim	_ins	$t7,0
1168238384Sjkim
1169238384Sjkim	xor	$t0,$t4
1170238384Sjkim	xor	$t1,$t5
1171238384Sjkim	xor	$t2,$t6
1172238384Sjkim	xor	$t3,$t7
1173290207Sjkim#endif
1174238384Sjkim
1175238384Sjkim	xor	$s0,$t0
1176238384Sjkim	xor	$s1,$t1
1177238384Sjkim	xor	$s2,$t2
1178238384Sjkim	xor	$s3,$t3
1179238384Sjkim
1180238384Sjkim	jr	$ra
1181238384Sjkim.end	_mips_AES_decrypt
1182238384Sjkim
1183238384Sjkim.align	5
1184238384Sjkim.globl	AES_decrypt
1185238384Sjkim.ent	AES_decrypt
1186238384SjkimAES_decrypt:
1187238384Sjkim	.frame	$sp,$FRAMESIZE,$ra
1188238384Sjkim	.mask	$SAVED_REGS_MASK,-$SZREG
1189238384Sjkim	.set	noreorder
1190238384Sjkim___
1191238384Sjkim$code.=<<___ if ($flavour =~ /o32/i);	# o32 PIC-ification
1192238384Sjkim	.cpload	$pf
1193238384Sjkim___
1194238384Sjkim$code.=<<___;
1195238384Sjkim	$PTR_SUB $sp,$FRAMESIZE
1196238384Sjkim	$REG_S	$ra,$FRAMESIZE-1*$SZREG($sp)
1197238384Sjkim	$REG_S	$fp,$FRAMESIZE-2*$SZREG($sp)
1198238384Sjkim	$REG_S	$s11,$FRAMESIZE-3*$SZREG($sp)
1199238384Sjkim	$REG_S	$s10,$FRAMESIZE-4*$SZREG($sp)
1200238384Sjkim	$REG_S	$s9,$FRAMESIZE-5*$SZREG($sp)
1201238384Sjkim	$REG_S	$s8,$FRAMESIZE-6*$SZREG($sp)
1202238384Sjkim	$REG_S	$s7,$FRAMESIZE-7*$SZREG($sp)
1203238384Sjkim	$REG_S	$s6,$FRAMESIZE-8*$SZREG($sp)
1204238384Sjkim	$REG_S	$s5,$FRAMESIZE-9*$SZREG($sp)
1205238384Sjkim	$REG_S	$s4,$FRAMESIZE-10*$SZREG($sp)
1206238384Sjkim___
1207238384Sjkim$code.=<<___ if ($flavour =~ /nubi/i);	# optimize non-nubi prologue
1208238384Sjkim	$REG_S	\$15,$FRAMESIZE-11*$SZREG($sp)
1209238384Sjkim	$REG_S	\$14,$FRAMESIZE-12*$SZREG($sp)
1210238384Sjkim	$REG_S	\$13,$FRAMESIZE-13*$SZREG($sp)
1211238384Sjkim	$REG_S	\$12,$FRAMESIZE-14*$SZREG($sp)
1212238384Sjkim	$REG_S	$gp,$FRAMESIZE-15*$SZREG($sp)
1213238384Sjkim___
1214238384Sjkim$code.=<<___ if ($flavour !~ /o32/i);	# non-o32 PIC-ification
1215238384Sjkim	.cplocal	$Tbl
1216238384Sjkim	.cpsetup	$pf,$zero,AES_decrypt
1217238384Sjkim___
1218238384Sjkim$code.=<<___;
1219238384Sjkim	.set	reorder
1220238384Sjkim	la	$Tbl,AES_Td		# PIC-ified 'load address'
1221238384Sjkim
1222238384Sjkim	lwl	$s0,0+$MSB($inp)
1223238384Sjkim	lwl	$s1,4+$MSB($inp)
1224238384Sjkim	lwl	$s2,8+$MSB($inp)
1225238384Sjkim	lwl	$s3,12+$MSB($inp)
1226238384Sjkim	lwr	$s0,0+$LSB($inp)
1227238384Sjkim	lwr	$s1,4+$LSB($inp)
1228238384Sjkim	lwr	$s2,8+$LSB($inp)
1229238384Sjkim	lwr	$s3,12+$LSB($inp)
1230238384Sjkim
1231238384Sjkim	bal	_mips_AES_decrypt
1232238384Sjkim
1233238384Sjkim	swr	$s0,0+$LSB($out)
1234238384Sjkim	swr	$s1,4+$LSB($out)
1235238384Sjkim	swr	$s2,8+$LSB($out)
1236238384Sjkim	swr	$s3,12+$LSB($out)
1237238384Sjkim	swl	$s0,0+$MSB($out)
1238238384Sjkim	swl	$s1,4+$MSB($out)
1239238384Sjkim	swl	$s2,8+$MSB($out)
1240238384Sjkim	swl	$s3,12+$MSB($out)
1241238384Sjkim
1242238384Sjkim	.set	noreorder
1243238384Sjkim	$REG_L	$ra,$FRAMESIZE-1*$SZREG($sp)
1244238384Sjkim	$REG_L	$fp,$FRAMESIZE-2*$SZREG($sp)
1245238384Sjkim	$REG_L	$s11,$FRAMESIZE-3*$SZREG($sp)
1246238384Sjkim	$REG_L	$s10,$FRAMESIZE-4*$SZREG($sp)
1247238384Sjkim	$REG_L	$s9,$FRAMESIZE-5*$SZREG($sp)
1248238384Sjkim	$REG_L	$s8,$FRAMESIZE-6*$SZREG($sp)
1249238384Sjkim	$REG_L	$s7,$FRAMESIZE-7*$SZREG($sp)
1250238384Sjkim	$REG_L	$s6,$FRAMESIZE-8*$SZREG($sp)
1251238384Sjkim	$REG_L	$s5,$FRAMESIZE-9*$SZREG($sp)
1252238384Sjkim	$REG_L	$s4,$FRAMESIZE-10*$SZREG($sp)
1253238384Sjkim___
1254238384Sjkim$code.=<<___ if ($flavour =~ /nubi/i);
1255238384Sjkim	$REG_L	\$15,$FRAMESIZE-11*$SZREG($sp)
1256238384Sjkim	$REG_L	\$14,$FRAMESIZE-12*$SZREG($sp)
1257238384Sjkim	$REG_L	\$13,$FRAMESIZE-13*$SZREG($sp)
1258238384Sjkim	$REG_L	\$12,$FRAMESIZE-14*$SZREG($sp)
1259238384Sjkim	$REG_L	$gp,$FRAMESIZE-15*$SZREG($sp)
1260238384Sjkim___
1261238384Sjkim$code.=<<___;
1262238384Sjkim	jr	$ra
1263238384Sjkim	$PTR_ADD $sp,$FRAMESIZE
1264238384Sjkim.end	AES_decrypt
1265238384Sjkim___
1266238384Sjkim}}}
1267238384Sjkim
1268238384Sjkim{{{
1269238384Sjkimmy $FRAMESIZE=8*$SZREG;
1270238384Sjkimmy $SAVED_REGS_MASK = ($flavour =~ /nubi/i) ? 0xc000f008 : 0xc0000000;
1271238384Sjkim
1272238384Sjkimmy ($inp,$bits,$key,$Tbl)=($a0,$a1,$a2,$a3);
1273238384Sjkimmy ($rk0,$rk1,$rk2,$rk3,$rk4,$rk5,$rk6,$rk7)=($a4,$a5,$a6,$a7,$s0,$s1,$s2,$s3);
1274238384Sjkimmy ($i0,$i1,$i2,$i3)=($at,$t0,$t1,$t2);
1275238384Sjkimmy ($rcon,$cnt)=($gp,$fp);
1276238384Sjkim
1277238384Sjkim$code.=<<___;
1278238384Sjkim.align	5
1279238384Sjkim.ent	_mips_AES_set_encrypt_key
1280238384Sjkim_mips_AES_set_encrypt_key:
1281238384Sjkim	.frame	$sp,0,$ra
1282238384Sjkim	.set	noreorder
1283238384Sjkim	beqz	$inp,.Lekey_done
1284238384Sjkim	li	$t0,-1
1285238384Sjkim	beqz	$key,.Lekey_done
1286290207Sjkim	$PTR_ADD $rcon,$Tbl,256
1287238384Sjkim
1288238384Sjkim	.set	reorder
1289238384Sjkim	lwl	$rk0,0+$MSB($inp)	# load 128 bits
1290238384Sjkim	lwl	$rk1,4+$MSB($inp)
1291238384Sjkim	lwl	$rk2,8+$MSB($inp)
1292238384Sjkim	lwl	$rk3,12+$MSB($inp)
1293238384Sjkim	li	$at,128
1294238384Sjkim	lwr	$rk0,0+$LSB($inp)
1295238384Sjkim	lwr	$rk1,4+$LSB($inp)
1296238384Sjkim	lwr	$rk2,8+$LSB($inp)
1297238384Sjkim	lwr	$rk3,12+$LSB($inp)
1298238384Sjkim	.set	noreorder
1299238384Sjkim	beq	$bits,$at,.L128bits
1300238384Sjkim	li	$cnt,10
1301238384Sjkim
1302238384Sjkim	.set	reorder
1303238384Sjkim	lwl	$rk4,16+$MSB($inp)	# load 192 bits
1304238384Sjkim	lwl	$rk5,20+$MSB($inp)
1305238384Sjkim	li	$at,192
1306238384Sjkim	lwr	$rk4,16+$LSB($inp)
1307238384Sjkim	lwr	$rk5,20+$LSB($inp)
1308238384Sjkim	.set	noreorder
1309238384Sjkim	beq	$bits,$at,.L192bits
1310238384Sjkim	li	$cnt,8
1311238384Sjkim
1312238384Sjkim	.set	reorder
1313238384Sjkim	lwl	$rk6,24+$MSB($inp)	# load 256 bits
1314238384Sjkim	lwl	$rk7,28+$MSB($inp)
1315238384Sjkim	li	$at,256
1316238384Sjkim	lwr	$rk6,24+$LSB($inp)
1317238384Sjkim	lwr	$rk7,28+$LSB($inp)
1318238384Sjkim	.set	noreorder
1319238384Sjkim	beq	$bits,$at,.L256bits
1320238384Sjkim	li	$cnt,7
1321238384Sjkim
1322238384Sjkim	b	.Lekey_done
1323238384Sjkim	li	$t0,-2
1324238384Sjkim
1325238384Sjkim.align	4
1326238384Sjkim.L128bits:
1327238384Sjkim	.set	reorder
1328238384Sjkim	srl	$i0,$rk3,16
1329238384Sjkim	srl	$i1,$rk3,8
1330238384Sjkim	and	$i0,0xff
1331238384Sjkim	and	$i1,0xff
1332238384Sjkim	and	$i2,$rk3,0xff
1333238384Sjkim	srl	$i3,$rk3,24
1334238384Sjkim	$PTR_ADD $i0,$Tbl
1335238384Sjkim	$PTR_ADD $i1,$Tbl
1336238384Sjkim	$PTR_ADD $i2,$Tbl
1337238384Sjkim	$PTR_ADD $i3,$Tbl
1338290207Sjkim	lbu	$i0,0($i0)
1339290207Sjkim	lbu	$i1,0($i1)
1340290207Sjkim	lbu	$i2,0($i2)
1341290207Sjkim	lbu	$i3,0($i3)
1342238384Sjkim
1343238384Sjkim	sw	$rk0,0($key)
1344238384Sjkim	sw	$rk1,4($key)
1345238384Sjkim	sw	$rk2,8($key)
1346238384Sjkim	sw	$rk3,12($key)
1347238384Sjkim	sub	$cnt,1
1348238384Sjkim	$PTR_ADD $key,16
1349238384Sjkim
1350238384Sjkim	_bias	$i0,24
1351238384Sjkim	_bias	$i1,16
1352238384Sjkim	_bias	$i2,8
1353238384Sjkim	_bias	$i3,0
1354238384Sjkim
1355238384Sjkim	xor	$rk0,$i0
1356238384Sjkim	lw	$i0,0($rcon)
1357238384Sjkim	xor	$rk0,$i1
1358238384Sjkim	xor	$rk0,$i2
1359238384Sjkim	xor	$rk0,$i3
1360238384Sjkim	xor	$rk0,$i0
1361238384Sjkim
1362238384Sjkim	xor	$rk1,$rk0
1363238384Sjkim	xor	$rk2,$rk1
1364238384Sjkim	xor	$rk3,$rk2
1365238384Sjkim
1366238384Sjkim	.set	noreorder
1367238384Sjkim	bnez	$cnt,.L128bits
1368238384Sjkim	$PTR_ADD $rcon,4
1369238384Sjkim
1370238384Sjkim	sw	$rk0,0($key)
1371238384Sjkim	sw	$rk1,4($key)
1372238384Sjkim	sw	$rk2,8($key)
1373238384Sjkim	li	$cnt,10
1374238384Sjkim	sw	$rk3,12($key)
1375238384Sjkim	li	$t0,0
1376238384Sjkim	sw	$cnt,80($key)
1377238384Sjkim	b	.Lekey_done
1378238384Sjkim	$PTR_SUB $key,10*16
1379238384Sjkim
1380238384Sjkim.align	4
1381238384Sjkim.L192bits:
1382238384Sjkim	.set	reorder
1383238384Sjkim	srl	$i0,$rk5,16
1384238384Sjkim	srl	$i1,$rk5,8
1385238384Sjkim	and	$i0,0xff
1386238384Sjkim	and	$i1,0xff
1387238384Sjkim	and	$i2,$rk5,0xff
1388238384Sjkim	srl	$i3,$rk5,24
1389238384Sjkim	$PTR_ADD $i0,$Tbl
1390238384Sjkim	$PTR_ADD $i1,$Tbl
1391238384Sjkim	$PTR_ADD $i2,$Tbl
1392238384Sjkim	$PTR_ADD $i3,$Tbl
1393290207Sjkim	lbu	$i0,0($i0)
1394290207Sjkim	lbu	$i1,0($i1)
1395290207Sjkim	lbu	$i2,0($i2)
1396290207Sjkim	lbu	$i3,0($i3)
1397238384Sjkim
1398238384Sjkim	sw	$rk0,0($key)
1399238384Sjkim	sw	$rk1,4($key)
1400238384Sjkim	sw	$rk2,8($key)
1401238384Sjkim	sw	$rk3,12($key)
1402238384Sjkim	sw	$rk4,16($key)
1403238384Sjkim	sw	$rk5,20($key)
1404238384Sjkim	sub	$cnt,1
1405238384Sjkim	$PTR_ADD $key,24
1406238384Sjkim
1407238384Sjkim	_bias	$i0,24
1408238384Sjkim	_bias	$i1,16
1409238384Sjkim	_bias	$i2,8
1410238384Sjkim	_bias	$i3,0
1411238384Sjkim
1412238384Sjkim	xor	$rk0,$i0
1413238384Sjkim	lw	$i0,0($rcon)
1414238384Sjkim	xor	$rk0,$i1
1415238384Sjkim	xor	$rk0,$i2
1416238384Sjkim	xor	$rk0,$i3
1417238384Sjkim	xor	$rk0,$i0
1418238384Sjkim
1419238384Sjkim	xor	$rk1,$rk0
1420238384Sjkim	xor	$rk2,$rk1
1421238384Sjkim	xor	$rk3,$rk2
1422238384Sjkim	xor	$rk4,$rk3
1423238384Sjkim	xor	$rk5,$rk4
1424238384Sjkim
1425238384Sjkim	.set	noreorder
1426238384Sjkim	bnez	$cnt,.L192bits
1427238384Sjkim	$PTR_ADD $rcon,4
1428238384Sjkim
1429238384Sjkim	sw	$rk0,0($key)
1430238384Sjkim	sw	$rk1,4($key)
1431238384Sjkim	sw	$rk2,8($key)
1432238384Sjkim	li	$cnt,12
1433238384Sjkim	sw	$rk3,12($key)
1434238384Sjkim	li	$t0,0
1435238384Sjkim	sw	$cnt,48($key)
1436238384Sjkim	b	.Lekey_done
1437238384Sjkim	$PTR_SUB $key,12*16
1438238384Sjkim
1439238384Sjkim.align	4
1440238384Sjkim.L256bits:
1441238384Sjkim	.set	reorder
1442238384Sjkim	srl	$i0,$rk7,16
1443238384Sjkim	srl	$i1,$rk7,8
1444238384Sjkim	and	$i0,0xff
1445238384Sjkim	and	$i1,0xff
1446238384Sjkim	and	$i2,$rk7,0xff
1447238384Sjkim	srl	$i3,$rk7,24
1448238384Sjkim	$PTR_ADD $i0,$Tbl
1449238384Sjkim	$PTR_ADD $i1,$Tbl
1450238384Sjkim	$PTR_ADD $i2,$Tbl
1451238384Sjkim	$PTR_ADD $i3,$Tbl
1452290207Sjkim	lbu	$i0,0($i0)
1453290207Sjkim	lbu	$i1,0($i1)
1454290207Sjkim	lbu	$i2,0($i2)
1455290207Sjkim	lbu	$i3,0($i3)
1456238384Sjkim
1457238384Sjkim	sw	$rk0,0($key)
1458238384Sjkim	sw	$rk1,4($key)
1459238384Sjkim	sw	$rk2,8($key)
1460238384Sjkim	sw	$rk3,12($key)
1461238384Sjkim	sw	$rk4,16($key)
1462238384Sjkim	sw	$rk5,20($key)
1463238384Sjkim	sw	$rk6,24($key)
1464238384Sjkim	sw	$rk7,28($key)
1465238384Sjkim	sub	$cnt,1
1466238384Sjkim
1467238384Sjkim	_bias	$i0,24
1468238384Sjkim	_bias	$i1,16
1469238384Sjkim	_bias	$i2,8
1470238384Sjkim	_bias	$i3,0
1471238384Sjkim
1472238384Sjkim	xor	$rk0,$i0
1473238384Sjkim	lw	$i0,0($rcon)
1474238384Sjkim	xor	$rk0,$i1
1475238384Sjkim	xor	$rk0,$i2
1476238384Sjkim	xor	$rk0,$i3
1477238384Sjkim	xor	$rk0,$i0
1478238384Sjkim
1479238384Sjkim	xor	$rk1,$rk0
1480238384Sjkim	xor	$rk2,$rk1
1481238384Sjkim	xor	$rk3,$rk2
1482238384Sjkim	beqz	$cnt,.L256bits_done
1483238384Sjkim
1484238384Sjkim	srl	$i0,$rk3,24
1485238384Sjkim	srl	$i1,$rk3,16
1486238384Sjkim	srl	$i2,$rk3,8
1487238384Sjkim	and	$i3,$rk3,0xff
1488238384Sjkim	and	$i1,0xff
1489238384Sjkim	and	$i2,0xff
1490238384Sjkim	$PTR_ADD $i0,$Tbl
1491238384Sjkim	$PTR_ADD $i1,$Tbl
1492238384Sjkim	$PTR_ADD $i2,$Tbl
1493238384Sjkim	$PTR_ADD $i3,$Tbl
1494290207Sjkim	lbu	$i0,0($i0)
1495290207Sjkim	lbu	$i1,0($i1)
1496290207Sjkim	lbu	$i2,0($i2)
1497290207Sjkim	lbu	$i3,0($i3)
1498238384Sjkim	sll	$i0,24
1499238384Sjkim	sll	$i1,16
1500238384Sjkim	sll	$i2,8
1501238384Sjkim
1502238384Sjkim	xor	$rk4,$i0
1503238384Sjkim	xor	$rk4,$i1
1504238384Sjkim	xor	$rk4,$i2
1505238384Sjkim	xor	$rk4,$i3
1506238384Sjkim
1507238384Sjkim	xor	$rk5,$rk4
1508238384Sjkim	xor	$rk6,$rk5
1509238384Sjkim	xor	$rk7,$rk6
1510238384Sjkim
1511238384Sjkim	$PTR_ADD $key,32
1512238384Sjkim	.set	noreorder
1513238384Sjkim	b	.L256bits
1514238384Sjkim	$PTR_ADD $rcon,4
1515238384Sjkim
1516238384Sjkim.L256bits_done:
1517238384Sjkim	sw	$rk0,32($key)
1518238384Sjkim	sw	$rk1,36($key)
1519238384Sjkim	sw	$rk2,40($key)
1520238384Sjkim	li	$cnt,14
1521238384Sjkim	sw	$rk3,44($key)
1522238384Sjkim	li	$t0,0
1523238384Sjkim	sw	$cnt,48($key)
1524238384Sjkim	$PTR_SUB $key,12*16
1525238384Sjkim
1526238384Sjkim.Lekey_done:
1527238384Sjkim	jr	$ra
1528238384Sjkim	nop
1529238384Sjkim.end	_mips_AES_set_encrypt_key
1530238384Sjkim
1531246772Sjkim.globl	private_AES_set_encrypt_key
1532246772Sjkim.ent	private_AES_set_encrypt_key
1533246772Sjkimprivate_AES_set_encrypt_key:
1534238384Sjkim	.frame	$sp,$FRAMESIZE,$ra
1535238384Sjkim	.mask	$SAVED_REGS_MASK,-$SZREG
1536238384Sjkim	.set	noreorder
1537238384Sjkim___
1538238384Sjkim$code.=<<___ if ($flavour =~ /o32/i);	# o32 PIC-ification
1539238384Sjkim	.cpload	$pf
1540238384Sjkim___
1541238384Sjkim$code.=<<___;
1542238384Sjkim	$PTR_SUB $sp,$FRAMESIZE
1543238384Sjkim	$REG_S	$ra,$FRAMESIZE-1*$SZREG($sp)
1544238384Sjkim	$REG_S	$fp,$FRAMESIZE-2*$SZREG($sp)
1545238384Sjkim___
1546238384Sjkim$code.=<<___ if ($flavour =~ /nubi/i);	# optimize non-nubi prologue
1547238384Sjkim	$REG_S	$s3,$FRAMESIZE-3*$SZREG($sp)
1548238384Sjkim	$REG_S	$s2,$FRAMESIZE-4*$SZREG($sp)
1549238384Sjkim	$REG_S	$s1,$FRAMESIZE-5*$SZREG($sp)
1550238384Sjkim	$REG_S	$s0,$FRAMESIZE-6*$SZREG($sp)
1551238384Sjkim	$REG_S	$gp,$FRAMESIZE-7*$SZREG($sp)
1552238384Sjkim___
1553238384Sjkim$code.=<<___ if ($flavour !~ /o32/i);	# non-o32 PIC-ification
1554238384Sjkim	.cplocal	$Tbl
1555246772Sjkim	.cpsetup	$pf,$zero,private_AES_set_encrypt_key
1556238384Sjkim___
1557238384Sjkim$code.=<<___;
1558238384Sjkim	.set	reorder
1559290207Sjkim	la	$Tbl,AES_Te4		# PIC-ified 'load address'
1560238384Sjkim
1561238384Sjkim	bal	_mips_AES_set_encrypt_key
1562238384Sjkim
1563238384Sjkim	.set	noreorder
1564238384Sjkim	move	$a0,$t0
1565238384Sjkim	$REG_L	$ra,$FRAMESIZE-1*$SZREG($sp)
1566238384Sjkim	$REG_L	$fp,$FRAMESIZE-2*$SZREG($sp)
1567238384Sjkim___
1568238384Sjkim$code.=<<___ if ($flavour =~ /nubi/i);
1569238384Sjkim	$REG_L	$s3,$FRAMESIZE-11*$SZREG($sp)
1570238384Sjkim	$REG_L	$s2,$FRAMESIZE-12*$SZREG($sp)
1571238384Sjkim	$REG_L	$s1,$FRAMESIZE-13*$SZREG($sp)
1572238384Sjkim	$REG_L	$s0,$FRAMESIZE-14*$SZREG($sp)
1573238384Sjkim	$REG_L	$gp,$FRAMESIZE-15*$SZREG($sp)
1574238384Sjkim___
1575238384Sjkim$code.=<<___;
1576238384Sjkim	jr	$ra
1577238384Sjkim	$PTR_ADD $sp,$FRAMESIZE
1578246772Sjkim.end	private_AES_set_encrypt_key
1579238384Sjkim___
1580238384Sjkim
1581238384Sjkimmy ($head,$tail)=($inp,$bits);
1582238384Sjkimmy ($tp1,$tp2,$tp4,$tp8,$tp9,$tpb,$tpd,$tpe)=($a4,$a5,$a6,$a7,$s0,$s1,$s2,$s3);
1583238384Sjkimmy ($m,$x80808080,$x7f7f7f7f,$x1b1b1b1b)=($at,$t0,$t1,$t2);
1584238384Sjkim$code.=<<___;
1585238384Sjkim.align	5
1586246772Sjkim.globl	private_AES_set_decrypt_key
1587246772Sjkim.ent	private_AES_set_decrypt_key
1588246772Sjkimprivate_AES_set_decrypt_key:
1589238384Sjkim	.frame	$sp,$FRAMESIZE,$ra
1590238384Sjkim	.mask	$SAVED_REGS_MASK,-$SZREG
1591238384Sjkim	.set	noreorder
1592238384Sjkim___
1593238384Sjkim$code.=<<___ if ($flavour =~ /o32/i);	# o32 PIC-ification
1594238384Sjkim	.cpload	$pf
1595238384Sjkim___
1596238384Sjkim$code.=<<___;
1597238384Sjkim	$PTR_SUB $sp,$FRAMESIZE
1598238384Sjkim	$REG_S	$ra,$FRAMESIZE-1*$SZREG($sp)
1599238384Sjkim	$REG_S	$fp,$FRAMESIZE-2*$SZREG($sp)
1600238384Sjkim___
1601238384Sjkim$code.=<<___ if ($flavour =~ /nubi/i);	# optimize non-nubi prologue
1602238384Sjkim	$REG_S	$s3,$FRAMESIZE-3*$SZREG($sp)
1603238384Sjkim	$REG_S	$s2,$FRAMESIZE-4*$SZREG($sp)
1604238384Sjkim	$REG_S	$s1,$FRAMESIZE-5*$SZREG($sp)
1605238384Sjkim	$REG_S	$s0,$FRAMESIZE-6*$SZREG($sp)
1606238384Sjkim	$REG_S	$gp,$FRAMESIZE-7*$SZREG($sp)
1607238384Sjkim___
1608238384Sjkim$code.=<<___ if ($flavour !~ /o32/i);	# non-o32 PIC-ification
1609238384Sjkim	.cplocal	$Tbl
1610246772Sjkim	.cpsetup	$pf,$zero,private_AES_set_decrypt_key
1611238384Sjkim___
1612238384Sjkim$code.=<<___;
1613238384Sjkim	.set	reorder
1614290207Sjkim	la	$Tbl,AES_Te4		# PIC-ified 'load address'
1615238384Sjkim
1616238384Sjkim	bal	_mips_AES_set_encrypt_key
1617238384Sjkim
1618238384Sjkim	bltz	$t0,.Ldkey_done
1619238384Sjkim
1620238384Sjkim	sll	$at,$cnt,4
1621238384Sjkim	$PTR_ADD $head,$key,0
1622238384Sjkim	$PTR_ADD $tail,$key,$at
1623238384Sjkim.align	4
1624238384Sjkim.Lswap:
1625238384Sjkim	lw	$rk0,0($head)
1626238384Sjkim	lw	$rk1,4($head)
1627238384Sjkim	lw	$rk2,8($head)
1628238384Sjkim	lw	$rk3,12($head)
1629238384Sjkim	lw	$rk4,0($tail)
1630238384Sjkim	lw	$rk5,4($tail)
1631238384Sjkim	lw	$rk6,8($tail)
1632238384Sjkim	lw	$rk7,12($tail)
1633238384Sjkim	sw	$rk0,0($tail)
1634238384Sjkim	sw	$rk1,4($tail)
1635238384Sjkim	sw	$rk2,8($tail)
1636238384Sjkim	sw	$rk3,12($tail)
1637238384Sjkim	$PTR_ADD $head,16
1638238384Sjkim	$PTR_SUB $tail,16
1639238384Sjkim	sw	$rk4,-16($head)
1640238384Sjkim	sw	$rk5,-12($head)
1641238384Sjkim	sw	$rk6,-8($head)
1642238384Sjkim	sw	$rk7,-4($head)
1643238384Sjkim	bne	$head,$tail,.Lswap
1644238384Sjkim
1645238384Sjkim	lw	$tp1,16($key)		# modulo-scheduled
1646238384Sjkim	lui	$x80808080,0x8080
1647238384Sjkim	sub	$cnt,1
1648238384Sjkim	or	$x80808080,0x8080
1649238384Sjkim	sll	$cnt,2
1650238384Sjkim	$PTR_ADD $key,16
1651238384Sjkim	lui	$x1b1b1b1b,0x1b1b
1652238384Sjkim	nor	$x7f7f7f7f,$zero,$x80808080
1653238384Sjkim	or	$x1b1b1b1b,0x1b1b
1654238384Sjkim.align	4
1655238384Sjkim.Lmix:
1656238384Sjkim	and	$m,$tp1,$x80808080
1657238384Sjkim	and	$tp2,$tp1,$x7f7f7f7f
1658238384Sjkim	srl	$tp4,$m,7
1659238384Sjkim	addu	$tp2,$tp2		# tp2<<1
1660238384Sjkim	subu	$m,$tp4
1661238384Sjkim	and	$m,$x1b1b1b1b
1662238384Sjkim	xor	$tp2,$m
1663238384Sjkim
1664238384Sjkim	and	$m,$tp2,$x80808080
1665238384Sjkim	and	$tp4,$tp2,$x7f7f7f7f
1666238384Sjkim	srl	$tp8,$m,7
1667238384Sjkim	addu	$tp4,$tp4		# tp4<<1
1668238384Sjkim	subu	$m,$tp8
1669238384Sjkim	and	$m,$x1b1b1b1b
1670238384Sjkim	xor	$tp4,$m
1671238384Sjkim
1672238384Sjkim	and	$m,$tp4,$x80808080
1673238384Sjkim	and	$tp8,$tp4,$x7f7f7f7f
1674238384Sjkim	srl	$tp9,$m,7
1675238384Sjkim	addu	$tp8,$tp8		# tp8<<1
1676238384Sjkim	subu	$m,$tp9
1677238384Sjkim	and	$m,$x1b1b1b1b
1678238384Sjkim	xor	$tp8,$m
1679238384Sjkim
1680238384Sjkim	xor	$tp9,$tp8,$tp1
1681238384Sjkim	xor	$tpe,$tp8,$tp4
1682238384Sjkim	xor	$tpb,$tp9,$tp2
1683238384Sjkim	xor	$tpd,$tp9,$tp4
1684238384Sjkim
1685290207Sjkim#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
1686290207Sjkim	rotr	$tp1,$tpd,16
1687290207Sjkim	 xor	$tpe,$tp2
1688290207Sjkim	rotr	$tp2,$tp9,8
1689290207Sjkim	xor	$tpe,$tp1
1690290207Sjkim	rotr	$tp4,$tpb,24
1691290207Sjkim	xor	$tpe,$tp2
1692290207Sjkim	lw	$tp1,4($key)		# modulo-scheduled
1693290207Sjkim	xor	$tpe,$tp4
1694290207Sjkim#else
1695238384Sjkim	_ror	$tp1,$tpd,16
1696238384Sjkim	 xor	$tpe,$tp2
1697238384Sjkim	_ror	$tp2,$tpd,-16
1698238384Sjkim	xor	$tpe,$tp1
1699238384Sjkim	_ror	$tp1,$tp9,8
1700238384Sjkim	xor	$tpe,$tp2
1701238384Sjkim	_ror	$tp2,$tp9,-24
1702238384Sjkim	xor	$tpe,$tp1
1703238384Sjkim	_ror	$tp1,$tpb,24
1704238384Sjkim	xor	$tpe,$tp2
1705238384Sjkim	_ror	$tp2,$tpb,-8
1706238384Sjkim	xor	$tpe,$tp1
1707238384Sjkim	lw	$tp1,4($key)		# modulo-scheduled
1708238384Sjkim	xor	$tpe,$tp2
1709290207Sjkim#endif
1710238384Sjkim	sub	$cnt,1
1711238384Sjkim	sw	$tpe,0($key)
1712238384Sjkim	$PTR_ADD $key,4
1713238384Sjkim	bnez	$cnt,.Lmix
1714238384Sjkim
1715238384Sjkim	li	$t0,0
1716238384Sjkim.Ldkey_done:
1717238384Sjkim	.set	noreorder
1718238384Sjkim	move	$a0,$t0
1719238384Sjkim	$REG_L	$ra,$FRAMESIZE-1*$SZREG($sp)
1720238384Sjkim	$REG_L	$fp,$FRAMESIZE-2*$SZREG($sp)
1721238384Sjkim___
1722238384Sjkim$code.=<<___ if ($flavour =~ /nubi/i);
1723238384Sjkim	$REG_L	$s3,$FRAMESIZE-11*$SZREG($sp)
1724238384Sjkim	$REG_L	$s2,$FRAMESIZE-12*$SZREG($sp)
1725238384Sjkim	$REG_L	$s1,$FRAMESIZE-13*$SZREG($sp)
1726238384Sjkim	$REG_L	$s0,$FRAMESIZE-14*$SZREG($sp)
1727238384Sjkim	$REG_L	$gp,$FRAMESIZE-15*$SZREG($sp)
1728238384Sjkim___
1729238384Sjkim$code.=<<___;
1730238384Sjkim	jr	$ra
1731238384Sjkim	$PTR_ADD $sp,$FRAMESIZE
1732246772Sjkim.end	private_AES_set_decrypt_key
1733238384Sjkim___
1734238384Sjkim}}}
1735238384Sjkim
1736238384Sjkim######################################################################
1737238384Sjkim# Tables are kept in endian-neutral manner
1738238384Sjkim$code.=<<___;
1739238384Sjkim.rdata
1740290207Sjkim.align	10
1741238384SjkimAES_Te:
1742238384Sjkim.byte	0xc6,0x63,0x63,0xa5,	0xf8,0x7c,0x7c,0x84	# Te0
1743238384Sjkim.byte	0xee,0x77,0x77,0x99,	0xf6,0x7b,0x7b,0x8d
1744238384Sjkim.byte	0xff,0xf2,0xf2,0x0d,	0xd6,0x6b,0x6b,0xbd
1745238384Sjkim.byte	0xde,0x6f,0x6f,0xb1,	0x91,0xc5,0xc5,0x54
1746238384Sjkim.byte	0x60,0x30,0x30,0x50,	0x02,0x01,0x01,0x03
1747238384Sjkim.byte	0xce,0x67,0x67,0xa9,	0x56,0x2b,0x2b,0x7d
1748238384Sjkim.byte	0xe7,0xfe,0xfe,0x19,	0xb5,0xd7,0xd7,0x62
1749238384Sjkim.byte	0x4d,0xab,0xab,0xe6,	0xec,0x76,0x76,0x9a
1750238384Sjkim.byte	0x8f,0xca,0xca,0x45,	0x1f,0x82,0x82,0x9d
1751238384Sjkim.byte	0x89,0xc9,0xc9,0x40,	0xfa,0x7d,0x7d,0x87
1752238384Sjkim.byte	0xef,0xfa,0xfa,0x15,	0xb2,0x59,0x59,0xeb
1753238384Sjkim.byte	0x8e,0x47,0x47,0xc9,	0xfb,0xf0,0xf0,0x0b
1754238384Sjkim.byte	0x41,0xad,0xad,0xec,	0xb3,0xd4,0xd4,0x67
1755238384Sjkim.byte	0x5f,0xa2,0xa2,0xfd,	0x45,0xaf,0xaf,0xea
1756238384Sjkim.byte	0x23,0x9c,0x9c,0xbf,	0x53,0xa4,0xa4,0xf7
1757238384Sjkim.byte	0xe4,0x72,0x72,0x96,	0x9b,0xc0,0xc0,0x5b
1758238384Sjkim.byte	0x75,0xb7,0xb7,0xc2,	0xe1,0xfd,0xfd,0x1c
1759238384Sjkim.byte	0x3d,0x93,0x93,0xae,	0x4c,0x26,0x26,0x6a
1760238384Sjkim.byte	0x6c,0x36,0x36,0x5a,	0x7e,0x3f,0x3f,0x41
1761238384Sjkim.byte	0xf5,0xf7,0xf7,0x02,	0x83,0xcc,0xcc,0x4f
1762238384Sjkim.byte	0x68,0x34,0x34,0x5c,	0x51,0xa5,0xa5,0xf4
1763238384Sjkim.byte	0xd1,0xe5,0xe5,0x34,	0xf9,0xf1,0xf1,0x08
1764238384Sjkim.byte	0xe2,0x71,0x71,0x93,	0xab,0xd8,0xd8,0x73
1765238384Sjkim.byte	0x62,0x31,0x31,0x53,	0x2a,0x15,0x15,0x3f
1766238384Sjkim.byte	0x08,0x04,0x04,0x0c,	0x95,0xc7,0xc7,0x52
1767238384Sjkim.byte	0x46,0x23,0x23,0x65,	0x9d,0xc3,0xc3,0x5e
1768238384Sjkim.byte	0x30,0x18,0x18,0x28,	0x37,0x96,0x96,0xa1
1769238384Sjkim.byte	0x0a,0x05,0x05,0x0f,	0x2f,0x9a,0x9a,0xb5
1770238384Sjkim.byte	0x0e,0x07,0x07,0x09,	0x24,0x12,0x12,0x36
1771238384Sjkim.byte	0x1b,0x80,0x80,0x9b,	0xdf,0xe2,0xe2,0x3d
1772238384Sjkim.byte	0xcd,0xeb,0xeb,0x26,	0x4e,0x27,0x27,0x69
1773238384Sjkim.byte	0x7f,0xb2,0xb2,0xcd,	0xea,0x75,0x75,0x9f
1774238384Sjkim.byte	0x12,0x09,0x09,0x1b,	0x1d,0x83,0x83,0x9e
1775238384Sjkim.byte	0x58,0x2c,0x2c,0x74,	0x34,0x1a,0x1a,0x2e
1776238384Sjkim.byte	0x36,0x1b,0x1b,0x2d,	0xdc,0x6e,0x6e,0xb2
1777238384Sjkim.byte	0xb4,0x5a,0x5a,0xee,	0x5b,0xa0,0xa0,0xfb
1778238384Sjkim.byte	0xa4,0x52,0x52,0xf6,	0x76,0x3b,0x3b,0x4d
1779238384Sjkim.byte	0xb7,0xd6,0xd6,0x61,	0x7d,0xb3,0xb3,0xce
1780238384Sjkim.byte	0x52,0x29,0x29,0x7b,	0xdd,0xe3,0xe3,0x3e
1781238384Sjkim.byte	0x5e,0x2f,0x2f,0x71,	0x13,0x84,0x84,0x97
1782238384Sjkim.byte	0xa6,0x53,0x53,0xf5,	0xb9,0xd1,0xd1,0x68
1783238384Sjkim.byte	0x00,0x00,0x00,0x00,	0xc1,0xed,0xed,0x2c
1784238384Sjkim.byte	0x40,0x20,0x20,0x60,	0xe3,0xfc,0xfc,0x1f
1785238384Sjkim.byte	0x79,0xb1,0xb1,0xc8,	0xb6,0x5b,0x5b,0xed
1786238384Sjkim.byte	0xd4,0x6a,0x6a,0xbe,	0x8d,0xcb,0xcb,0x46
1787238384Sjkim.byte	0x67,0xbe,0xbe,0xd9,	0x72,0x39,0x39,0x4b
1788238384Sjkim.byte	0x94,0x4a,0x4a,0xde,	0x98,0x4c,0x4c,0xd4
1789238384Sjkim.byte	0xb0,0x58,0x58,0xe8,	0x85,0xcf,0xcf,0x4a
1790238384Sjkim.byte	0xbb,0xd0,0xd0,0x6b,	0xc5,0xef,0xef,0x2a
1791238384Sjkim.byte	0x4f,0xaa,0xaa,0xe5,	0xed,0xfb,0xfb,0x16
1792238384Sjkim.byte	0x86,0x43,0x43,0xc5,	0x9a,0x4d,0x4d,0xd7
1793238384Sjkim.byte	0x66,0x33,0x33,0x55,	0x11,0x85,0x85,0x94
1794238384Sjkim.byte	0x8a,0x45,0x45,0xcf,	0xe9,0xf9,0xf9,0x10
1795238384Sjkim.byte	0x04,0x02,0x02,0x06,	0xfe,0x7f,0x7f,0x81
1796238384Sjkim.byte	0xa0,0x50,0x50,0xf0,	0x78,0x3c,0x3c,0x44
1797238384Sjkim.byte	0x25,0x9f,0x9f,0xba,	0x4b,0xa8,0xa8,0xe3
1798238384Sjkim.byte	0xa2,0x51,0x51,0xf3,	0x5d,0xa3,0xa3,0xfe
1799238384Sjkim.byte	0x80,0x40,0x40,0xc0,	0x05,0x8f,0x8f,0x8a
1800238384Sjkim.byte	0x3f,0x92,0x92,0xad,	0x21,0x9d,0x9d,0xbc
1801238384Sjkim.byte	0x70,0x38,0x38,0x48,	0xf1,0xf5,0xf5,0x04
1802238384Sjkim.byte	0x63,0xbc,0xbc,0xdf,	0x77,0xb6,0xb6,0xc1
1803238384Sjkim.byte	0xaf,0xda,0xda,0x75,	0x42,0x21,0x21,0x63
1804238384Sjkim.byte	0x20,0x10,0x10,0x30,	0xe5,0xff,0xff,0x1a
1805238384Sjkim.byte	0xfd,0xf3,0xf3,0x0e,	0xbf,0xd2,0xd2,0x6d
1806238384Sjkim.byte	0x81,0xcd,0xcd,0x4c,	0x18,0x0c,0x0c,0x14
1807238384Sjkim.byte	0x26,0x13,0x13,0x35,	0xc3,0xec,0xec,0x2f
1808238384Sjkim.byte	0xbe,0x5f,0x5f,0xe1,	0x35,0x97,0x97,0xa2
1809238384Sjkim.byte	0x88,0x44,0x44,0xcc,	0x2e,0x17,0x17,0x39
1810238384Sjkim.byte	0x93,0xc4,0xc4,0x57,	0x55,0xa7,0xa7,0xf2
1811238384Sjkim.byte	0xfc,0x7e,0x7e,0x82,	0x7a,0x3d,0x3d,0x47
1812238384Sjkim.byte	0xc8,0x64,0x64,0xac,	0xba,0x5d,0x5d,0xe7
1813238384Sjkim.byte	0x32,0x19,0x19,0x2b,	0xe6,0x73,0x73,0x95
1814238384Sjkim.byte	0xc0,0x60,0x60,0xa0,	0x19,0x81,0x81,0x98
1815238384Sjkim.byte	0x9e,0x4f,0x4f,0xd1,	0xa3,0xdc,0xdc,0x7f
1816238384Sjkim.byte	0x44,0x22,0x22,0x66,	0x54,0x2a,0x2a,0x7e
1817238384Sjkim.byte	0x3b,0x90,0x90,0xab,	0x0b,0x88,0x88,0x83
1818238384Sjkim.byte	0x8c,0x46,0x46,0xca,	0xc7,0xee,0xee,0x29
1819238384Sjkim.byte	0x6b,0xb8,0xb8,0xd3,	0x28,0x14,0x14,0x3c
1820238384Sjkim.byte	0xa7,0xde,0xde,0x79,	0xbc,0x5e,0x5e,0xe2
1821238384Sjkim.byte	0x16,0x0b,0x0b,0x1d,	0xad,0xdb,0xdb,0x76
1822238384Sjkim.byte	0xdb,0xe0,0xe0,0x3b,	0x64,0x32,0x32,0x56
1823238384Sjkim.byte	0x74,0x3a,0x3a,0x4e,	0x14,0x0a,0x0a,0x1e
1824238384Sjkim.byte	0x92,0x49,0x49,0xdb,	0x0c,0x06,0x06,0x0a
1825238384Sjkim.byte	0x48,0x24,0x24,0x6c,	0xb8,0x5c,0x5c,0xe4
1826238384Sjkim.byte	0x9f,0xc2,0xc2,0x5d,	0xbd,0xd3,0xd3,0x6e
1827238384Sjkim.byte	0x43,0xac,0xac,0xef,	0xc4,0x62,0x62,0xa6
1828238384Sjkim.byte	0x39,0x91,0x91,0xa8,	0x31,0x95,0x95,0xa4
1829238384Sjkim.byte	0xd3,0xe4,0xe4,0x37,	0xf2,0x79,0x79,0x8b
1830238384Sjkim.byte	0xd5,0xe7,0xe7,0x32,	0x8b,0xc8,0xc8,0x43
1831238384Sjkim.byte	0x6e,0x37,0x37,0x59,	0xda,0x6d,0x6d,0xb7
1832238384Sjkim.byte	0x01,0x8d,0x8d,0x8c,	0xb1,0xd5,0xd5,0x64
1833238384Sjkim.byte	0x9c,0x4e,0x4e,0xd2,	0x49,0xa9,0xa9,0xe0
1834238384Sjkim.byte	0xd8,0x6c,0x6c,0xb4,	0xac,0x56,0x56,0xfa
1835238384Sjkim.byte	0xf3,0xf4,0xf4,0x07,	0xcf,0xea,0xea,0x25
1836238384Sjkim.byte	0xca,0x65,0x65,0xaf,	0xf4,0x7a,0x7a,0x8e
1837238384Sjkim.byte	0x47,0xae,0xae,0xe9,	0x10,0x08,0x08,0x18
1838238384Sjkim.byte	0x6f,0xba,0xba,0xd5,	0xf0,0x78,0x78,0x88
1839238384Sjkim.byte	0x4a,0x25,0x25,0x6f,	0x5c,0x2e,0x2e,0x72
1840238384Sjkim.byte	0x38,0x1c,0x1c,0x24,	0x57,0xa6,0xa6,0xf1
1841238384Sjkim.byte	0x73,0xb4,0xb4,0xc7,	0x97,0xc6,0xc6,0x51
1842238384Sjkim.byte	0xcb,0xe8,0xe8,0x23,	0xa1,0xdd,0xdd,0x7c
1843238384Sjkim.byte	0xe8,0x74,0x74,0x9c,	0x3e,0x1f,0x1f,0x21
1844238384Sjkim.byte	0x96,0x4b,0x4b,0xdd,	0x61,0xbd,0xbd,0xdc
1845238384Sjkim.byte	0x0d,0x8b,0x8b,0x86,	0x0f,0x8a,0x8a,0x85
1846238384Sjkim.byte	0xe0,0x70,0x70,0x90,	0x7c,0x3e,0x3e,0x42
1847238384Sjkim.byte	0x71,0xb5,0xb5,0xc4,	0xcc,0x66,0x66,0xaa
1848238384Sjkim.byte	0x90,0x48,0x48,0xd8,	0x06,0x03,0x03,0x05
1849238384Sjkim.byte	0xf7,0xf6,0xf6,0x01,	0x1c,0x0e,0x0e,0x12
1850238384Sjkim.byte	0xc2,0x61,0x61,0xa3,	0x6a,0x35,0x35,0x5f
1851238384Sjkim.byte	0xae,0x57,0x57,0xf9,	0x69,0xb9,0xb9,0xd0
1852238384Sjkim.byte	0x17,0x86,0x86,0x91,	0x99,0xc1,0xc1,0x58
1853238384Sjkim.byte	0x3a,0x1d,0x1d,0x27,	0x27,0x9e,0x9e,0xb9
1854238384Sjkim.byte	0xd9,0xe1,0xe1,0x38,	0xeb,0xf8,0xf8,0x13
1855238384Sjkim.byte	0x2b,0x98,0x98,0xb3,	0x22,0x11,0x11,0x33
1856238384Sjkim.byte	0xd2,0x69,0x69,0xbb,	0xa9,0xd9,0xd9,0x70
1857238384Sjkim.byte	0x07,0x8e,0x8e,0x89,	0x33,0x94,0x94,0xa7
1858238384Sjkim.byte	0x2d,0x9b,0x9b,0xb6,	0x3c,0x1e,0x1e,0x22
1859238384Sjkim.byte	0x15,0x87,0x87,0x92,	0xc9,0xe9,0xe9,0x20
1860238384Sjkim.byte	0x87,0xce,0xce,0x49,	0xaa,0x55,0x55,0xff
1861238384Sjkim.byte	0x50,0x28,0x28,0x78,	0xa5,0xdf,0xdf,0x7a
1862238384Sjkim.byte	0x03,0x8c,0x8c,0x8f,	0x59,0xa1,0xa1,0xf8
1863238384Sjkim.byte	0x09,0x89,0x89,0x80,	0x1a,0x0d,0x0d,0x17
1864238384Sjkim.byte	0x65,0xbf,0xbf,0xda,	0xd7,0xe6,0xe6,0x31
1865238384Sjkim.byte	0x84,0x42,0x42,0xc6,	0xd0,0x68,0x68,0xb8
1866238384Sjkim.byte	0x82,0x41,0x41,0xc3,	0x29,0x99,0x99,0xb0
1867238384Sjkim.byte	0x5a,0x2d,0x2d,0x77,	0x1e,0x0f,0x0f,0x11
1868238384Sjkim.byte	0x7b,0xb0,0xb0,0xcb,	0xa8,0x54,0x54,0xfc
1869238384Sjkim.byte	0x6d,0xbb,0xbb,0xd6,	0x2c,0x16,0x16,0x3a
1870238384Sjkim
1871238384SjkimAES_Td:
1872238384Sjkim.byte	0x51,0xf4,0xa7,0x50,	0x7e,0x41,0x65,0x53	# Td0
1873238384Sjkim.byte	0x1a,0x17,0xa4,0xc3,	0x3a,0x27,0x5e,0x96
1874238384Sjkim.byte	0x3b,0xab,0x6b,0xcb,	0x1f,0x9d,0x45,0xf1
1875238384Sjkim.byte	0xac,0xfa,0x58,0xab,	0x4b,0xe3,0x03,0x93
1876238384Sjkim.byte	0x20,0x30,0xfa,0x55,	0xad,0x76,0x6d,0xf6
1877238384Sjkim.byte	0x88,0xcc,0x76,0x91,	0xf5,0x02,0x4c,0x25
1878238384Sjkim.byte	0x4f,0xe5,0xd7,0xfc,	0xc5,0x2a,0xcb,0xd7
1879238384Sjkim.byte	0x26,0x35,0x44,0x80,	0xb5,0x62,0xa3,0x8f
1880238384Sjkim.byte	0xde,0xb1,0x5a,0x49,	0x25,0xba,0x1b,0x67
1881238384Sjkim.byte	0x45,0xea,0x0e,0x98,	0x5d,0xfe,0xc0,0xe1
1882238384Sjkim.byte	0xc3,0x2f,0x75,0x02,	0x81,0x4c,0xf0,0x12
1883238384Sjkim.byte	0x8d,0x46,0x97,0xa3,	0x6b,0xd3,0xf9,0xc6
1884238384Sjkim.byte	0x03,0x8f,0x5f,0xe7,	0x15,0x92,0x9c,0x95
1885238384Sjkim.byte	0xbf,0x6d,0x7a,0xeb,	0x95,0x52,0x59,0xda
1886238384Sjkim.byte	0xd4,0xbe,0x83,0x2d,	0x58,0x74,0x21,0xd3
1887238384Sjkim.byte	0x49,0xe0,0x69,0x29,	0x8e,0xc9,0xc8,0x44
1888238384Sjkim.byte	0x75,0xc2,0x89,0x6a,	0xf4,0x8e,0x79,0x78
1889238384Sjkim.byte	0x99,0x58,0x3e,0x6b,	0x27,0xb9,0x71,0xdd
1890238384Sjkim.byte	0xbe,0xe1,0x4f,0xb6,	0xf0,0x88,0xad,0x17
1891238384Sjkim.byte	0xc9,0x20,0xac,0x66,	0x7d,0xce,0x3a,0xb4
1892238384Sjkim.byte	0x63,0xdf,0x4a,0x18,	0xe5,0x1a,0x31,0x82
1893238384Sjkim.byte	0x97,0x51,0x33,0x60,	0x62,0x53,0x7f,0x45
1894238384Sjkim.byte	0xb1,0x64,0x77,0xe0,	0xbb,0x6b,0xae,0x84
1895238384Sjkim.byte	0xfe,0x81,0xa0,0x1c,	0xf9,0x08,0x2b,0x94
1896238384Sjkim.byte	0x70,0x48,0x68,0x58,	0x8f,0x45,0xfd,0x19
1897238384Sjkim.byte	0x94,0xde,0x6c,0x87,	0x52,0x7b,0xf8,0xb7
1898238384Sjkim.byte	0xab,0x73,0xd3,0x23,	0x72,0x4b,0x02,0xe2
1899238384Sjkim.byte	0xe3,0x1f,0x8f,0x57,	0x66,0x55,0xab,0x2a
1900238384Sjkim.byte	0xb2,0xeb,0x28,0x07,	0x2f,0xb5,0xc2,0x03
1901238384Sjkim.byte	0x86,0xc5,0x7b,0x9a,	0xd3,0x37,0x08,0xa5
1902238384Sjkim.byte	0x30,0x28,0x87,0xf2,	0x23,0xbf,0xa5,0xb2
1903238384Sjkim.byte	0x02,0x03,0x6a,0xba,	0xed,0x16,0x82,0x5c
1904238384Sjkim.byte	0x8a,0xcf,0x1c,0x2b,	0xa7,0x79,0xb4,0x92
1905238384Sjkim.byte	0xf3,0x07,0xf2,0xf0,	0x4e,0x69,0xe2,0xa1
1906238384Sjkim.byte	0x65,0xda,0xf4,0xcd,	0x06,0x05,0xbe,0xd5
1907238384Sjkim.byte	0xd1,0x34,0x62,0x1f,	0xc4,0xa6,0xfe,0x8a
1908238384Sjkim.byte	0x34,0x2e,0x53,0x9d,	0xa2,0xf3,0x55,0xa0
1909238384Sjkim.byte	0x05,0x8a,0xe1,0x32,	0xa4,0xf6,0xeb,0x75
1910238384Sjkim.byte	0x0b,0x83,0xec,0x39,	0x40,0x60,0xef,0xaa
1911238384Sjkim.byte	0x5e,0x71,0x9f,0x06,	0xbd,0x6e,0x10,0x51
1912238384Sjkim.byte	0x3e,0x21,0x8a,0xf9,	0x96,0xdd,0x06,0x3d
1913238384Sjkim.byte	0xdd,0x3e,0x05,0xae,	0x4d,0xe6,0xbd,0x46
1914238384Sjkim.byte	0x91,0x54,0x8d,0xb5,	0x71,0xc4,0x5d,0x05
1915238384Sjkim.byte	0x04,0x06,0xd4,0x6f,	0x60,0x50,0x15,0xff
1916238384Sjkim.byte	0x19,0x98,0xfb,0x24,	0xd6,0xbd,0xe9,0x97
1917238384Sjkim.byte	0x89,0x40,0x43,0xcc,	0x67,0xd9,0x9e,0x77
1918238384Sjkim.byte	0xb0,0xe8,0x42,0xbd,	0x07,0x89,0x8b,0x88
1919238384Sjkim.byte	0xe7,0x19,0x5b,0x38,	0x79,0xc8,0xee,0xdb
1920238384Sjkim.byte	0xa1,0x7c,0x0a,0x47,	0x7c,0x42,0x0f,0xe9
1921238384Sjkim.byte	0xf8,0x84,0x1e,0xc9,	0x00,0x00,0x00,0x00
1922238384Sjkim.byte	0x09,0x80,0x86,0x83,	0x32,0x2b,0xed,0x48
1923238384Sjkim.byte	0x1e,0x11,0x70,0xac,	0x6c,0x5a,0x72,0x4e
1924238384Sjkim.byte	0xfd,0x0e,0xff,0xfb,	0x0f,0x85,0x38,0x56
1925238384Sjkim.byte	0x3d,0xae,0xd5,0x1e,	0x36,0x2d,0x39,0x27
1926238384Sjkim.byte	0x0a,0x0f,0xd9,0x64,	0x68,0x5c,0xa6,0x21
1927238384Sjkim.byte	0x9b,0x5b,0x54,0xd1,	0x24,0x36,0x2e,0x3a
1928238384Sjkim.byte	0x0c,0x0a,0x67,0xb1,	0x93,0x57,0xe7,0x0f
1929238384Sjkim.byte	0xb4,0xee,0x96,0xd2,	0x1b,0x9b,0x91,0x9e
1930238384Sjkim.byte	0x80,0xc0,0xc5,0x4f,	0x61,0xdc,0x20,0xa2
1931238384Sjkim.byte	0x5a,0x77,0x4b,0x69,	0x1c,0x12,0x1a,0x16
1932238384Sjkim.byte	0xe2,0x93,0xba,0x0a,	0xc0,0xa0,0x2a,0xe5
1933238384Sjkim.byte	0x3c,0x22,0xe0,0x43,	0x12,0x1b,0x17,0x1d
1934238384Sjkim.byte	0x0e,0x09,0x0d,0x0b,	0xf2,0x8b,0xc7,0xad
1935238384Sjkim.byte	0x2d,0xb6,0xa8,0xb9,	0x14,0x1e,0xa9,0xc8
1936238384Sjkim.byte	0x57,0xf1,0x19,0x85,	0xaf,0x75,0x07,0x4c
1937238384Sjkim.byte	0xee,0x99,0xdd,0xbb,	0xa3,0x7f,0x60,0xfd
1938238384Sjkim.byte	0xf7,0x01,0x26,0x9f,	0x5c,0x72,0xf5,0xbc
1939238384Sjkim.byte	0x44,0x66,0x3b,0xc5,	0x5b,0xfb,0x7e,0x34
1940238384Sjkim.byte	0x8b,0x43,0x29,0x76,	0xcb,0x23,0xc6,0xdc
1941238384Sjkim.byte	0xb6,0xed,0xfc,0x68,	0xb8,0xe4,0xf1,0x63
1942238384Sjkim.byte	0xd7,0x31,0xdc,0xca,	0x42,0x63,0x85,0x10
1943238384Sjkim.byte	0x13,0x97,0x22,0x40,	0x84,0xc6,0x11,0x20
1944238384Sjkim.byte	0x85,0x4a,0x24,0x7d,	0xd2,0xbb,0x3d,0xf8
1945238384Sjkim.byte	0xae,0xf9,0x32,0x11,	0xc7,0x29,0xa1,0x6d
1946238384Sjkim.byte	0x1d,0x9e,0x2f,0x4b,	0xdc,0xb2,0x30,0xf3
1947238384Sjkim.byte	0x0d,0x86,0x52,0xec,	0x77,0xc1,0xe3,0xd0
1948238384Sjkim.byte	0x2b,0xb3,0x16,0x6c,	0xa9,0x70,0xb9,0x99
1949238384Sjkim.byte	0x11,0x94,0x48,0xfa,	0x47,0xe9,0x64,0x22
1950238384Sjkim.byte	0xa8,0xfc,0x8c,0xc4,	0xa0,0xf0,0x3f,0x1a
1951238384Sjkim.byte	0x56,0x7d,0x2c,0xd8,	0x22,0x33,0x90,0xef
1952238384Sjkim.byte	0x87,0x49,0x4e,0xc7,	0xd9,0x38,0xd1,0xc1
1953238384Sjkim.byte	0x8c,0xca,0xa2,0xfe,	0x98,0xd4,0x0b,0x36
1954238384Sjkim.byte	0xa6,0xf5,0x81,0xcf,	0xa5,0x7a,0xde,0x28
1955238384Sjkim.byte	0xda,0xb7,0x8e,0x26,	0x3f,0xad,0xbf,0xa4
1956238384Sjkim.byte	0x2c,0x3a,0x9d,0xe4,	0x50,0x78,0x92,0x0d
1957238384Sjkim.byte	0x6a,0x5f,0xcc,0x9b,	0x54,0x7e,0x46,0x62
1958238384Sjkim.byte	0xf6,0x8d,0x13,0xc2,	0x90,0xd8,0xb8,0xe8
1959238384Sjkim.byte	0x2e,0x39,0xf7,0x5e,	0x82,0xc3,0xaf,0xf5
1960238384Sjkim.byte	0x9f,0x5d,0x80,0xbe,	0x69,0xd0,0x93,0x7c
1961238384Sjkim.byte	0x6f,0xd5,0x2d,0xa9,	0xcf,0x25,0x12,0xb3
1962238384Sjkim.byte	0xc8,0xac,0x99,0x3b,	0x10,0x18,0x7d,0xa7
1963238384Sjkim.byte	0xe8,0x9c,0x63,0x6e,	0xdb,0x3b,0xbb,0x7b
1964238384Sjkim.byte	0xcd,0x26,0x78,0x09,	0x6e,0x59,0x18,0xf4
1965238384Sjkim.byte	0xec,0x9a,0xb7,0x01,	0x83,0x4f,0x9a,0xa8
1966238384Sjkim.byte	0xe6,0x95,0x6e,0x65,	0xaa,0xff,0xe6,0x7e
1967238384Sjkim.byte	0x21,0xbc,0xcf,0x08,	0xef,0x15,0xe8,0xe6
1968238384Sjkim.byte	0xba,0xe7,0x9b,0xd9,	0x4a,0x6f,0x36,0xce
1969238384Sjkim.byte	0xea,0x9f,0x09,0xd4,	0x29,0xb0,0x7c,0xd6
1970238384Sjkim.byte	0x31,0xa4,0xb2,0xaf,	0x2a,0x3f,0x23,0x31
1971238384Sjkim.byte	0xc6,0xa5,0x94,0x30,	0x35,0xa2,0x66,0xc0
1972238384Sjkim.byte	0x74,0x4e,0xbc,0x37,	0xfc,0x82,0xca,0xa6
1973238384Sjkim.byte	0xe0,0x90,0xd0,0xb0,	0x33,0xa7,0xd8,0x15
1974238384Sjkim.byte	0xf1,0x04,0x98,0x4a,	0x41,0xec,0xda,0xf7
1975238384Sjkim.byte	0x7f,0xcd,0x50,0x0e,	0x17,0x91,0xf6,0x2f
1976238384Sjkim.byte	0x76,0x4d,0xd6,0x8d,	0x43,0xef,0xb0,0x4d
1977238384Sjkim.byte	0xcc,0xaa,0x4d,0x54,	0xe4,0x96,0x04,0xdf
1978238384Sjkim.byte	0x9e,0xd1,0xb5,0xe3,	0x4c,0x6a,0x88,0x1b
1979238384Sjkim.byte	0xc1,0x2c,0x1f,0xb8,	0x46,0x65,0x51,0x7f
1980238384Sjkim.byte	0x9d,0x5e,0xea,0x04,	0x01,0x8c,0x35,0x5d
1981238384Sjkim.byte	0xfa,0x87,0x74,0x73,	0xfb,0x0b,0x41,0x2e
1982238384Sjkim.byte	0xb3,0x67,0x1d,0x5a,	0x92,0xdb,0xd2,0x52
1983238384Sjkim.byte	0xe9,0x10,0x56,0x33,	0x6d,0xd6,0x47,0x13
1984238384Sjkim.byte	0x9a,0xd7,0x61,0x8c,	0x37,0xa1,0x0c,0x7a
1985238384Sjkim.byte	0x59,0xf8,0x14,0x8e,	0xeb,0x13,0x3c,0x89
1986238384Sjkim.byte	0xce,0xa9,0x27,0xee,	0xb7,0x61,0xc9,0x35
1987238384Sjkim.byte	0xe1,0x1c,0xe5,0xed,	0x7a,0x47,0xb1,0x3c
1988238384Sjkim.byte	0x9c,0xd2,0xdf,0x59,	0x55,0xf2,0x73,0x3f
1989238384Sjkim.byte	0x18,0x14,0xce,0x79,	0x73,0xc7,0x37,0xbf
1990238384Sjkim.byte	0x53,0xf7,0xcd,0xea,	0x5f,0xfd,0xaa,0x5b
1991238384Sjkim.byte	0xdf,0x3d,0x6f,0x14,	0x78,0x44,0xdb,0x86
1992238384Sjkim.byte	0xca,0xaf,0xf3,0x81,	0xb9,0x68,0xc4,0x3e
1993238384Sjkim.byte	0x38,0x24,0x34,0x2c,	0xc2,0xa3,0x40,0x5f
1994238384Sjkim.byte	0x16,0x1d,0xc3,0x72,	0xbc,0xe2,0x25,0x0c
1995238384Sjkim.byte	0x28,0x3c,0x49,0x8b,	0xff,0x0d,0x95,0x41
1996238384Sjkim.byte	0x39,0xa8,0x01,0x71,	0x08,0x0c,0xb3,0xde
1997238384Sjkim.byte	0xd8,0xb4,0xe4,0x9c,	0x64,0x56,0xc1,0x90
1998238384Sjkim.byte	0x7b,0xcb,0x84,0x61,	0xd5,0x32,0xb6,0x70
1999238384Sjkim.byte	0x48,0x6c,0x5c,0x74,	0xd0,0xb8,0x57,0x42
2000238384Sjkim
2001238384Sjkim.byte	0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38	# Td4
2002238384Sjkim.byte	0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb
2003238384Sjkim.byte	0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87
2004238384Sjkim.byte	0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb
2005238384Sjkim.byte	0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d
2006238384Sjkim.byte	0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e
2007238384Sjkim.byte	0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2
2008238384Sjkim.byte	0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25
2009238384Sjkim.byte	0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16
2010238384Sjkim.byte	0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92
2011238384Sjkim.byte	0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda
2012238384Sjkim.byte	0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84
2013238384Sjkim.byte	0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a
2014238384Sjkim.byte	0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06
2015238384Sjkim.byte	0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02
2016238384Sjkim.byte	0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b
2017238384Sjkim.byte	0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea
2018238384Sjkim.byte	0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73
2019238384Sjkim.byte	0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85
2020238384Sjkim.byte	0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e
2021238384Sjkim.byte	0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89
2022238384Sjkim.byte	0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b
2023238384Sjkim.byte	0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20
2024238384Sjkim.byte	0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4
2025238384Sjkim.byte	0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31
2026238384Sjkim.byte	0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f
2027238384Sjkim.byte	0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d
2028238384Sjkim.byte	0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef
2029238384Sjkim.byte	0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0
2030238384Sjkim.byte	0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61
2031238384Sjkim.byte	0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26
2032238384Sjkim.byte	0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d
2033290207Sjkim
2034290207SjkimAES_Te4:
2035290207Sjkim.byte	0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5	# Te4
2036290207Sjkim.byte	0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76
2037290207Sjkim.byte	0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0
2038290207Sjkim.byte	0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0
2039290207Sjkim.byte	0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc
2040290207Sjkim.byte	0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15
2041290207Sjkim.byte	0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a
2042290207Sjkim.byte	0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75
2043290207Sjkim.byte	0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0
2044290207Sjkim.byte	0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84
2045290207Sjkim.byte	0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b
2046290207Sjkim.byte	0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf
2047290207Sjkim.byte	0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85
2048290207Sjkim.byte	0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8
2049290207Sjkim.byte	0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5
2050290207Sjkim.byte	0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2
2051290207Sjkim.byte	0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17
2052290207Sjkim.byte	0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73
2053290207Sjkim.byte	0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88
2054290207Sjkim.byte	0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb
2055290207Sjkim.byte	0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c
2056290207Sjkim.byte	0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79
2057290207Sjkim.byte	0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9
2058290207Sjkim.byte	0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08
2059290207Sjkim.byte	0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6
2060290207Sjkim.byte	0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a
2061290207Sjkim.byte	0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e
2062290207Sjkim.byte	0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e
2063290207Sjkim.byte	0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94
2064290207Sjkim.byte	0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf
2065290207Sjkim.byte	0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68
2066290207Sjkim.byte	0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
2067290207Sjkim
2068290207Sjkim.byte	0x01,0x00,0x00,0x00,	0x02,0x00,0x00,0x00	# rcon
2069290207Sjkim.byte	0x04,0x00,0x00,0x00,	0x08,0x00,0x00,0x00
2070290207Sjkim.byte	0x10,0x00,0x00,0x00,	0x20,0x00,0x00,0x00
2071290207Sjkim.byte	0x40,0x00,0x00,0x00,	0x80,0x00,0x00,0x00
2072290207Sjkim.byte	0x1B,0x00,0x00,0x00,	0x36,0x00,0x00,0x00
2073238384Sjkim___
2074238384Sjkim
2075238384Sjkimforeach (split("\n",$code)) {
2076238384Sjkim	s/\`([^\`]*)\`/eval $1/ge;
2077238384Sjkim
2078238384Sjkim	# made-up _instructions, _xtr, _ins, _ror and _bias, cope
2079238384Sjkim	# with byte order dependencies...
2080238384Sjkim	if (/^\s+_/) {
2081238384Sjkim	    s/(_[a-z]+\s+)(\$[0-9]+),([^,]+)(#.*)*$/$1$2,$2,$3/;
2082238384Sjkim
2083238384Sjkim	    s/_xtr\s+(\$[0-9]+),(\$[0-9]+),([0-9]+(\-2)*)/
2084238384Sjkim		sprintf("srl\t$1,$2,%d",$big_endian ?	eval($3)
2085238384Sjkim					:		eval("24-$3"))/e or
2086238384Sjkim	    s/_ins\s+(\$[0-9]+),(\$[0-9]+),([0-9]+)/
2087238384Sjkim		sprintf("sll\t$1,$2,%d",$big_endian ?	eval($3)
2088238384Sjkim					:		eval("24-$3"))/e or
2089290207Sjkim	    s/_ins2\s+(\$[0-9]+),(\$[0-9]+),([0-9]+)/
2090290207Sjkim		sprintf("ins\t$1,$2,%d,8",$big_endian ?	eval($3)
2091290207Sjkim					:		eval("24-$3"))/e or
2092238384Sjkim	    s/_ror\s+(\$[0-9]+),(\$[0-9]+),(\-?[0-9]+)/
2093238384Sjkim		sprintf("srl\t$1,$2,%d",$big_endian ?	eval($3)
2094238384Sjkim					:		eval("$3*-1"))/e or
2095238384Sjkim	    s/_bias\s+(\$[0-9]+),(\$[0-9]+),([0-9]+)/
2096238384Sjkim		sprintf("sll\t$1,$2,%d",$big_endian ?	eval($3)
2097238384Sjkim					:		eval("($3-16)&31"))/e;
2098238384Sjkim
2099238384Sjkim	    s/srl\s+(\$[0-9]+),(\$[0-9]+),\-([0-9]+)/
2100238384Sjkim		sprintf("sll\t$1,$2,$3")/e				or
2101238384Sjkim	    s/srl\s+(\$[0-9]+),(\$[0-9]+),0/
2102238384Sjkim		sprintf("and\t$1,$2,0xff")/e				or
2103238384Sjkim	    s/(sll\s+\$[0-9]+,\$[0-9]+,0)/#$1/;
2104238384Sjkim	}
2105238384Sjkim
2106238384Sjkim	# convert lwl/lwr and swr/swl to little-endian order
2107238384Sjkim	if (!$big_endian && /^\s+[sl]w[lr]\s+/) {
2108238384Sjkim	    s/([sl]wl.*)([0-9]+)\((\$[0-9]+)\)/
2109238384Sjkim		sprintf("$1%d($3)",eval("$2-$2%4+($2%4-1)&3"))/e	or
2110238384Sjkim	    s/([sl]wr.*)([0-9]+)\((\$[0-9]+)\)/
2111238384Sjkim		sprintf("$1%d($3)",eval("$2-$2%4+($2%4+1)&3"))/e;
2112238384Sjkim	}
2113238384Sjkim
2114290207Sjkim	if (!$big_endian) {
2115290207Sjkim	    s/(rotr\s+\$[0-9]+,\$[0-9]+),([0-9]+)/sprintf("$1,%d",32-$2)/e;
2116290207Sjkim	    s/(ext\s+\$[0-9]+,\$[0-9]+),([0-9]+),8/sprintf("$1,%d,8",24-$2)/e;
2117290207Sjkim	}
2118290207Sjkim
2119238384Sjkim	print $_,"\n";
2120238384Sjkim}
2121238384Sjkim
2122238384Sjkimclose STDOUT;
2123