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
23238384Sjkim######################################################################
24238384Sjkim# There is a number of MIPS ABI in use, O32 and N32/64 are most
25238384Sjkim# widely used. Then there is a new contender: NUBI. It appears that if
26238384Sjkim# one picks the latter, it's possible to arrange code in ABI neutral
27238384Sjkim# manner. Therefore let's stick to NUBI register layout:
28238384Sjkim#
29238384Sjkim($zero,$at,$t0,$t1,$t2)=map("\$$_",(0..2,24,25));
30238384Sjkim($a0,$a1,$a2,$a3,$a4,$a5,$a6,$a7)=map("\$$_",(4..11));
31238384Sjkim($s0,$s1,$s2,$s3,$s4,$s5,$s6,$s7,$s8,$s9,$s10,$s11)=map("\$$_",(12..23));
32238384Sjkim($gp,$tp,$sp,$fp,$ra)=map("\$$_",(3,28..31));
33238384Sjkim#
34238384Sjkim# The return value is placed in $a0. Following coding rules facilitate
35238384Sjkim# interoperability:
36238384Sjkim#
37238384Sjkim# - never ever touch $tp, "thread pointer", former $gp;
38238384Sjkim# - copy return value to $t0, former $v0 [or to $a0 if you're adapting
39238384Sjkim#   old code];
40238384Sjkim# - on O32 populate $a4-$a7 with 'lw $aN,4*N($sp)' if necessary;
41238384Sjkim#
42238384Sjkim# For reference here is register layout for N32/64 MIPS ABIs:
43238384Sjkim#
44238384Sjkim# ($zero,$at,$v0,$v1)=map("\$$_",(0..3));
45238384Sjkim# ($a0,$a1,$a2,$a3,$a4,$a5,$a6,$a7)=map("\$$_",(4..11));
46238384Sjkim# ($t0,$t1,$t2,$t3,$t8,$t9)=map("\$$_",(12..15,24,25));
47238384Sjkim# ($s0,$s1,$s2,$s3,$s4,$s5,$s6,$s7)=map("\$$_",(16..23));
48238384Sjkim# ($gp,$sp,$fp,$ra)=map("\$$_",(28..31));
49238384Sjkim#
50238384Sjkim$flavour = shift; # supported flavours are o32,n32,64,nubi32,nubi64
51238384Sjkim
52238384Sjkimif ($flavour =~ /64|n32/i) {
53238384Sjkim	$PTR_ADD="dadd";	# incidentally works even on n32
54238384Sjkim	$PTR_SUB="dsub";	# incidentally works even on n32
55238384Sjkim	$REG_S="sd";
56238384Sjkim	$REG_L="ld";
57238384Sjkim	$PTR_SLL="dsll";	# incidentally works even on n32
58238384Sjkim	$SZREG=8;
59238384Sjkim} else {
60238384Sjkim	$PTR_ADD="add";
61238384Sjkim	$PTR_SUB="sub";
62238384Sjkim	$REG_S="sw";
63238384Sjkim	$REG_L="lw";
64238384Sjkim	$PTR_SLL="sll";
65238384Sjkim	$SZREG=4;
66238384Sjkim}
67238384Sjkim$pf = ($flavour =~ /nubi/i) ? $t0 : $t2;
68238384Sjkim#
69238384Sjkim# <appro@openssl.org>
70238384Sjkim#
71238384Sjkim######################################################################
72238384Sjkim
73276864Sjkim$big_endian=(`echo MIPSEL | $ENV{CC} -E -`=~/MIPSEL/)?1:0 if ($ENV{CC});
74238384Sjkim
75238384Sjkimfor (@ARGV) {	$output=$_ if (/^\w[\w\-]*\.\w+$/);	}
76238384Sjkimopen STDOUT,">$output";
77238384Sjkim
78238384Sjkimif (!defined($big_endian))
79238384Sjkim{    $big_endian=(unpack('L',pack('N',1))==1);   }
80238384Sjkim
81238384Sjkimwhile (($output=shift) && ($output!~/^\w[\w\-]*\.\w+$/)) {}
82238384Sjkimopen STDOUT,">$output";
83238384Sjkim
84238384Sjkimmy ($MSB,$LSB)=(0,3);	# automatically converted to little-endian
85238384Sjkim
86238384Sjkim$code.=<<___;
87238384Sjkim.text
88238384Sjkim#ifdef OPENSSL_FIPSCANISTER
89238384Sjkim# include <openssl/fipssyms.h>
90238384Sjkim#endif
91238384Sjkim
92238384Sjkim#if !defined(__vxworks) || defined(__pic__)
93238384Sjkim.option	pic2
94238384Sjkim#endif
95238384Sjkim.set	noat
96238384Sjkim___
97238384Sjkim
98238384Sjkim{{{
99238384Sjkimmy $FRAMESIZE=16*$SZREG;
100238384Sjkimmy $SAVED_REGS_MASK = ($flavour =~ /nubi/i) ? 0xc0fff008 : 0xc0ff0000;
101238384Sjkim
102238384Sjkimmy ($inp,$out,$key,$Tbl,$s0,$s1,$s2,$s3)=($a0,$a1,$a2,$a3,$a4,$a5,$a6,$a7);
103238384Sjkimmy ($i0,$i1,$i2,$i3)=($at,$t0,$t1,$t2);
104238384Sjkimmy ($t0,$t1,$t2,$t3,$t4,$t5,$t6,$t7,$t8,$t9,$t10,$t11) = map("\$$_",(12..23));
105238384Sjkimmy ($key0,$cnt)=($gp,$fp);
106238384Sjkim
107238384Sjkim# instuction ordering is "stolen" from output from MIPSpro assembler
108238384Sjkim# invoked with -mips3 -O3 arguments...
109238384Sjkim$code.=<<___;
110238384Sjkim.align	5
111238384Sjkim.ent	_mips_AES_encrypt
112238384Sjkim_mips_AES_encrypt:
113238384Sjkim	.frame	$sp,0,$ra
114238384Sjkim	.set	reorder
115238384Sjkim	lw	$t0,0($key)
116238384Sjkim	lw	$t1,4($key)
117238384Sjkim	lw	$t2,8($key)
118238384Sjkim	lw	$t3,12($key)
119238384Sjkim	lw	$cnt,240($key)
120238384Sjkim	$PTR_ADD $key0,$key,16
121238384Sjkim
122238384Sjkim	xor	$s0,$t0
123238384Sjkim	xor	$s1,$t1
124238384Sjkim	xor	$s2,$t2
125238384Sjkim	xor	$s3,$t3
126238384Sjkim
127238384Sjkim	sub	$cnt,1
128238384Sjkim	_xtr	$i0,$s1,16-2
129238384Sjkim.Loop_enc:
130238384Sjkim	_xtr	$i1,$s2,16-2
131238384Sjkim	_xtr	$i2,$s3,16-2
132238384Sjkim	_xtr	$i3,$s0,16-2
133238384Sjkim	and	$i0,0x3fc
134238384Sjkim	and	$i1,0x3fc
135238384Sjkim	and	$i2,0x3fc
136238384Sjkim	and	$i3,0x3fc
137238384Sjkim	$PTR_ADD $i0,$Tbl
138238384Sjkim	$PTR_ADD $i1,$Tbl
139238384Sjkim	$PTR_ADD $i2,$Tbl
140238384Sjkim	$PTR_ADD $i3,$Tbl
141238384Sjkim	lwl	$t0,3($i0)		# Te1[s1>>16]
142238384Sjkim	lwl	$t1,3($i1)		# Te1[s2>>16]
143238384Sjkim	lwl	$t2,3($i2)		# Te1[s3>>16]
144238384Sjkim	lwl	$t3,3($i3)		# Te1[s0>>16]
145238384Sjkim	lwr	$t0,2($i0)		# Te1[s1>>16]
146238384Sjkim	lwr	$t1,2($i1)		# Te1[s2>>16]
147238384Sjkim	lwr	$t2,2($i2)		# Te1[s3>>16]
148238384Sjkim	lwr	$t3,2($i3)		# Te1[s0>>16]
149238384Sjkim
150238384Sjkim	_xtr	$i0,$s2,8-2
151238384Sjkim	_xtr	$i1,$s3,8-2
152238384Sjkim	_xtr	$i2,$s0,8-2
153238384Sjkim	_xtr	$i3,$s1,8-2
154238384Sjkim	and	$i0,0x3fc
155238384Sjkim	and	$i1,0x3fc
156238384Sjkim	and	$i2,0x3fc
157238384Sjkim	and	$i3,0x3fc
158238384Sjkim	$PTR_ADD $i0,$Tbl
159238384Sjkim	$PTR_ADD $i1,$Tbl
160238384Sjkim	$PTR_ADD $i2,$Tbl
161238384Sjkim	$PTR_ADD $i3,$Tbl
162238384Sjkim	lwl	$t4,2($i0)		# Te2[s2>>8]
163238384Sjkim	lwl	$t5,2($i1)		# Te2[s3>>8]
164238384Sjkim	lwl	$t6,2($i2)		# Te2[s0>>8]
165238384Sjkim	lwl	$t7,2($i3)		# Te2[s1>>8]
166238384Sjkim	lwr	$t4,1($i0)		# Te2[s2>>8]
167238384Sjkim	lwr	$t5,1($i1)		# Te2[s3>>8]
168238384Sjkim	lwr	$t6,1($i2)		# Te2[s0>>8]
169238384Sjkim	lwr	$t7,1($i3)		# Te2[s1>>8]
170238384Sjkim
171238384Sjkim	_xtr	$i0,$s3,0-2
172238384Sjkim	_xtr	$i1,$s0,0-2
173238384Sjkim	_xtr	$i2,$s1,0-2
174238384Sjkim	_xtr	$i3,$s2,0-2
175238384Sjkim	and	$i0,0x3fc
176238384Sjkim	and	$i1,0x3fc
177238384Sjkim	and	$i2,0x3fc
178238384Sjkim	and	$i3,0x3fc
179238384Sjkim	$PTR_ADD $i0,$Tbl
180238384Sjkim	$PTR_ADD $i1,$Tbl
181238384Sjkim	$PTR_ADD $i2,$Tbl
182238384Sjkim	$PTR_ADD $i3,$Tbl
183238384Sjkim	lwl	$t8,1($i0)		# Te3[s3]
184238384Sjkim	lwl	$t9,1($i1)		# Te3[s0]
185238384Sjkim	lwl	$t10,1($i2)		# Te3[s1]
186238384Sjkim	lwl	$t11,1($i3)		# Te3[s2]
187238384Sjkim	lwr	$t8,0($i0)		# Te3[s3]
188238384Sjkim	lwr	$t9,0($i1)		# Te3[s0]
189238384Sjkim	lwr	$t10,0($i2)		# Te3[s1]
190238384Sjkim	lwr	$t11,0($i3)		# Te3[s2]
191238384Sjkim
192238384Sjkim	_xtr	$i0,$s0,24-2
193238384Sjkim	_xtr	$i1,$s1,24-2
194238384Sjkim	_xtr	$i2,$s2,24-2
195238384Sjkim	_xtr	$i3,$s3,24-2
196238384Sjkim	and	$i0,0x3fc
197238384Sjkim	and	$i1,0x3fc
198238384Sjkim	and	$i2,0x3fc
199238384Sjkim	and	$i3,0x3fc
200238384Sjkim	$PTR_ADD $i0,$Tbl
201238384Sjkim	$PTR_ADD $i1,$Tbl
202238384Sjkim	$PTR_ADD $i2,$Tbl
203238384Sjkim	$PTR_ADD $i3,$Tbl
204238384Sjkim	xor	$t0,$t4
205238384Sjkim	xor	$t1,$t5
206238384Sjkim	xor	$t2,$t6
207238384Sjkim	xor	$t3,$t7
208238384Sjkim	lw	$t4,0($i0)		# Te0[s0>>24]
209238384Sjkim	lw	$t5,0($i1)		# Te0[s1>>24]
210238384Sjkim	lw	$t6,0($i2)		# Te0[s2>>24]
211238384Sjkim	lw	$t7,0($i3)		# Te0[s3>>24]
212238384Sjkim
213238384Sjkim	lw	$s0,0($key0)
214238384Sjkim	lw	$s1,4($key0)
215238384Sjkim	lw	$s2,8($key0)
216238384Sjkim	lw	$s3,12($key0)
217238384Sjkim
218238384Sjkim	xor	$t0,$t8
219238384Sjkim	xor	$t1,$t9
220238384Sjkim	xor	$t2,$t10
221238384Sjkim	xor	$t3,$t11
222238384Sjkim
223238384Sjkim	xor	$t0,$t4
224238384Sjkim	xor	$t1,$t5
225238384Sjkim	xor	$t2,$t6
226238384Sjkim	xor	$t3,$t7
227238384Sjkim
228238384Sjkim	sub	$cnt,1
229238384Sjkim	$PTR_ADD $key0,16
230238384Sjkim	xor	$s0,$t0
231238384Sjkim	xor	$s1,$t1
232238384Sjkim	xor	$s2,$t2
233238384Sjkim	xor	$s3,$t3
234238384Sjkim	.set	noreorder
235238384Sjkim	bnez	$cnt,.Loop_enc
236238384Sjkim	_xtr	$i0,$s1,16-2
237238384Sjkim
238238384Sjkim	.set	reorder
239238384Sjkim	_xtr	$i1,$s2,16-2
240238384Sjkim	_xtr	$i2,$s3,16-2
241238384Sjkim	_xtr	$i3,$s0,16-2
242238384Sjkim	and	$i0,0x3fc
243238384Sjkim	and	$i1,0x3fc
244238384Sjkim	and	$i2,0x3fc
245238384Sjkim	and	$i3,0x3fc
246238384Sjkim	$PTR_ADD $i0,$Tbl
247238384Sjkim	$PTR_ADD $i1,$Tbl
248238384Sjkim	$PTR_ADD $i2,$Tbl
249238384Sjkim	$PTR_ADD $i3,$Tbl
250238384Sjkim	lbu	$t0,2($i0)		# Te4[s1>>16]
251238384Sjkim	lbu	$t1,2($i1)		# Te4[s2>>16]
252238384Sjkim	lbu	$t2,2($i2)		# Te4[s3>>16]
253238384Sjkim	lbu	$t3,2($i3)		# Te4[s0>>16]
254238384Sjkim
255238384Sjkim	_xtr	$i0,$s2,8-2
256238384Sjkim	_xtr	$i1,$s3,8-2
257238384Sjkim	_xtr	$i2,$s0,8-2
258238384Sjkim	_xtr	$i3,$s1,8-2
259238384Sjkim	and	$i0,0x3fc
260238384Sjkim	and	$i1,0x3fc
261238384Sjkim	and	$i2,0x3fc
262238384Sjkim	and	$i3,0x3fc
263238384Sjkim	$PTR_ADD $i0,$Tbl
264238384Sjkim	$PTR_ADD $i1,$Tbl
265238384Sjkim	$PTR_ADD $i2,$Tbl
266238384Sjkim	$PTR_ADD $i3,$Tbl
267238384Sjkim	lbu	$t4,2($i0)		# Te4[s2>>8]
268238384Sjkim	lbu	$t5,2($i1)		# Te4[s3>>8]
269238384Sjkim	lbu	$t6,2($i2)		# Te4[s0>>8]
270238384Sjkim	lbu	$t7,2($i3)		# Te4[s1>>8]
271238384Sjkim
272238384Sjkim	_xtr	$i0,$s0,24-2
273238384Sjkim	_xtr	$i1,$s1,24-2
274238384Sjkim	_xtr	$i2,$s2,24-2
275238384Sjkim	_xtr	$i3,$s3,24-2
276238384Sjkim	and	$i0,0x3fc
277238384Sjkim	and	$i1,0x3fc
278238384Sjkim	and	$i2,0x3fc
279238384Sjkim	and	$i3,0x3fc
280238384Sjkim	$PTR_ADD $i0,$Tbl
281238384Sjkim	$PTR_ADD $i1,$Tbl
282238384Sjkim	$PTR_ADD $i2,$Tbl
283238384Sjkim	$PTR_ADD $i3,$Tbl
284238384Sjkim	lbu	$t8,2($i0)		# Te4[s0>>24]
285238384Sjkim	lbu	$t9,2($i1)		# Te4[s1>>24]
286238384Sjkim	lbu	$t10,2($i2)		# Te4[s2>>24]
287238384Sjkim	lbu	$t11,2($i3)		# Te4[s3>>24]
288238384Sjkim
289238384Sjkim	_xtr	$i0,$s3,0-2
290238384Sjkim	_xtr	$i1,$s0,0-2
291238384Sjkim	_xtr	$i2,$s1,0-2
292238384Sjkim	_xtr	$i3,$s2,0-2
293238384Sjkim	and	$i0,0x3fc
294238384Sjkim	and	$i1,0x3fc
295238384Sjkim	and	$i2,0x3fc
296238384Sjkim	and	$i3,0x3fc
297238384Sjkim
298238384Sjkim	_ins	$t0,16
299238384Sjkim	_ins	$t1,16
300238384Sjkim	_ins	$t2,16
301238384Sjkim	_ins	$t3,16
302238384Sjkim
303238384Sjkim	_ins	$t4,8
304238384Sjkim	_ins	$t5,8
305238384Sjkim	_ins	$t6,8
306238384Sjkim	_ins	$t7,8
307238384Sjkim
308238384Sjkim	xor	$t0,$t4
309238384Sjkim	xor	$t1,$t5
310238384Sjkim	xor	$t2,$t6
311238384Sjkim	xor	$t3,$t7
312238384Sjkim
313238384Sjkim	$PTR_ADD $i0,$Tbl
314238384Sjkim	$PTR_ADD $i1,$Tbl
315238384Sjkim	$PTR_ADD $i2,$Tbl
316238384Sjkim	$PTR_ADD $i3,$Tbl
317238384Sjkim	lbu	$t4,2($i0)		# Te4[s3]
318238384Sjkim	lbu	$t5,2($i1)		# Te4[s0]
319238384Sjkim	lbu	$t6,2($i2)		# Te4[s1]
320238384Sjkim	lbu	$t7,2($i3)		# Te4[s2]
321238384Sjkim
322238384Sjkim	_ins	$t8,24
323238384Sjkim	_ins	$t9,24
324238384Sjkim	_ins	$t10,24
325238384Sjkim	_ins	$t11,24
326238384Sjkim
327238384Sjkim	lw	$s0,0($key0)
328238384Sjkim	lw	$s1,4($key0)
329238384Sjkim	lw	$s2,8($key0)
330238384Sjkim	lw	$s3,12($key0)
331238384Sjkim
332238384Sjkim	xor	$t0,$t8
333238384Sjkim	xor	$t1,$t9
334238384Sjkim	xor	$t2,$t10
335238384Sjkim	xor	$t3,$t11
336238384Sjkim
337238384Sjkim	_ins	$t4,0
338238384Sjkim	_ins	$t5,0
339238384Sjkim	_ins	$t6,0
340238384Sjkim	_ins	$t7,0
341238384Sjkim
342238384Sjkim	xor	$t0,$t4
343238384Sjkim	xor	$t1,$t5
344238384Sjkim	xor	$t2,$t6
345238384Sjkim	xor	$t3,$t7
346238384Sjkim
347238384Sjkim	xor	$s0,$t0
348238384Sjkim	xor	$s1,$t1
349238384Sjkim	xor	$s2,$t2
350238384Sjkim	xor	$s3,$t3
351238384Sjkim
352238384Sjkim	jr	$ra
353238384Sjkim.end	_mips_AES_encrypt
354238384Sjkim
355238384Sjkim.align	5
356238384Sjkim.globl	AES_encrypt
357238384Sjkim.ent	AES_encrypt
358238384SjkimAES_encrypt:
359238384Sjkim	.frame	$sp,$FRAMESIZE,$ra
360238384Sjkim	.mask	$SAVED_REGS_MASK,-$SZREG
361238384Sjkim	.set	noreorder
362238384Sjkim___
363238384Sjkim$code.=<<___ if ($flavour =~ /o32/i);	# o32 PIC-ification
364238384Sjkim	.cpload	$pf
365238384Sjkim___
366238384Sjkim$code.=<<___;
367238384Sjkim	$PTR_SUB $sp,$FRAMESIZE
368238384Sjkim	$REG_S	$ra,$FRAMESIZE-1*$SZREG($sp)
369238384Sjkim	$REG_S	$fp,$FRAMESIZE-2*$SZREG($sp)
370238384Sjkim	$REG_S	$s11,$FRAMESIZE-3*$SZREG($sp)
371238384Sjkim	$REG_S	$s10,$FRAMESIZE-4*$SZREG($sp)
372238384Sjkim	$REG_S	$s9,$FRAMESIZE-5*$SZREG($sp)
373238384Sjkim	$REG_S	$s8,$FRAMESIZE-6*$SZREG($sp)
374238384Sjkim	$REG_S	$s7,$FRAMESIZE-7*$SZREG($sp)
375238384Sjkim	$REG_S	$s6,$FRAMESIZE-8*$SZREG($sp)
376238384Sjkim	$REG_S	$s5,$FRAMESIZE-9*$SZREG($sp)
377238384Sjkim	$REG_S	$s4,$FRAMESIZE-10*$SZREG($sp)
378238384Sjkim___
379238384Sjkim$code.=<<___ if ($flavour =~ /nubi/i);	# optimize non-nubi prologue
380238384Sjkim	$REG_S	\$15,$FRAMESIZE-11*$SZREG($sp)
381238384Sjkim	$REG_S	\$14,$FRAMESIZE-12*$SZREG($sp)
382238384Sjkim	$REG_S	\$13,$FRAMESIZE-13*$SZREG($sp)
383238384Sjkim	$REG_S	\$12,$FRAMESIZE-14*$SZREG($sp)
384238384Sjkim	$REG_S	$gp,$FRAMESIZE-15*$SZREG($sp)
385238384Sjkim___
386238384Sjkim$code.=<<___ if ($flavour !~ /o32/i);	# non-o32 PIC-ification
387238384Sjkim	.cplocal	$Tbl
388238384Sjkim	.cpsetup	$pf,$zero,AES_encrypt
389238384Sjkim___
390238384Sjkim$code.=<<___;
391238384Sjkim	.set	reorder
392238384Sjkim	la	$Tbl,AES_Te		# PIC-ified 'load address'
393238384Sjkim
394238384Sjkim	lwl	$s0,0+$MSB($inp)
395238384Sjkim	lwl	$s1,4+$MSB($inp)
396238384Sjkim	lwl	$s2,8+$MSB($inp)
397238384Sjkim	lwl	$s3,12+$MSB($inp)
398238384Sjkim	lwr	$s0,0+$LSB($inp)
399238384Sjkim	lwr	$s1,4+$LSB($inp)
400238384Sjkim	lwr	$s2,8+$LSB($inp)
401238384Sjkim	lwr	$s3,12+$LSB($inp)
402238384Sjkim
403238384Sjkim	bal	_mips_AES_encrypt
404238384Sjkim
405238384Sjkim	swr	$s0,0+$LSB($out)
406238384Sjkim	swr	$s1,4+$LSB($out)
407238384Sjkim	swr	$s2,8+$LSB($out)
408238384Sjkim	swr	$s3,12+$LSB($out)
409238384Sjkim	swl	$s0,0+$MSB($out)
410238384Sjkim	swl	$s1,4+$MSB($out)
411238384Sjkim	swl	$s2,8+$MSB($out)
412238384Sjkim	swl	$s3,12+$MSB($out)
413238384Sjkim
414238384Sjkim	.set	noreorder
415238384Sjkim	$REG_L	$ra,$FRAMESIZE-1*$SZREG($sp)
416238384Sjkim	$REG_L	$fp,$FRAMESIZE-2*$SZREG($sp)
417238384Sjkim	$REG_L	$s11,$FRAMESIZE-3*$SZREG($sp)
418238384Sjkim	$REG_L	$s10,$FRAMESIZE-4*$SZREG($sp)
419238384Sjkim	$REG_L	$s9,$FRAMESIZE-5*$SZREG($sp)
420238384Sjkim	$REG_L	$s8,$FRAMESIZE-6*$SZREG($sp)
421238384Sjkim	$REG_L	$s7,$FRAMESIZE-7*$SZREG($sp)
422238384Sjkim	$REG_L	$s6,$FRAMESIZE-8*$SZREG($sp)
423238384Sjkim	$REG_L	$s5,$FRAMESIZE-9*$SZREG($sp)
424238384Sjkim	$REG_L	$s4,$FRAMESIZE-10*$SZREG($sp)
425238384Sjkim___
426238384Sjkim$code.=<<___ if ($flavour =~ /nubi/i);
427238384Sjkim	$REG_L	\$15,$FRAMESIZE-11*$SZREG($sp)
428238384Sjkim	$REG_L	\$14,$FRAMESIZE-12*$SZREG($sp)
429238384Sjkim	$REG_L	\$13,$FRAMESIZE-13*$SZREG($sp)
430238384Sjkim	$REG_L	\$12,$FRAMESIZE-14*$SZREG($sp)
431238384Sjkim	$REG_L	$gp,$FRAMESIZE-15*$SZREG($sp)
432238384Sjkim___
433238384Sjkim$code.=<<___;
434238384Sjkim	jr	$ra
435238384Sjkim	$PTR_ADD $sp,$FRAMESIZE
436238384Sjkim.end	AES_encrypt
437238384Sjkim___
438238384Sjkim
439238384Sjkim$code.=<<___;
440238384Sjkim.align	5
441238384Sjkim.ent	_mips_AES_decrypt
442238384Sjkim_mips_AES_decrypt:
443238384Sjkim	.frame	$sp,0,$ra
444238384Sjkim	.set	reorder
445238384Sjkim	lw	$t0,0($key)
446238384Sjkim	lw	$t1,4($key)
447238384Sjkim	lw	$t2,8($key)
448238384Sjkim	lw	$t3,12($key)
449238384Sjkim	lw	$cnt,240($key)
450238384Sjkim	$PTR_ADD $key0,$key,16
451238384Sjkim
452238384Sjkim	xor	$s0,$t0
453238384Sjkim	xor	$s1,$t1
454238384Sjkim	xor	$s2,$t2
455238384Sjkim	xor	$s3,$t3
456238384Sjkim
457238384Sjkim	sub	$cnt,1
458238384Sjkim	_xtr	$i0,$s3,16-2
459238384Sjkim.Loop_dec:
460238384Sjkim	_xtr	$i1,$s0,16-2
461238384Sjkim	_xtr	$i2,$s1,16-2
462238384Sjkim	_xtr	$i3,$s2,16-2
463238384Sjkim	and	$i0,0x3fc
464238384Sjkim	and	$i1,0x3fc
465238384Sjkim	and	$i2,0x3fc
466238384Sjkim	and	$i3,0x3fc
467238384Sjkim	$PTR_ADD $i0,$Tbl
468238384Sjkim	$PTR_ADD $i1,$Tbl
469238384Sjkim	$PTR_ADD $i2,$Tbl
470238384Sjkim	$PTR_ADD $i3,$Tbl
471238384Sjkim	lwl	$t0,3($i0)		# Td1[s3>>16]
472238384Sjkim	lwl	$t1,3($i1)		# Td1[s0>>16]
473238384Sjkim	lwl	$t2,3($i2)		# Td1[s1>>16]
474238384Sjkim	lwl	$t3,3($i3)		# Td1[s2>>16]
475238384Sjkim	lwr	$t0,2($i0)		# Td1[s3>>16]
476238384Sjkim	lwr	$t1,2($i1)		# Td1[s0>>16]
477238384Sjkim	lwr	$t2,2($i2)		# Td1[s1>>16]
478238384Sjkim	lwr	$t3,2($i3)		# Td1[s2>>16]
479238384Sjkim
480238384Sjkim	_xtr	$i0,$s2,8-2
481238384Sjkim	_xtr	$i1,$s3,8-2
482238384Sjkim	_xtr	$i2,$s0,8-2
483238384Sjkim	_xtr	$i3,$s1,8-2
484238384Sjkim	and	$i0,0x3fc
485238384Sjkim	and	$i1,0x3fc
486238384Sjkim	and	$i2,0x3fc
487238384Sjkim	and	$i3,0x3fc
488238384Sjkim	$PTR_ADD $i0,$Tbl
489238384Sjkim	$PTR_ADD $i1,$Tbl
490238384Sjkim	$PTR_ADD $i2,$Tbl
491238384Sjkim	$PTR_ADD $i3,$Tbl
492238384Sjkim	lwl	$t4,2($i0)		# Td2[s2>>8]
493238384Sjkim	lwl	$t5,2($i1)		# Td2[s3>>8]
494238384Sjkim	lwl	$t6,2($i2)		# Td2[s0>>8]
495238384Sjkim	lwl	$t7,2($i3)		# Td2[s1>>8]
496238384Sjkim	lwr	$t4,1($i0)		# Td2[s2>>8]
497238384Sjkim	lwr	$t5,1($i1)		# Td2[s3>>8]
498238384Sjkim	lwr	$t6,1($i2)		# Td2[s0>>8]
499238384Sjkim	lwr	$t7,1($i3)		# Td2[s1>>8]
500238384Sjkim
501238384Sjkim	_xtr	$i0,$s1,0-2
502238384Sjkim	_xtr	$i1,$s2,0-2
503238384Sjkim	_xtr	$i2,$s3,0-2
504238384Sjkim	_xtr	$i3,$s0,0-2
505238384Sjkim	and	$i0,0x3fc
506238384Sjkim	and	$i1,0x3fc
507238384Sjkim	and	$i2,0x3fc
508238384Sjkim	and	$i3,0x3fc
509238384Sjkim	$PTR_ADD $i0,$Tbl
510238384Sjkim	$PTR_ADD $i1,$Tbl
511238384Sjkim	$PTR_ADD $i2,$Tbl
512238384Sjkim	$PTR_ADD $i3,$Tbl
513238384Sjkim	lwl	$t8,1($i0)		# Td3[s1]
514238384Sjkim	lwl	$t9,1($i1)		# Td3[s2]
515238384Sjkim	lwl	$t10,1($i2)		# Td3[s3]
516238384Sjkim	lwl	$t11,1($i3)		# Td3[s0]
517238384Sjkim	lwr	$t8,0($i0)		# Td3[s1]
518238384Sjkim	lwr	$t9,0($i1)		# Td3[s2]
519238384Sjkim	lwr	$t10,0($i2)		# Td3[s3]
520238384Sjkim	lwr	$t11,0($i3)		# Td3[s0]
521238384Sjkim
522238384Sjkim	_xtr	$i0,$s0,24-2
523238384Sjkim	_xtr	$i1,$s1,24-2
524238384Sjkim	_xtr	$i2,$s2,24-2
525238384Sjkim	_xtr	$i3,$s3,24-2
526238384Sjkim	and	$i0,0x3fc
527238384Sjkim	and	$i1,0x3fc
528238384Sjkim	and	$i2,0x3fc
529238384Sjkim	and	$i3,0x3fc
530238384Sjkim	$PTR_ADD $i0,$Tbl
531238384Sjkim	$PTR_ADD $i1,$Tbl
532238384Sjkim	$PTR_ADD $i2,$Tbl
533238384Sjkim	$PTR_ADD $i3,$Tbl
534238384Sjkim
535238384Sjkim	xor	$t0,$t4
536238384Sjkim	xor	$t1,$t5
537238384Sjkim	xor	$t2,$t6
538238384Sjkim	xor	$t3,$t7
539238384Sjkim
540238384Sjkim
541238384Sjkim	lw	$t4,0($i0)		# Td0[s0>>24]
542238384Sjkim	lw	$t5,0($i1)		# Td0[s1>>24]
543238384Sjkim	lw	$t6,0($i2)		# Td0[s2>>24]
544238384Sjkim	lw	$t7,0($i3)		# Td0[s3>>24]
545238384Sjkim
546238384Sjkim	lw	$s0,0($key0)
547238384Sjkim	lw	$s1,4($key0)
548238384Sjkim	lw	$s2,8($key0)
549238384Sjkim	lw	$s3,12($key0)
550238384Sjkim
551238384Sjkim	xor	$t0,$t8
552238384Sjkim	xor	$t1,$t9
553238384Sjkim	xor	$t2,$t10
554238384Sjkim	xor	$t3,$t11
555238384Sjkim
556238384Sjkim	xor	$t0,$t4
557238384Sjkim	xor	$t1,$t5
558238384Sjkim	xor	$t2,$t6
559238384Sjkim	xor	$t3,$t7
560238384Sjkim
561238384Sjkim	sub	$cnt,1
562238384Sjkim	$PTR_ADD $key0,16
563238384Sjkim	xor	$s0,$t0
564238384Sjkim	xor	$s1,$t1
565238384Sjkim	xor	$s2,$t2
566238384Sjkim	xor	$s3,$t3
567238384Sjkim	.set	noreorder
568238384Sjkim	bnez	$cnt,.Loop_dec
569238384Sjkim	_xtr	$i0,$s3,16-2
570238384Sjkim
571238384Sjkim	.set	reorder
572238384Sjkim	lw	$t4,1024($Tbl)		# prefetch Td4
573238384Sjkim	lw	$t5,1024+32($Tbl)
574238384Sjkim	lw	$t6,1024+64($Tbl)
575238384Sjkim	lw	$t7,1024+96($Tbl)
576238384Sjkim	lw	$t8,1024+128($Tbl)
577238384Sjkim	lw	$t9,1024+160($Tbl)
578238384Sjkim	lw	$t10,1024+192($Tbl)
579238384Sjkim	lw	$t11,1024+224($Tbl)
580238384Sjkim
581238384Sjkim	_xtr	$i0,$s3,16
582238384Sjkim	_xtr	$i1,$s0,16
583238384Sjkim	_xtr	$i2,$s1,16
584238384Sjkim	_xtr	$i3,$s2,16
585238384Sjkim	and	$i0,0xff
586238384Sjkim	and	$i1,0xff
587238384Sjkim	and	$i2,0xff
588238384Sjkim	and	$i3,0xff
589238384Sjkim	$PTR_ADD $i0,$Tbl
590238384Sjkim	$PTR_ADD $i1,$Tbl
591238384Sjkim	$PTR_ADD $i2,$Tbl
592238384Sjkim	$PTR_ADD $i3,$Tbl
593238384Sjkim	lbu	$t0,1024($i0)		# Td4[s3>>16]
594238384Sjkim	lbu	$t1,1024($i1)		# Td4[s0>>16]
595238384Sjkim	lbu	$t2,1024($i2)		# Td4[s1>>16]
596238384Sjkim	lbu	$t3,1024($i3)		# Td4[s2>>16]
597238384Sjkim
598238384Sjkim	_xtr	$i0,$s2,8
599238384Sjkim	_xtr	$i1,$s3,8
600238384Sjkim	_xtr	$i2,$s0,8
601238384Sjkim	_xtr	$i3,$s1,8
602238384Sjkim	and	$i0,0xff
603238384Sjkim	and	$i1,0xff
604238384Sjkim	and	$i2,0xff
605238384Sjkim	and	$i3,0xff
606238384Sjkim	$PTR_ADD $i0,$Tbl
607238384Sjkim	$PTR_ADD $i1,$Tbl
608238384Sjkim	$PTR_ADD $i2,$Tbl
609238384Sjkim	$PTR_ADD $i3,$Tbl
610238384Sjkim	lbu	$t4,1024($i0)		# Td4[s2>>8]
611238384Sjkim	lbu	$t5,1024($i1)		# Td4[s3>>8]
612238384Sjkim	lbu	$t6,1024($i2)		# Td4[s0>>8]
613238384Sjkim	lbu	$t7,1024($i3)		# Td4[s1>>8]
614238384Sjkim
615238384Sjkim	_xtr	$i0,$s0,24
616238384Sjkim	_xtr	$i1,$s1,24
617238384Sjkim	_xtr	$i2,$s2,24
618238384Sjkim	_xtr	$i3,$s3,24
619238384Sjkim	$PTR_ADD $i0,$Tbl
620238384Sjkim	$PTR_ADD $i1,$Tbl
621238384Sjkim	$PTR_ADD $i2,$Tbl
622238384Sjkim	$PTR_ADD $i3,$Tbl
623238384Sjkim	lbu	$t8,1024($i0)		# Td4[s0>>24]
624238384Sjkim	lbu	$t9,1024($i1)		# Td4[s1>>24]
625238384Sjkim	lbu	$t10,1024($i2)		# Td4[s2>>24]
626238384Sjkim	lbu	$t11,1024($i3)		# Td4[s3>>24]
627238384Sjkim
628238384Sjkim	_xtr	$i0,$s1,0
629238384Sjkim	_xtr	$i1,$s2,0
630238384Sjkim	_xtr	$i2,$s3,0
631238384Sjkim	_xtr	$i3,$s0,0
632238384Sjkim
633238384Sjkim	_ins	$t0,16
634238384Sjkim	_ins	$t1,16
635238384Sjkim	_ins	$t2,16
636238384Sjkim	_ins	$t3,16
637238384Sjkim
638238384Sjkim	_ins	$t4,8
639238384Sjkim	_ins	$t5,8
640238384Sjkim	_ins	$t6,8
641238384Sjkim	_ins	$t7,8
642238384Sjkim
643238384Sjkim	xor	$t0,$t4
644238384Sjkim	xor	$t1,$t5
645238384Sjkim	xor	$t2,$t6
646238384Sjkim	xor	$t3,$t7
647238384Sjkim
648238384Sjkim	$PTR_ADD $i0,$Tbl
649238384Sjkim	$PTR_ADD $i1,$Tbl
650238384Sjkim	$PTR_ADD $i2,$Tbl
651238384Sjkim	$PTR_ADD $i3,$Tbl
652238384Sjkim	lbu	$t4,1024($i0)		# Td4[s1]
653238384Sjkim	lbu	$t5,1024($i1)		# Td4[s2]
654238384Sjkim	lbu	$t6,1024($i2)		# Td4[s3]
655238384Sjkim	lbu	$t7,1024($i3)		# Td4[s0]
656238384Sjkim
657238384Sjkim	_ins	$t8,24
658238384Sjkim	_ins	$t9,24
659238384Sjkim	_ins	$t10,24
660238384Sjkim	_ins	$t11,24
661238384Sjkim
662238384Sjkim	lw	$s0,0($key0)
663238384Sjkim	lw	$s1,4($key0)
664238384Sjkim	lw	$s2,8($key0)
665238384Sjkim	lw	$s3,12($key0)
666238384Sjkim
667238384Sjkim	_ins	$t4,0
668238384Sjkim	_ins	$t5,0
669238384Sjkim	_ins	$t6,0
670238384Sjkim	_ins	$t7,0
671238384Sjkim
672238384Sjkim
673238384Sjkim	xor	$t0,$t8
674238384Sjkim	xor	$t1,$t9
675238384Sjkim	xor	$t2,$t10
676238384Sjkim	xor	$t3,$t11
677238384Sjkim
678238384Sjkim	xor	$t0,$t4
679238384Sjkim	xor	$t1,$t5
680238384Sjkim	xor	$t2,$t6
681238384Sjkim	xor	$t3,$t7
682238384Sjkim
683238384Sjkim	xor	$s0,$t0
684238384Sjkim	xor	$s1,$t1
685238384Sjkim	xor	$s2,$t2
686238384Sjkim	xor	$s3,$t3
687238384Sjkim
688238384Sjkim	jr	$ra
689238384Sjkim.end	_mips_AES_decrypt
690238384Sjkim
691238384Sjkim.align	5
692238384Sjkim.globl	AES_decrypt
693238384Sjkim.ent	AES_decrypt
694238384SjkimAES_decrypt:
695238384Sjkim	.frame	$sp,$FRAMESIZE,$ra
696238384Sjkim	.mask	$SAVED_REGS_MASK,-$SZREG
697238384Sjkim	.set	noreorder
698238384Sjkim___
699238384Sjkim$code.=<<___ if ($flavour =~ /o32/i);	# o32 PIC-ification
700238384Sjkim	.cpload	$pf
701238384Sjkim___
702238384Sjkim$code.=<<___;
703238384Sjkim	$PTR_SUB $sp,$FRAMESIZE
704238384Sjkim	$REG_S	$ra,$FRAMESIZE-1*$SZREG($sp)
705238384Sjkim	$REG_S	$fp,$FRAMESIZE-2*$SZREG($sp)
706238384Sjkim	$REG_S	$s11,$FRAMESIZE-3*$SZREG($sp)
707238384Sjkim	$REG_S	$s10,$FRAMESIZE-4*$SZREG($sp)
708238384Sjkim	$REG_S	$s9,$FRAMESIZE-5*$SZREG($sp)
709238384Sjkim	$REG_S	$s8,$FRAMESIZE-6*$SZREG($sp)
710238384Sjkim	$REG_S	$s7,$FRAMESIZE-7*$SZREG($sp)
711238384Sjkim	$REG_S	$s6,$FRAMESIZE-8*$SZREG($sp)
712238384Sjkim	$REG_S	$s5,$FRAMESIZE-9*$SZREG($sp)
713238384Sjkim	$REG_S	$s4,$FRAMESIZE-10*$SZREG($sp)
714238384Sjkim___
715238384Sjkim$code.=<<___ if ($flavour =~ /nubi/i);	# optimize non-nubi prologue
716238384Sjkim	$REG_S	\$15,$FRAMESIZE-11*$SZREG($sp)
717238384Sjkim	$REG_S	\$14,$FRAMESIZE-12*$SZREG($sp)
718238384Sjkim	$REG_S	\$13,$FRAMESIZE-13*$SZREG($sp)
719238384Sjkim	$REG_S	\$12,$FRAMESIZE-14*$SZREG($sp)
720238384Sjkim	$REG_S	$gp,$FRAMESIZE-15*$SZREG($sp)
721238384Sjkim___
722238384Sjkim$code.=<<___ if ($flavour !~ /o32/i);	# non-o32 PIC-ification
723238384Sjkim	.cplocal	$Tbl
724238384Sjkim	.cpsetup	$pf,$zero,AES_decrypt
725238384Sjkim___
726238384Sjkim$code.=<<___;
727238384Sjkim	.set	reorder
728238384Sjkim	la	$Tbl,AES_Td		# PIC-ified 'load address'
729238384Sjkim
730238384Sjkim	lwl	$s0,0+$MSB($inp)
731238384Sjkim	lwl	$s1,4+$MSB($inp)
732238384Sjkim	lwl	$s2,8+$MSB($inp)
733238384Sjkim	lwl	$s3,12+$MSB($inp)
734238384Sjkim	lwr	$s0,0+$LSB($inp)
735238384Sjkim	lwr	$s1,4+$LSB($inp)
736238384Sjkim	lwr	$s2,8+$LSB($inp)
737238384Sjkim	lwr	$s3,12+$LSB($inp)
738238384Sjkim
739238384Sjkim	bal	_mips_AES_decrypt
740238384Sjkim
741238384Sjkim	swr	$s0,0+$LSB($out)
742238384Sjkim	swr	$s1,4+$LSB($out)
743238384Sjkim	swr	$s2,8+$LSB($out)
744238384Sjkim	swr	$s3,12+$LSB($out)
745238384Sjkim	swl	$s0,0+$MSB($out)
746238384Sjkim	swl	$s1,4+$MSB($out)
747238384Sjkim	swl	$s2,8+$MSB($out)
748238384Sjkim	swl	$s3,12+$MSB($out)
749238384Sjkim
750238384Sjkim	.set	noreorder
751238384Sjkim	$REG_L	$ra,$FRAMESIZE-1*$SZREG($sp)
752238384Sjkim	$REG_L	$fp,$FRAMESIZE-2*$SZREG($sp)
753238384Sjkim	$REG_L	$s11,$FRAMESIZE-3*$SZREG($sp)
754238384Sjkim	$REG_L	$s10,$FRAMESIZE-4*$SZREG($sp)
755238384Sjkim	$REG_L	$s9,$FRAMESIZE-5*$SZREG($sp)
756238384Sjkim	$REG_L	$s8,$FRAMESIZE-6*$SZREG($sp)
757238384Sjkim	$REG_L	$s7,$FRAMESIZE-7*$SZREG($sp)
758238384Sjkim	$REG_L	$s6,$FRAMESIZE-8*$SZREG($sp)
759238384Sjkim	$REG_L	$s5,$FRAMESIZE-9*$SZREG($sp)
760238384Sjkim	$REG_L	$s4,$FRAMESIZE-10*$SZREG($sp)
761238384Sjkim___
762238384Sjkim$code.=<<___ if ($flavour =~ /nubi/i);
763238384Sjkim	$REG_L	\$15,$FRAMESIZE-11*$SZREG($sp)
764238384Sjkim	$REG_L	\$14,$FRAMESIZE-12*$SZREG($sp)
765238384Sjkim	$REG_L	\$13,$FRAMESIZE-13*$SZREG($sp)
766238384Sjkim	$REG_L	\$12,$FRAMESIZE-14*$SZREG($sp)
767238384Sjkim	$REG_L	$gp,$FRAMESIZE-15*$SZREG($sp)
768238384Sjkim___
769238384Sjkim$code.=<<___;
770238384Sjkim	jr	$ra
771238384Sjkim	$PTR_ADD $sp,$FRAMESIZE
772238384Sjkim.end	AES_decrypt
773238384Sjkim___
774238384Sjkim}}}
775238384Sjkim
776238384Sjkim{{{
777238384Sjkimmy $FRAMESIZE=8*$SZREG;
778238384Sjkimmy $SAVED_REGS_MASK = ($flavour =~ /nubi/i) ? 0xc000f008 : 0xc0000000;
779238384Sjkim
780238384Sjkimmy ($inp,$bits,$key,$Tbl)=($a0,$a1,$a2,$a3);
781238384Sjkimmy ($rk0,$rk1,$rk2,$rk3,$rk4,$rk5,$rk6,$rk7)=($a4,$a5,$a6,$a7,$s0,$s1,$s2,$s3);
782238384Sjkimmy ($i0,$i1,$i2,$i3)=($at,$t0,$t1,$t2);
783238384Sjkimmy ($rcon,$cnt)=($gp,$fp);
784238384Sjkim
785238384Sjkim$code.=<<___;
786238384Sjkim.align	5
787238384Sjkim.ent	_mips_AES_set_encrypt_key
788238384Sjkim_mips_AES_set_encrypt_key:
789238384Sjkim	.frame	$sp,0,$ra
790238384Sjkim	.set	noreorder
791238384Sjkim	beqz	$inp,.Lekey_done
792238384Sjkim	li	$t0,-1
793238384Sjkim	beqz	$key,.Lekey_done
794238384Sjkim	$PTR_ADD $rcon,$Tbl,1024+256
795238384Sjkim
796238384Sjkim	.set	reorder
797238384Sjkim	lwl	$rk0,0+$MSB($inp)	# load 128 bits
798238384Sjkim	lwl	$rk1,4+$MSB($inp)
799238384Sjkim	lwl	$rk2,8+$MSB($inp)
800238384Sjkim	lwl	$rk3,12+$MSB($inp)
801238384Sjkim	li	$at,128
802238384Sjkim	lwr	$rk0,0+$LSB($inp)
803238384Sjkim	lwr	$rk1,4+$LSB($inp)
804238384Sjkim	lwr	$rk2,8+$LSB($inp)
805238384Sjkim	lwr	$rk3,12+$LSB($inp)
806238384Sjkim	.set	noreorder
807238384Sjkim	beq	$bits,$at,.L128bits
808238384Sjkim	li	$cnt,10
809238384Sjkim
810238384Sjkim	.set	reorder
811238384Sjkim	lwl	$rk4,16+$MSB($inp)	# load 192 bits
812238384Sjkim	lwl	$rk5,20+$MSB($inp)
813238384Sjkim	li	$at,192
814238384Sjkim	lwr	$rk4,16+$LSB($inp)
815238384Sjkim	lwr	$rk5,20+$LSB($inp)
816238384Sjkim	.set	noreorder
817238384Sjkim	beq	$bits,$at,.L192bits
818238384Sjkim	li	$cnt,8
819238384Sjkim
820238384Sjkim	.set	reorder
821238384Sjkim	lwl	$rk6,24+$MSB($inp)	# load 256 bits
822238384Sjkim	lwl	$rk7,28+$MSB($inp)
823238384Sjkim	li	$at,256
824238384Sjkim	lwr	$rk6,24+$LSB($inp)
825238384Sjkim	lwr	$rk7,28+$LSB($inp)
826238384Sjkim	.set	noreorder
827238384Sjkim	beq	$bits,$at,.L256bits
828238384Sjkim	li	$cnt,7
829238384Sjkim
830238384Sjkim	b	.Lekey_done
831238384Sjkim	li	$t0,-2
832238384Sjkim
833238384Sjkim.align	4
834238384Sjkim.L128bits:
835238384Sjkim	.set	reorder
836238384Sjkim	srl	$i0,$rk3,16
837238384Sjkim	srl	$i1,$rk3,8
838238384Sjkim	and	$i0,0xff
839238384Sjkim	and	$i1,0xff
840238384Sjkim	and	$i2,$rk3,0xff
841238384Sjkim	srl	$i3,$rk3,24
842238384Sjkim	$PTR_ADD $i0,$Tbl
843238384Sjkim	$PTR_ADD $i1,$Tbl
844238384Sjkim	$PTR_ADD $i2,$Tbl
845238384Sjkim	$PTR_ADD $i3,$Tbl
846238384Sjkim	lbu	$i0,1024($i0)
847238384Sjkim	lbu	$i1,1024($i1)
848238384Sjkim	lbu	$i2,1024($i2)
849238384Sjkim	lbu	$i3,1024($i3)
850238384Sjkim
851238384Sjkim	sw	$rk0,0($key)
852238384Sjkim	sw	$rk1,4($key)
853238384Sjkim	sw	$rk2,8($key)
854238384Sjkim	sw	$rk3,12($key)
855238384Sjkim	sub	$cnt,1
856238384Sjkim	$PTR_ADD $key,16
857238384Sjkim
858238384Sjkim	_bias	$i0,24
859238384Sjkim	_bias	$i1,16
860238384Sjkim	_bias	$i2,8
861238384Sjkim	_bias	$i3,0
862238384Sjkim
863238384Sjkim	xor	$rk0,$i0
864238384Sjkim	lw	$i0,0($rcon)
865238384Sjkim	xor	$rk0,$i1
866238384Sjkim	xor	$rk0,$i2
867238384Sjkim	xor	$rk0,$i3
868238384Sjkim	xor	$rk0,$i0
869238384Sjkim
870238384Sjkim	xor	$rk1,$rk0
871238384Sjkim	xor	$rk2,$rk1
872238384Sjkim	xor	$rk3,$rk2
873238384Sjkim
874238384Sjkim	.set	noreorder
875238384Sjkim	bnez	$cnt,.L128bits
876238384Sjkim	$PTR_ADD $rcon,4
877238384Sjkim
878238384Sjkim	sw	$rk0,0($key)
879238384Sjkim	sw	$rk1,4($key)
880238384Sjkim	sw	$rk2,8($key)
881238384Sjkim	li	$cnt,10
882238384Sjkim	sw	$rk3,12($key)
883238384Sjkim	li	$t0,0
884238384Sjkim	sw	$cnt,80($key)
885238384Sjkim	b	.Lekey_done
886238384Sjkim	$PTR_SUB $key,10*16
887238384Sjkim
888238384Sjkim.align	4
889238384Sjkim.L192bits:
890238384Sjkim	.set	reorder
891238384Sjkim	srl	$i0,$rk5,16
892238384Sjkim	srl	$i1,$rk5,8
893238384Sjkim	and	$i0,0xff
894238384Sjkim	and	$i1,0xff
895238384Sjkim	and	$i2,$rk5,0xff
896238384Sjkim	srl	$i3,$rk5,24
897238384Sjkim	$PTR_ADD $i0,$Tbl
898238384Sjkim	$PTR_ADD $i1,$Tbl
899238384Sjkim	$PTR_ADD $i2,$Tbl
900238384Sjkim	$PTR_ADD $i3,$Tbl
901238384Sjkim	lbu	$i0,1024($i0)
902238384Sjkim	lbu	$i1,1024($i1)
903238384Sjkim	lbu	$i2,1024($i2)
904238384Sjkim	lbu	$i3,1024($i3)
905238384Sjkim
906238384Sjkim	sw	$rk0,0($key)
907238384Sjkim	sw	$rk1,4($key)
908238384Sjkim	sw	$rk2,8($key)
909238384Sjkim	sw	$rk3,12($key)
910238384Sjkim	sw	$rk4,16($key)
911238384Sjkim	sw	$rk5,20($key)
912238384Sjkim	sub	$cnt,1
913238384Sjkim	$PTR_ADD $key,24
914238384Sjkim
915238384Sjkim	_bias	$i0,24
916238384Sjkim	_bias	$i1,16
917238384Sjkim	_bias	$i2,8
918238384Sjkim	_bias	$i3,0
919238384Sjkim
920238384Sjkim	xor	$rk0,$i0
921238384Sjkim	lw	$i0,0($rcon)
922238384Sjkim	xor	$rk0,$i1
923238384Sjkim	xor	$rk0,$i2
924238384Sjkim	xor	$rk0,$i3
925238384Sjkim	xor	$rk0,$i0
926238384Sjkim
927238384Sjkim	xor	$rk1,$rk0
928238384Sjkim	xor	$rk2,$rk1
929238384Sjkim	xor	$rk3,$rk2
930238384Sjkim	xor	$rk4,$rk3
931238384Sjkim	xor	$rk5,$rk4
932238384Sjkim
933238384Sjkim	.set	noreorder
934238384Sjkim	bnez	$cnt,.L192bits
935238384Sjkim	$PTR_ADD $rcon,4
936238384Sjkim
937238384Sjkim	sw	$rk0,0($key)
938238384Sjkim	sw	$rk1,4($key)
939238384Sjkim	sw	$rk2,8($key)
940238384Sjkim	li	$cnt,12
941238384Sjkim	sw	$rk3,12($key)
942238384Sjkim	li	$t0,0
943238384Sjkim	sw	$cnt,48($key)
944238384Sjkim	b	.Lekey_done
945238384Sjkim	$PTR_SUB $key,12*16
946238384Sjkim
947238384Sjkim.align	4
948238384Sjkim.L256bits:
949238384Sjkim	.set	reorder
950238384Sjkim	srl	$i0,$rk7,16
951238384Sjkim	srl	$i1,$rk7,8
952238384Sjkim	and	$i0,0xff
953238384Sjkim	and	$i1,0xff
954238384Sjkim	and	$i2,$rk7,0xff
955238384Sjkim	srl	$i3,$rk7,24
956238384Sjkim	$PTR_ADD $i0,$Tbl
957238384Sjkim	$PTR_ADD $i1,$Tbl
958238384Sjkim	$PTR_ADD $i2,$Tbl
959238384Sjkim	$PTR_ADD $i3,$Tbl
960238384Sjkim	lbu	$i0,1024($i0)
961238384Sjkim	lbu	$i1,1024($i1)
962238384Sjkim	lbu	$i2,1024($i2)
963238384Sjkim	lbu	$i3,1024($i3)
964238384Sjkim
965238384Sjkim	sw	$rk0,0($key)
966238384Sjkim	sw	$rk1,4($key)
967238384Sjkim	sw	$rk2,8($key)
968238384Sjkim	sw	$rk3,12($key)
969238384Sjkim	sw	$rk4,16($key)
970238384Sjkim	sw	$rk5,20($key)
971238384Sjkim	sw	$rk6,24($key)
972238384Sjkim	sw	$rk7,28($key)
973238384Sjkim	sub	$cnt,1
974238384Sjkim
975238384Sjkim	_bias	$i0,24
976238384Sjkim	_bias	$i1,16
977238384Sjkim	_bias	$i2,8
978238384Sjkim	_bias	$i3,0
979238384Sjkim
980238384Sjkim	xor	$rk0,$i0
981238384Sjkim	lw	$i0,0($rcon)
982238384Sjkim	xor	$rk0,$i1
983238384Sjkim	xor	$rk0,$i2
984238384Sjkim	xor	$rk0,$i3
985238384Sjkim	xor	$rk0,$i0
986238384Sjkim
987238384Sjkim	xor	$rk1,$rk0
988238384Sjkim	xor	$rk2,$rk1
989238384Sjkim	xor	$rk3,$rk2
990238384Sjkim	beqz	$cnt,.L256bits_done
991238384Sjkim
992238384Sjkim	srl	$i0,$rk3,24
993238384Sjkim	srl	$i1,$rk3,16
994238384Sjkim	srl	$i2,$rk3,8
995238384Sjkim	and	$i3,$rk3,0xff
996238384Sjkim	and	$i1,0xff
997238384Sjkim	and	$i2,0xff
998238384Sjkim	$PTR_ADD $i0,$Tbl
999238384Sjkim	$PTR_ADD $i1,$Tbl
1000238384Sjkim	$PTR_ADD $i2,$Tbl
1001238384Sjkim	$PTR_ADD $i3,$Tbl
1002238384Sjkim	lbu	$i0,1024($i0)
1003238384Sjkim	lbu	$i1,1024($i1)
1004238384Sjkim	lbu	$i2,1024($i2)
1005238384Sjkim	lbu	$i3,1024($i3)
1006238384Sjkim	sll	$i0,24
1007238384Sjkim	sll	$i1,16
1008238384Sjkim	sll	$i2,8
1009238384Sjkim
1010238384Sjkim	xor	$rk4,$i0
1011238384Sjkim	xor	$rk4,$i1
1012238384Sjkim	xor	$rk4,$i2
1013238384Sjkim	xor	$rk4,$i3
1014238384Sjkim
1015238384Sjkim	xor	$rk5,$rk4
1016238384Sjkim	xor	$rk6,$rk5
1017238384Sjkim	xor	$rk7,$rk6
1018238384Sjkim
1019238384Sjkim	$PTR_ADD $key,32
1020238384Sjkim	.set	noreorder
1021238384Sjkim	b	.L256bits
1022238384Sjkim	$PTR_ADD $rcon,4
1023238384Sjkim
1024238384Sjkim.L256bits_done:
1025238384Sjkim	sw	$rk0,32($key)
1026238384Sjkim	sw	$rk1,36($key)
1027238384Sjkim	sw	$rk2,40($key)
1028238384Sjkim	li	$cnt,14
1029238384Sjkim	sw	$rk3,44($key)
1030238384Sjkim	li	$t0,0
1031238384Sjkim	sw	$cnt,48($key)
1032238384Sjkim	$PTR_SUB $key,12*16
1033238384Sjkim
1034238384Sjkim.Lekey_done:
1035238384Sjkim	jr	$ra
1036238384Sjkim	nop
1037238384Sjkim.end	_mips_AES_set_encrypt_key
1038238384Sjkim
1039246772Sjkim.globl	private_AES_set_encrypt_key
1040246772Sjkim.ent	private_AES_set_encrypt_key
1041246772Sjkimprivate_AES_set_encrypt_key:
1042238384Sjkim	.frame	$sp,$FRAMESIZE,$ra
1043238384Sjkim	.mask	$SAVED_REGS_MASK,-$SZREG
1044238384Sjkim	.set	noreorder
1045238384Sjkim___
1046238384Sjkim$code.=<<___ if ($flavour =~ /o32/i);	# o32 PIC-ification
1047238384Sjkim	.cpload	$pf
1048238384Sjkim___
1049238384Sjkim$code.=<<___;
1050238384Sjkim	$PTR_SUB $sp,$FRAMESIZE
1051238384Sjkim	$REG_S	$ra,$FRAMESIZE-1*$SZREG($sp)
1052238384Sjkim	$REG_S	$fp,$FRAMESIZE-2*$SZREG($sp)
1053238384Sjkim___
1054238384Sjkim$code.=<<___ if ($flavour =~ /nubi/i);	# optimize non-nubi prologue
1055238384Sjkim	$REG_S	$s3,$FRAMESIZE-3*$SZREG($sp)
1056238384Sjkim	$REG_S	$s2,$FRAMESIZE-4*$SZREG($sp)
1057238384Sjkim	$REG_S	$s1,$FRAMESIZE-5*$SZREG($sp)
1058238384Sjkim	$REG_S	$s0,$FRAMESIZE-6*$SZREG($sp)
1059238384Sjkim	$REG_S	$gp,$FRAMESIZE-7*$SZREG($sp)
1060238384Sjkim___
1061238384Sjkim$code.=<<___ if ($flavour !~ /o32/i);	# non-o32 PIC-ification
1062238384Sjkim	.cplocal	$Tbl
1063246772Sjkim	.cpsetup	$pf,$zero,private_AES_set_encrypt_key
1064238384Sjkim___
1065238384Sjkim$code.=<<___;
1066238384Sjkim	.set	reorder
1067238384Sjkim	la	$Tbl,AES_Te		# PIC-ified 'load address'
1068238384Sjkim
1069238384Sjkim	bal	_mips_AES_set_encrypt_key
1070238384Sjkim
1071238384Sjkim	.set	noreorder
1072238384Sjkim	move	$a0,$t0
1073238384Sjkim	$REG_L	$ra,$FRAMESIZE-1*$SZREG($sp)
1074238384Sjkim	$REG_L	$fp,$FRAMESIZE-2*$SZREG($sp)
1075238384Sjkim___
1076238384Sjkim$code.=<<___ if ($flavour =~ /nubi/i);
1077238384Sjkim	$REG_L	$s3,$FRAMESIZE-11*$SZREG($sp)
1078238384Sjkim	$REG_L	$s2,$FRAMESIZE-12*$SZREG($sp)
1079238384Sjkim	$REG_L	$s1,$FRAMESIZE-13*$SZREG($sp)
1080238384Sjkim	$REG_L	$s0,$FRAMESIZE-14*$SZREG($sp)
1081238384Sjkim	$REG_L	$gp,$FRAMESIZE-15*$SZREG($sp)
1082238384Sjkim___
1083238384Sjkim$code.=<<___;
1084238384Sjkim	jr	$ra
1085238384Sjkim	$PTR_ADD $sp,$FRAMESIZE
1086246772Sjkim.end	private_AES_set_encrypt_key
1087238384Sjkim___
1088238384Sjkim
1089238384Sjkimmy ($head,$tail)=($inp,$bits);
1090238384Sjkimmy ($tp1,$tp2,$tp4,$tp8,$tp9,$tpb,$tpd,$tpe)=($a4,$a5,$a6,$a7,$s0,$s1,$s2,$s3);
1091238384Sjkimmy ($m,$x80808080,$x7f7f7f7f,$x1b1b1b1b)=($at,$t0,$t1,$t2);
1092238384Sjkim$code.=<<___;
1093238384Sjkim.align	5
1094246772Sjkim.globl	private_AES_set_decrypt_key
1095246772Sjkim.ent	private_AES_set_decrypt_key
1096246772Sjkimprivate_AES_set_decrypt_key:
1097238384Sjkim	.frame	$sp,$FRAMESIZE,$ra
1098238384Sjkim	.mask	$SAVED_REGS_MASK,-$SZREG
1099238384Sjkim	.set	noreorder
1100238384Sjkim___
1101238384Sjkim$code.=<<___ if ($flavour =~ /o32/i);	# o32 PIC-ification
1102238384Sjkim	.cpload	$pf
1103238384Sjkim___
1104238384Sjkim$code.=<<___;
1105238384Sjkim	$PTR_SUB $sp,$FRAMESIZE
1106238384Sjkim	$REG_S	$ra,$FRAMESIZE-1*$SZREG($sp)
1107238384Sjkim	$REG_S	$fp,$FRAMESIZE-2*$SZREG($sp)
1108238384Sjkim___
1109238384Sjkim$code.=<<___ if ($flavour =~ /nubi/i);	# optimize non-nubi prologue
1110238384Sjkim	$REG_S	$s3,$FRAMESIZE-3*$SZREG($sp)
1111238384Sjkim	$REG_S	$s2,$FRAMESIZE-4*$SZREG($sp)
1112238384Sjkim	$REG_S	$s1,$FRAMESIZE-5*$SZREG($sp)
1113238384Sjkim	$REG_S	$s0,$FRAMESIZE-6*$SZREG($sp)
1114238384Sjkim	$REG_S	$gp,$FRAMESIZE-7*$SZREG($sp)
1115238384Sjkim___
1116238384Sjkim$code.=<<___ if ($flavour !~ /o32/i);	# non-o32 PIC-ification
1117238384Sjkim	.cplocal	$Tbl
1118246772Sjkim	.cpsetup	$pf,$zero,private_AES_set_decrypt_key
1119238384Sjkim___
1120238384Sjkim$code.=<<___;
1121238384Sjkim	.set	reorder
1122238384Sjkim	la	$Tbl,AES_Te		# PIC-ified 'load address'
1123238384Sjkim
1124238384Sjkim	bal	_mips_AES_set_encrypt_key
1125238384Sjkim
1126238384Sjkim	bltz	$t0,.Ldkey_done
1127238384Sjkim
1128238384Sjkim	sll	$at,$cnt,4
1129238384Sjkim	$PTR_ADD $head,$key,0
1130238384Sjkim	$PTR_ADD $tail,$key,$at
1131238384Sjkim.align	4
1132238384Sjkim.Lswap:
1133238384Sjkim	lw	$rk0,0($head)
1134238384Sjkim	lw	$rk1,4($head)
1135238384Sjkim	lw	$rk2,8($head)
1136238384Sjkim	lw	$rk3,12($head)
1137238384Sjkim	lw	$rk4,0($tail)
1138238384Sjkim	lw	$rk5,4($tail)
1139238384Sjkim	lw	$rk6,8($tail)
1140238384Sjkim	lw	$rk7,12($tail)
1141238384Sjkim	sw	$rk0,0($tail)
1142238384Sjkim	sw	$rk1,4($tail)
1143238384Sjkim	sw	$rk2,8($tail)
1144238384Sjkim	sw	$rk3,12($tail)
1145238384Sjkim	$PTR_ADD $head,16
1146238384Sjkim	$PTR_SUB $tail,16
1147238384Sjkim	sw	$rk4,-16($head)
1148238384Sjkim	sw	$rk5,-12($head)
1149238384Sjkim	sw	$rk6,-8($head)
1150238384Sjkim	sw	$rk7,-4($head)
1151238384Sjkim	bne	$head,$tail,.Lswap
1152238384Sjkim
1153238384Sjkim	lw	$tp1,16($key)		# modulo-scheduled
1154238384Sjkim	lui	$x80808080,0x8080
1155238384Sjkim	sub	$cnt,1
1156238384Sjkim	or	$x80808080,0x8080
1157238384Sjkim	sll	$cnt,2
1158238384Sjkim	$PTR_ADD $key,16
1159238384Sjkim	lui	$x1b1b1b1b,0x1b1b
1160238384Sjkim	nor	$x7f7f7f7f,$zero,$x80808080
1161238384Sjkim	or	$x1b1b1b1b,0x1b1b
1162238384Sjkim.align	4
1163238384Sjkim.Lmix:
1164238384Sjkim	and	$m,$tp1,$x80808080
1165238384Sjkim	and	$tp2,$tp1,$x7f7f7f7f
1166238384Sjkim	srl	$tp4,$m,7
1167238384Sjkim	addu	$tp2,$tp2		# tp2<<1
1168238384Sjkim	subu	$m,$tp4
1169238384Sjkim	and	$m,$x1b1b1b1b
1170238384Sjkim	xor	$tp2,$m
1171238384Sjkim
1172238384Sjkim	and	$m,$tp2,$x80808080
1173238384Sjkim	and	$tp4,$tp2,$x7f7f7f7f
1174238384Sjkim	srl	$tp8,$m,7
1175238384Sjkim	addu	$tp4,$tp4		# tp4<<1
1176238384Sjkim	subu	$m,$tp8
1177238384Sjkim	and	$m,$x1b1b1b1b
1178238384Sjkim	xor	$tp4,$m
1179238384Sjkim
1180238384Sjkim	and	$m,$tp4,$x80808080
1181238384Sjkim	and	$tp8,$tp4,$x7f7f7f7f
1182238384Sjkim	srl	$tp9,$m,7
1183238384Sjkim	addu	$tp8,$tp8		# tp8<<1
1184238384Sjkim	subu	$m,$tp9
1185238384Sjkim	and	$m,$x1b1b1b1b
1186238384Sjkim	xor	$tp8,$m
1187238384Sjkim
1188238384Sjkim	xor	$tp9,$tp8,$tp1
1189238384Sjkim	xor	$tpe,$tp8,$tp4
1190238384Sjkim	xor	$tpb,$tp9,$tp2
1191238384Sjkim	xor	$tpd,$tp9,$tp4
1192238384Sjkim
1193238384Sjkim	_ror	$tp1,$tpd,16
1194238384Sjkim	 xor	$tpe,$tp2
1195238384Sjkim	_ror	$tp2,$tpd,-16
1196238384Sjkim	xor	$tpe,$tp1
1197238384Sjkim	_ror	$tp1,$tp9,8
1198238384Sjkim	xor	$tpe,$tp2
1199238384Sjkim	_ror	$tp2,$tp9,-24
1200238384Sjkim	xor	$tpe,$tp1
1201238384Sjkim	_ror	$tp1,$tpb,24
1202238384Sjkim	xor	$tpe,$tp2
1203238384Sjkim	_ror	$tp2,$tpb,-8
1204238384Sjkim	xor	$tpe,$tp1
1205238384Sjkim	lw	$tp1,4($key)		# modulo-scheduled
1206238384Sjkim	xor	$tpe,$tp2
1207238384Sjkim	sub	$cnt,1
1208238384Sjkim	sw	$tpe,0($key)
1209238384Sjkim	$PTR_ADD $key,4
1210238384Sjkim	bnez	$cnt,.Lmix
1211238384Sjkim
1212238384Sjkim	li	$t0,0
1213238384Sjkim.Ldkey_done:
1214238384Sjkim	.set	noreorder
1215238384Sjkim	move	$a0,$t0
1216238384Sjkim	$REG_L	$ra,$FRAMESIZE-1*$SZREG($sp)
1217238384Sjkim	$REG_L	$fp,$FRAMESIZE-2*$SZREG($sp)
1218238384Sjkim___
1219238384Sjkim$code.=<<___ if ($flavour =~ /nubi/i);
1220238384Sjkim	$REG_L	$s3,$FRAMESIZE-11*$SZREG($sp)
1221238384Sjkim	$REG_L	$s2,$FRAMESIZE-12*$SZREG($sp)
1222238384Sjkim	$REG_L	$s1,$FRAMESIZE-13*$SZREG($sp)
1223238384Sjkim	$REG_L	$s0,$FRAMESIZE-14*$SZREG($sp)
1224238384Sjkim	$REG_L	$gp,$FRAMESIZE-15*$SZREG($sp)
1225238384Sjkim___
1226238384Sjkim$code.=<<___;
1227238384Sjkim	jr	$ra
1228238384Sjkim	$PTR_ADD $sp,$FRAMESIZE
1229246772Sjkim.end	private_AES_set_decrypt_key
1230238384Sjkim___
1231238384Sjkim}}}
1232238384Sjkim
1233238384Sjkim######################################################################
1234238384Sjkim# Tables are kept in endian-neutral manner
1235238384Sjkim$code.=<<___;
1236238384Sjkim.rdata
1237238384Sjkim.align	6
1238238384SjkimAES_Te:
1239238384Sjkim.byte	0xc6,0x63,0x63,0xa5,	0xf8,0x7c,0x7c,0x84	# Te0
1240238384Sjkim.byte	0xee,0x77,0x77,0x99,	0xf6,0x7b,0x7b,0x8d
1241238384Sjkim.byte	0xff,0xf2,0xf2,0x0d,	0xd6,0x6b,0x6b,0xbd
1242238384Sjkim.byte	0xde,0x6f,0x6f,0xb1,	0x91,0xc5,0xc5,0x54
1243238384Sjkim.byte	0x60,0x30,0x30,0x50,	0x02,0x01,0x01,0x03
1244238384Sjkim.byte	0xce,0x67,0x67,0xa9,	0x56,0x2b,0x2b,0x7d
1245238384Sjkim.byte	0xe7,0xfe,0xfe,0x19,	0xb5,0xd7,0xd7,0x62
1246238384Sjkim.byte	0x4d,0xab,0xab,0xe6,	0xec,0x76,0x76,0x9a
1247238384Sjkim.byte	0x8f,0xca,0xca,0x45,	0x1f,0x82,0x82,0x9d
1248238384Sjkim.byte	0x89,0xc9,0xc9,0x40,	0xfa,0x7d,0x7d,0x87
1249238384Sjkim.byte	0xef,0xfa,0xfa,0x15,	0xb2,0x59,0x59,0xeb
1250238384Sjkim.byte	0x8e,0x47,0x47,0xc9,	0xfb,0xf0,0xf0,0x0b
1251238384Sjkim.byte	0x41,0xad,0xad,0xec,	0xb3,0xd4,0xd4,0x67
1252238384Sjkim.byte	0x5f,0xa2,0xa2,0xfd,	0x45,0xaf,0xaf,0xea
1253238384Sjkim.byte	0x23,0x9c,0x9c,0xbf,	0x53,0xa4,0xa4,0xf7
1254238384Sjkim.byte	0xe4,0x72,0x72,0x96,	0x9b,0xc0,0xc0,0x5b
1255238384Sjkim.byte	0x75,0xb7,0xb7,0xc2,	0xe1,0xfd,0xfd,0x1c
1256238384Sjkim.byte	0x3d,0x93,0x93,0xae,	0x4c,0x26,0x26,0x6a
1257238384Sjkim.byte	0x6c,0x36,0x36,0x5a,	0x7e,0x3f,0x3f,0x41
1258238384Sjkim.byte	0xf5,0xf7,0xf7,0x02,	0x83,0xcc,0xcc,0x4f
1259238384Sjkim.byte	0x68,0x34,0x34,0x5c,	0x51,0xa5,0xa5,0xf4
1260238384Sjkim.byte	0xd1,0xe5,0xe5,0x34,	0xf9,0xf1,0xf1,0x08
1261238384Sjkim.byte	0xe2,0x71,0x71,0x93,	0xab,0xd8,0xd8,0x73
1262238384Sjkim.byte	0x62,0x31,0x31,0x53,	0x2a,0x15,0x15,0x3f
1263238384Sjkim.byte	0x08,0x04,0x04,0x0c,	0x95,0xc7,0xc7,0x52
1264238384Sjkim.byte	0x46,0x23,0x23,0x65,	0x9d,0xc3,0xc3,0x5e
1265238384Sjkim.byte	0x30,0x18,0x18,0x28,	0x37,0x96,0x96,0xa1
1266238384Sjkim.byte	0x0a,0x05,0x05,0x0f,	0x2f,0x9a,0x9a,0xb5
1267238384Sjkim.byte	0x0e,0x07,0x07,0x09,	0x24,0x12,0x12,0x36
1268238384Sjkim.byte	0x1b,0x80,0x80,0x9b,	0xdf,0xe2,0xe2,0x3d
1269238384Sjkim.byte	0xcd,0xeb,0xeb,0x26,	0x4e,0x27,0x27,0x69
1270238384Sjkim.byte	0x7f,0xb2,0xb2,0xcd,	0xea,0x75,0x75,0x9f
1271238384Sjkim.byte	0x12,0x09,0x09,0x1b,	0x1d,0x83,0x83,0x9e
1272238384Sjkim.byte	0x58,0x2c,0x2c,0x74,	0x34,0x1a,0x1a,0x2e
1273238384Sjkim.byte	0x36,0x1b,0x1b,0x2d,	0xdc,0x6e,0x6e,0xb2
1274238384Sjkim.byte	0xb4,0x5a,0x5a,0xee,	0x5b,0xa0,0xa0,0xfb
1275238384Sjkim.byte	0xa4,0x52,0x52,0xf6,	0x76,0x3b,0x3b,0x4d
1276238384Sjkim.byte	0xb7,0xd6,0xd6,0x61,	0x7d,0xb3,0xb3,0xce
1277238384Sjkim.byte	0x52,0x29,0x29,0x7b,	0xdd,0xe3,0xe3,0x3e
1278238384Sjkim.byte	0x5e,0x2f,0x2f,0x71,	0x13,0x84,0x84,0x97
1279238384Sjkim.byte	0xa6,0x53,0x53,0xf5,	0xb9,0xd1,0xd1,0x68
1280238384Sjkim.byte	0x00,0x00,0x00,0x00,	0xc1,0xed,0xed,0x2c
1281238384Sjkim.byte	0x40,0x20,0x20,0x60,	0xe3,0xfc,0xfc,0x1f
1282238384Sjkim.byte	0x79,0xb1,0xb1,0xc8,	0xb6,0x5b,0x5b,0xed
1283238384Sjkim.byte	0xd4,0x6a,0x6a,0xbe,	0x8d,0xcb,0xcb,0x46
1284238384Sjkim.byte	0x67,0xbe,0xbe,0xd9,	0x72,0x39,0x39,0x4b
1285238384Sjkim.byte	0x94,0x4a,0x4a,0xde,	0x98,0x4c,0x4c,0xd4
1286238384Sjkim.byte	0xb0,0x58,0x58,0xe8,	0x85,0xcf,0xcf,0x4a
1287238384Sjkim.byte	0xbb,0xd0,0xd0,0x6b,	0xc5,0xef,0xef,0x2a
1288238384Sjkim.byte	0x4f,0xaa,0xaa,0xe5,	0xed,0xfb,0xfb,0x16
1289238384Sjkim.byte	0x86,0x43,0x43,0xc5,	0x9a,0x4d,0x4d,0xd7
1290238384Sjkim.byte	0x66,0x33,0x33,0x55,	0x11,0x85,0x85,0x94
1291238384Sjkim.byte	0x8a,0x45,0x45,0xcf,	0xe9,0xf9,0xf9,0x10
1292238384Sjkim.byte	0x04,0x02,0x02,0x06,	0xfe,0x7f,0x7f,0x81
1293238384Sjkim.byte	0xa0,0x50,0x50,0xf0,	0x78,0x3c,0x3c,0x44
1294238384Sjkim.byte	0x25,0x9f,0x9f,0xba,	0x4b,0xa8,0xa8,0xe3
1295238384Sjkim.byte	0xa2,0x51,0x51,0xf3,	0x5d,0xa3,0xa3,0xfe
1296238384Sjkim.byte	0x80,0x40,0x40,0xc0,	0x05,0x8f,0x8f,0x8a
1297238384Sjkim.byte	0x3f,0x92,0x92,0xad,	0x21,0x9d,0x9d,0xbc
1298238384Sjkim.byte	0x70,0x38,0x38,0x48,	0xf1,0xf5,0xf5,0x04
1299238384Sjkim.byte	0x63,0xbc,0xbc,0xdf,	0x77,0xb6,0xb6,0xc1
1300238384Sjkim.byte	0xaf,0xda,0xda,0x75,	0x42,0x21,0x21,0x63
1301238384Sjkim.byte	0x20,0x10,0x10,0x30,	0xe5,0xff,0xff,0x1a
1302238384Sjkim.byte	0xfd,0xf3,0xf3,0x0e,	0xbf,0xd2,0xd2,0x6d
1303238384Sjkim.byte	0x81,0xcd,0xcd,0x4c,	0x18,0x0c,0x0c,0x14
1304238384Sjkim.byte	0x26,0x13,0x13,0x35,	0xc3,0xec,0xec,0x2f
1305238384Sjkim.byte	0xbe,0x5f,0x5f,0xe1,	0x35,0x97,0x97,0xa2
1306238384Sjkim.byte	0x88,0x44,0x44,0xcc,	0x2e,0x17,0x17,0x39
1307238384Sjkim.byte	0x93,0xc4,0xc4,0x57,	0x55,0xa7,0xa7,0xf2
1308238384Sjkim.byte	0xfc,0x7e,0x7e,0x82,	0x7a,0x3d,0x3d,0x47
1309238384Sjkim.byte	0xc8,0x64,0x64,0xac,	0xba,0x5d,0x5d,0xe7
1310238384Sjkim.byte	0x32,0x19,0x19,0x2b,	0xe6,0x73,0x73,0x95
1311238384Sjkim.byte	0xc0,0x60,0x60,0xa0,	0x19,0x81,0x81,0x98
1312238384Sjkim.byte	0x9e,0x4f,0x4f,0xd1,	0xa3,0xdc,0xdc,0x7f
1313238384Sjkim.byte	0x44,0x22,0x22,0x66,	0x54,0x2a,0x2a,0x7e
1314238384Sjkim.byte	0x3b,0x90,0x90,0xab,	0x0b,0x88,0x88,0x83
1315238384Sjkim.byte	0x8c,0x46,0x46,0xca,	0xc7,0xee,0xee,0x29
1316238384Sjkim.byte	0x6b,0xb8,0xb8,0xd3,	0x28,0x14,0x14,0x3c
1317238384Sjkim.byte	0xa7,0xde,0xde,0x79,	0xbc,0x5e,0x5e,0xe2
1318238384Sjkim.byte	0x16,0x0b,0x0b,0x1d,	0xad,0xdb,0xdb,0x76
1319238384Sjkim.byte	0xdb,0xe0,0xe0,0x3b,	0x64,0x32,0x32,0x56
1320238384Sjkim.byte	0x74,0x3a,0x3a,0x4e,	0x14,0x0a,0x0a,0x1e
1321238384Sjkim.byte	0x92,0x49,0x49,0xdb,	0x0c,0x06,0x06,0x0a
1322238384Sjkim.byte	0x48,0x24,0x24,0x6c,	0xb8,0x5c,0x5c,0xe4
1323238384Sjkim.byte	0x9f,0xc2,0xc2,0x5d,	0xbd,0xd3,0xd3,0x6e
1324238384Sjkim.byte	0x43,0xac,0xac,0xef,	0xc4,0x62,0x62,0xa6
1325238384Sjkim.byte	0x39,0x91,0x91,0xa8,	0x31,0x95,0x95,0xa4
1326238384Sjkim.byte	0xd3,0xe4,0xe4,0x37,	0xf2,0x79,0x79,0x8b
1327238384Sjkim.byte	0xd5,0xe7,0xe7,0x32,	0x8b,0xc8,0xc8,0x43
1328238384Sjkim.byte	0x6e,0x37,0x37,0x59,	0xda,0x6d,0x6d,0xb7
1329238384Sjkim.byte	0x01,0x8d,0x8d,0x8c,	0xb1,0xd5,0xd5,0x64
1330238384Sjkim.byte	0x9c,0x4e,0x4e,0xd2,	0x49,0xa9,0xa9,0xe0
1331238384Sjkim.byte	0xd8,0x6c,0x6c,0xb4,	0xac,0x56,0x56,0xfa
1332238384Sjkim.byte	0xf3,0xf4,0xf4,0x07,	0xcf,0xea,0xea,0x25
1333238384Sjkim.byte	0xca,0x65,0x65,0xaf,	0xf4,0x7a,0x7a,0x8e
1334238384Sjkim.byte	0x47,0xae,0xae,0xe9,	0x10,0x08,0x08,0x18
1335238384Sjkim.byte	0x6f,0xba,0xba,0xd5,	0xf0,0x78,0x78,0x88
1336238384Sjkim.byte	0x4a,0x25,0x25,0x6f,	0x5c,0x2e,0x2e,0x72
1337238384Sjkim.byte	0x38,0x1c,0x1c,0x24,	0x57,0xa6,0xa6,0xf1
1338238384Sjkim.byte	0x73,0xb4,0xb4,0xc7,	0x97,0xc6,0xc6,0x51
1339238384Sjkim.byte	0xcb,0xe8,0xe8,0x23,	0xa1,0xdd,0xdd,0x7c
1340238384Sjkim.byte	0xe8,0x74,0x74,0x9c,	0x3e,0x1f,0x1f,0x21
1341238384Sjkim.byte	0x96,0x4b,0x4b,0xdd,	0x61,0xbd,0xbd,0xdc
1342238384Sjkim.byte	0x0d,0x8b,0x8b,0x86,	0x0f,0x8a,0x8a,0x85
1343238384Sjkim.byte	0xe0,0x70,0x70,0x90,	0x7c,0x3e,0x3e,0x42
1344238384Sjkim.byte	0x71,0xb5,0xb5,0xc4,	0xcc,0x66,0x66,0xaa
1345238384Sjkim.byte	0x90,0x48,0x48,0xd8,	0x06,0x03,0x03,0x05
1346238384Sjkim.byte	0xf7,0xf6,0xf6,0x01,	0x1c,0x0e,0x0e,0x12
1347238384Sjkim.byte	0xc2,0x61,0x61,0xa3,	0x6a,0x35,0x35,0x5f
1348238384Sjkim.byte	0xae,0x57,0x57,0xf9,	0x69,0xb9,0xb9,0xd0
1349238384Sjkim.byte	0x17,0x86,0x86,0x91,	0x99,0xc1,0xc1,0x58
1350238384Sjkim.byte	0x3a,0x1d,0x1d,0x27,	0x27,0x9e,0x9e,0xb9
1351238384Sjkim.byte	0xd9,0xe1,0xe1,0x38,	0xeb,0xf8,0xf8,0x13
1352238384Sjkim.byte	0x2b,0x98,0x98,0xb3,	0x22,0x11,0x11,0x33
1353238384Sjkim.byte	0xd2,0x69,0x69,0xbb,	0xa9,0xd9,0xd9,0x70
1354238384Sjkim.byte	0x07,0x8e,0x8e,0x89,	0x33,0x94,0x94,0xa7
1355238384Sjkim.byte	0x2d,0x9b,0x9b,0xb6,	0x3c,0x1e,0x1e,0x22
1356238384Sjkim.byte	0x15,0x87,0x87,0x92,	0xc9,0xe9,0xe9,0x20
1357238384Sjkim.byte	0x87,0xce,0xce,0x49,	0xaa,0x55,0x55,0xff
1358238384Sjkim.byte	0x50,0x28,0x28,0x78,	0xa5,0xdf,0xdf,0x7a
1359238384Sjkim.byte	0x03,0x8c,0x8c,0x8f,	0x59,0xa1,0xa1,0xf8
1360238384Sjkim.byte	0x09,0x89,0x89,0x80,	0x1a,0x0d,0x0d,0x17
1361238384Sjkim.byte	0x65,0xbf,0xbf,0xda,	0xd7,0xe6,0xe6,0x31
1362238384Sjkim.byte	0x84,0x42,0x42,0xc6,	0xd0,0x68,0x68,0xb8
1363238384Sjkim.byte	0x82,0x41,0x41,0xc3,	0x29,0x99,0x99,0xb0
1364238384Sjkim.byte	0x5a,0x2d,0x2d,0x77,	0x1e,0x0f,0x0f,0x11
1365238384Sjkim.byte	0x7b,0xb0,0xb0,0xcb,	0xa8,0x54,0x54,0xfc
1366238384Sjkim.byte	0x6d,0xbb,0xbb,0xd6,	0x2c,0x16,0x16,0x3a
1367238384Sjkim
1368238384Sjkim.byte	0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5	# Te4
1369238384Sjkim.byte	0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76
1370238384Sjkim.byte	0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0
1371238384Sjkim.byte	0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0
1372238384Sjkim.byte	0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc
1373238384Sjkim.byte	0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15
1374238384Sjkim.byte	0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a
1375238384Sjkim.byte	0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75
1376238384Sjkim.byte	0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0
1377238384Sjkim.byte	0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84
1378238384Sjkim.byte	0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b
1379238384Sjkim.byte	0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf
1380238384Sjkim.byte	0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85
1381238384Sjkim.byte	0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8
1382238384Sjkim.byte	0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5
1383238384Sjkim.byte	0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2
1384238384Sjkim.byte	0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17
1385238384Sjkim.byte	0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73
1386238384Sjkim.byte	0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88
1387238384Sjkim.byte	0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb
1388238384Sjkim.byte	0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c
1389238384Sjkim.byte	0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79
1390238384Sjkim.byte	0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9
1391238384Sjkim.byte	0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08
1392238384Sjkim.byte	0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6
1393238384Sjkim.byte	0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a
1394238384Sjkim.byte	0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e
1395238384Sjkim.byte	0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e
1396238384Sjkim.byte	0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94
1397238384Sjkim.byte	0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf
1398238384Sjkim.byte	0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68
1399238384Sjkim.byte	0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
1400238384Sjkim
1401238384Sjkim.byte	0x01,0x00,0x00,0x00,	0x02,0x00,0x00,0x00	# rcon
1402238384Sjkim.byte	0x04,0x00,0x00,0x00,	0x08,0x00,0x00,0x00
1403238384Sjkim.byte	0x10,0x00,0x00,0x00,	0x20,0x00,0x00,0x00
1404238384Sjkim.byte	0x40,0x00,0x00,0x00,	0x80,0x00,0x00,0x00
1405238384Sjkim.byte	0x1B,0x00,0x00,0x00,	0x36,0x00,0x00,0x00
1406238384Sjkim
1407238384Sjkim.align	6
1408238384SjkimAES_Td:
1409238384Sjkim.byte	0x51,0xf4,0xa7,0x50,	0x7e,0x41,0x65,0x53	# Td0
1410238384Sjkim.byte	0x1a,0x17,0xa4,0xc3,	0x3a,0x27,0x5e,0x96
1411238384Sjkim.byte	0x3b,0xab,0x6b,0xcb,	0x1f,0x9d,0x45,0xf1
1412238384Sjkim.byte	0xac,0xfa,0x58,0xab,	0x4b,0xe3,0x03,0x93
1413238384Sjkim.byte	0x20,0x30,0xfa,0x55,	0xad,0x76,0x6d,0xf6
1414238384Sjkim.byte	0x88,0xcc,0x76,0x91,	0xf5,0x02,0x4c,0x25
1415238384Sjkim.byte	0x4f,0xe5,0xd7,0xfc,	0xc5,0x2a,0xcb,0xd7
1416238384Sjkim.byte	0x26,0x35,0x44,0x80,	0xb5,0x62,0xa3,0x8f
1417238384Sjkim.byte	0xde,0xb1,0x5a,0x49,	0x25,0xba,0x1b,0x67
1418238384Sjkim.byte	0x45,0xea,0x0e,0x98,	0x5d,0xfe,0xc0,0xe1
1419238384Sjkim.byte	0xc3,0x2f,0x75,0x02,	0x81,0x4c,0xf0,0x12
1420238384Sjkim.byte	0x8d,0x46,0x97,0xa3,	0x6b,0xd3,0xf9,0xc6
1421238384Sjkim.byte	0x03,0x8f,0x5f,0xe7,	0x15,0x92,0x9c,0x95
1422238384Sjkim.byte	0xbf,0x6d,0x7a,0xeb,	0x95,0x52,0x59,0xda
1423238384Sjkim.byte	0xd4,0xbe,0x83,0x2d,	0x58,0x74,0x21,0xd3
1424238384Sjkim.byte	0x49,0xe0,0x69,0x29,	0x8e,0xc9,0xc8,0x44
1425238384Sjkim.byte	0x75,0xc2,0x89,0x6a,	0xf4,0x8e,0x79,0x78
1426238384Sjkim.byte	0x99,0x58,0x3e,0x6b,	0x27,0xb9,0x71,0xdd
1427238384Sjkim.byte	0xbe,0xe1,0x4f,0xb6,	0xf0,0x88,0xad,0x17
1428238384Sjkim.byte	0xc9,0x20,0xac,0x66,	0x7d,0xce,0x3a,0xb4
1429238384Sjkim.byte	0x63,0xdf,0x4a,0x18,	0xe5,0x1a,0x31,0x82
1430238384Sjkim.byte	0x97,0x51,0x33,0x60,	0x62,0x53,0x7f,0x45
1431238384Sjkim.byte	0xb1,0x64,0x77,0xe0,	0xbb,0x6b,0xae,0x84
1432238384Sjkim.byte	0xfe,0x81,0xa0,0x1c,	0xf9,0x08,0x2b,0x94
1433238384Sjkim.byte	0x70,0x48,0x68,0x58,	0x8f,0x45,0xfd,0x19
1434238384Sjkim.byte	0x94,0xde,0x6c,0x87,	0x52,0x7b,0xf8,0xb7
1435238384Sjkim.byte	0xab,0x73,0xd3,0x23,	0x72,0x4b,0x02,0xe2
1436238384Sjkim.byte	0xe3,0x1f,0x8f,0x57,	0x66,0x55,0xab,0x2a
1437238384Sjkim.byte	0xb2,0xeb,0x28,0x07,	0x2f,0xb5,0xc2,0x03
1438238384Sjkim.byte	0x86,0xc5,0x7b,0x9a,	0xd3,0x37,0x08,0xa5
1439238384Sjkim.byte	0x30,0x28,0x87,0xf2,	0x23,0xbf,0xa5,0xb2
1440238384Sjkim.byte	0x02,0x03,0x6a,0xba,	0xed,0x16,0x82,0x5c
1441238384Sjkim.byte	0x8a,0xcf,0x1c,0x2b,	0xa7,0x79,0xb4,0x92
1442238384Sjkim.byte	0xf3,0x07,0xf2,0xf0,	0x4e,0x69,0xe2,0xa1
1443238384Sjkim.byte	0x65,0xda,0xf4,0xcd,	0x06,0x05,0xbe,0xd5
1444238384Sjkim.byte	0xd1,0x34,0x62,0x1f,	0xc4,0xa6,0xfe,0x8a
1445238384Sjkim.byte	0x34,0x2e,0x53,0x9d,	0xa2,0xf3,0x55,0xa0
1446238384Sjkim.byte	0x05,0x8a,0xe1,0x32,	0xa4,0xf6,0xeb,0x75
1447238384Sjkim.byte	0x0b,0x83,0xec,0x39,	0x40,0x60,0xef,0xaa
1448238384Sjkim.byte	0x5e,0x71,0x9f,0x06,	0xbd,0x6e,0x10,0x51
1449238384Sjkim.byte	0x3e,0x21,0x8a,0xf9,	0x96,0xdd,0x06,0x3d
1450238384Sjkim.byte	0xdd,0x3e,0x05,0xae,	0x4d,0xe6,0xbd,0x46
1451238384Sjkim.byte	0x91,0x54,0x8d,0xb5,	0x71,0xc4,0x5d,0x05
1452238384Sjkim.byte	0x04,0x06,0xd4,0x6f,	0x60,0x50,0x15,0xff
1453238384Sjkim.byte	0x19,0x98,0xfb,0x24,	0xd6,0xbd,0xe9,0x97
1454238384Sjkim.byte	0x89,0x40,0x43,0xcc,	0x67,0xd9,0x9e,0x77
1455238384Sjkim.byte	0xb0,0xe8,0x42,0xbd,	0x07,0x89,0x8b,0x88
1456238384Sjkim.byte	0xe7,0x19,0x5b,0x38,	0x79,0xc8,0xee,0xdb
1457238384Sjkim.byte	0xa1,0x7c,0x0a,0x47,	0x7c,0x42,0x0f,0xe9
1458238384Sjkim.byte	0xf8,0x84,0x1e,0xc9,	0x00,0x00,0x00,0x00
1459238384Sjkim.byte	0x09,0x80,0x86,0x83,	0x32,0x2b,0xed,0x48
1460238384Sjkim.byte	0x1e,0x11,0x70,0xac,	0x6c,0x5a,0x72,0x4e
1461238384Sjkim.byte	0xfd,0x0e,0xff,0xfb,	0x0f,0x85,0x38,0x56
1462238384Sjkim.byte	0x3d,0xae,0xd5,0x1e,	0x36,0x2d,0x39,0x27
1463238384Sjkim.byte	0x0a,0x0f,0xd9,0x64,	0x68,0x5c,0xa6,0x21
1464238384Sjkim.byte	0x9b,0x5b,0x54,0xd1,	0x24,0x36,0x2e,0x3a
1465238384Sjkim.byte	0x0c,0x0a,0x67,0xb1,	0x93,0x57,0xe7,0x0f
1466238384Sjkim.byte	0xb4,0xee,0x96,0xd2,	0x1b,0x9b,0x91,0x9e
1467238384Sjkim.byte	0x80,0xc0,0xc5,0x4f,	0x61,0xdc,0x20,0xa2
1468238384Sjkim.byte	0x5a,0x77,0x4b,0x69,	0x1c,0x12,0x1a,0x16
1469238384Sjkim.byte	0xe2,0x93,0xba,0x0a,	0xc0,0xa0,0x2a,0xe5
1470238384Sjkim.byte	0x3c,0x22,0xe0,0x43,	0x12,0x1b,0x17,0x1d
1471238384Sjkim.byte	0x0e,0x09,0x0d,0x0b,	0xf2,0x8b,0xc7,0xad
1472238384Sjkim.byte	0x2d,0xb6,0xa8,0xb9,	0x14,0x1e,0xa9,0xc8
1473238384Sjkim.byte	0x57,0xf1,0x19,0x85,	0xaf,0x75,0x07,0x4c
1474238384Sjkim.byte	0xee,0x99,0xdd,0xbb,	0xa3,0x7f,0x60,0xfd
1475238384Sjkim.byte	0xf7,0x01,0x26,0x9f,	0x5c,0x72,0xf5,0xbc
1476238384Sjkim.byte	0x44,0x66,0x3b,0xc5,	0x5b,0xfb,0x7e,0x34
1477238384Sjkim.byte	0x8b,0x43,0x29,0x76,	0xcb,0x23,0xc6,0xdc
1478238384Sjkim.byte	0xb6,0xed,0xfc,0x68,	0xb8,0xe4,0xf1,0x63
1479238384Sjkim.byte	0xd7,0x31,0xdc,0xca,	0x42,0x63,0x85,0x10
1480238384Sjkim.byte	0x13,0x97,0x22,0x40,	0x84,0xc6,0x11,0x20
1481238384Sjkim.byte	0x85,0x4a,0x24,0x7d,	0xd2,0xbb,0x3d,0xf8
1482238384Sjkim.byte	0xae,0xf9,0x32,0x11,	0xc7,0x29,0xa1,0x6d
1483238384Sjkim.byte	0x1d,0x9e,0x2f,0x4b,	0xdc,0xb2,0x30,0xf3
1484238384Sjkim.byte	0x0d,0x86,0x52,0xec,	0x77,0xc1,0xe3,0xd0
1485238384Sjkim.byte	0x2b,0xb3,0x16,0x6c,	0xa9,0x70,0xb9,0x99
1486238384Sjkim.byte	0x11,0x94,0x48,0xfa,	0x47,0xe9,0x64,0x22
1487238384Sjkim.byte	0xa8,0xfc,0x8c,0xc4,	0xa0,0xf0,0x3f,0x1a
1488238384Sjkim.byte	0x56,0x7d,0x2c,0xd8,	0x22,0x33,0x90,0xef
1489238384Sjkim.byte	0x87,0x49,0x4e,0xc7,	0xd9,0x38,0xd1,0xc1
1490238384Sjkim.byte	0x8c,0xca,0xa2,0xfe,	0x98,0xd4,0x0b,0x36
1491238384Sjkim.byte	0xa6,0xf5,0x81,0xcf,	0xa5,0x7a,0xde,0x28
1492238384Sjkim.byte	0xda,0xb7,0x8e,0x26,	0x3f,0xad,0xbf,0xa4
1493238384Sjkim.byte	0x2c,0x3a,0x9d,0xe4,	0x50,0x78,0x92,0x0d
1494238384Sjkim.byte	0x6a,0x5f,0xcc,0x9b,	0x54,0x7e,0x46,0x62
1495238384Sjkim.byte	0xf6,0x8d,0x13,0xc2,	0x90,0xd8,0xb8,0xe8
1496238384Sjkim.byte	0x2e,0x39,0xf7,0x5e,	0x82,0xc3,0xaf,0xf5
1497238384Sjkim.byte	0x9f,0x5d,0x80,0xbe,	0x69,0xd0,0x93,0x7c
1498238384Sjkim.byte	0x6f,0xd5,0x2d,0xa9,	0xcf,0x25,0x12,0xb3
1499238384Sjkim.byte	0xc8,0xac,0x99,0x3b,	0x10,0x18,0x7d,0xa7
1500238384Sjkim.byte	0xe8,0x9c,0x63,0x6e,	0xdb,0x3b,0xbb,0x7b
1501238384Sjkim.byte	0xcd,0x26,0x78,0x09,	0x6e,0x59,0x18,0xf4
1502238384Sjkim.byte	0xec,0x9a,0xb7,0x01,	0x83,0x4f,0x9a,0xa8
1503238384Sjkim.byte	0xe6,0x95,0x6e,0x65,	0xaa,0xff,0xe6,0x7e
1504238384Sjkim.byte	0x21,0xbc,0xcf,0x08,	0xef,0x15,0xe8,0xe6
1505238384Sjkim.byte	0xba,0xe7,0x9b,0xd9,	0x4a,0x6f,0x36,0xce
1506238384Sjkim.byte	0xea,0x9f,0x09,0xd4,	0x29,0xb0,0x7c,0xd6
1507238384Sjkim.byte	0x31,0xa4,0xb2,0xaf,	0x2a,0x3f,0x23,0x31
1508238384Sjkim.byte	0xc6,0xa5,0x94,0x30,	0x35,0xa2,0x66,0xc0
1509238384Sjkim.byte	0x74,0x4e,0xbc,0x37,	0xfc,0x82,0xca,0xa6
1510238384Sjkim.byte	0xe0,0x90,0xd0,0xb0,	0x33,0xa7,0xd8,0x15
1511238384Sjkim.byte	0xf1,0x04,0x98,0x4a,	0x41,0xec,0xda,0xf7
1512238384Sjkim.byte	0x7f,0xcd,0x50,0x0e,	0x17,0x91,0xf6,0x2f
1513238384Sjkim.byte	0x76,0x4d,0xd6,0x8d,	0x43,0xef,0xb0,0x4d
1514238384Sjkim.byte	0xcc,0xaa,0x4d,0x54,	0xe4,0x96,0x04,0xdf
1515238384Sjkim.byte	0x9e,0xd1,0xb5,0xe3,	0x4c,0x6a,0x88,0x1b
1516238384Sjkim.byte	0xc1,0x2c,0x1f,0xb8,	0x46,0x65,0x51,0x7f
1517238384Sjkim.byte	0x9d,0x5e,0xea,0x04,	0x01,0x8c,0x35,0x5d
1518238384Sjkim.byte	0xfa,0x87,0x74,0x73,	0xfb,0x0b,0x41,0x2e
1519238384Sjkim.byte	0xb3,0x67,0x1d,0x5a,	0x92,0xdb,0xd2,0x52
1520238384Sjkim.byte	0xe9,0x10,0x56,0x33,	0x6d,0xd6,0x47,0x13
1521238384Sjkim.byte	0x9a,0xd7,0x61,0x8c,	0x37,0xa1,0x0c,0x7a
1522238384Sjkim.byte	0x59,0xf8,0x14,0x8e,	0xeb,0x13,0x3c,0x89
1523238384Sjkim.byte	0xce,0xa9,0x27,0xee,	0xb7,0x61,0xc9,0x35
1524238384Sjkim.byte	0xe1,0x1c,0xe5,0xed,	0x7a,0x47,0xb1,0x3c
1525238384Sjkim.byte	0x9c,0xd2,0xdf,0x59,	0x55,0xf2,0x73,0x3f
1526238384Sjkim.byte	0x18,0x14,0xce,0x79,	0x73,0xc7,0x37,0xbf
1527238384Sjkim.byte	0x53,0xf7,0xcd,0xea,	0x5f,0xfd,0xaa,0x5b
1528238384Sjkim.byte	0xdf,0x3d,0x6f,0x14,	0x78,0x44,0xdb,0x86
1529238384Sjkim.byte	0xca,0xaf,0xf3,0x81,	0xb9,0x68,0xc4,0x3e
1530238384Sjkim.byte	0x38,0x24,0x34,0x2c,	0xc2,0xa3,0x40,0x5f
1531238384Sjkim.byte	0x16,0x1d,0xc3,0x72,	0xbc,0xe2,0x25,0x0c
1532238384Sjkim.byte	0x28,0x3c,0x49,0x8b,	0xff,0x0d,0x95,0x41
1533238384Sjkim.byte	0x39,0xa8,0x01,0x71,	0x08,0x0c,0xb3,0xde
1534238384Sjkim.byte	0xd8,0xb4,0xe4,0x9c,	0x64,0x56,0xc1,0x90
1535238384Sjkim.byte	0x7b,0xcb,0x84,0x61,	0xd5,0x32,0xb6,0x70
1536238384Sjkim.byte	0x48,0x6c,0x5c,0x74,	0xd0,0xb8,0x57,0x42
1537238384Sjkim
1538238384Sjkim.byte	0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38	# Td4
1539238384Sjkim.byte	0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb
1540238384Sjkim.byte	0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87
1541238384Sjkim.byte	0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb
1542238384Sjkim.byte	0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d
1543238384Sjkim.byte	0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e
1544238384Sjkim.byte	0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2
1545238384Sjkim.byte	0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25
1546238384Sjkim.byte	0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16
1547238384Sjkim.byte	0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92
1548238384Sjkim.byte	0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda
1549238384Sjkim.byte	0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84
1550238384Sjkim.byte	0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a
1551238384Sjkim.byte	0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06
1552238384Sjkim.byte	0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02
1553238384Sjkim.byte	0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b
1554238384Sjkim.byte	0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea
1555238384Sjkim.byte	0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73
1556238384Sjkim.byte	0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85
1557238384Sjkim.byte	0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e
1558238384Sjkim.byte	0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89
1559238384Sjkim.byte	0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b
1560238384Sjkim.byte	0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20
1561238384Sjkim.byte	0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4
1562238384Sjkim.byte	0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31
1563238384Sjkim.byte	0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f
1564238384Sjkim.byte	0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d
1565238384Sjkim.byte	0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef
1566238384Sjkim.byte	0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0
1567238384Sjkim.byte	0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61
1568238384Sjkim.byte	0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26
1569238384Sjkim.byte	0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d
1570238384Sjkim___
1571238384Sjkim
1572238384Sjkimforeach (split("\n",$code)) {
1573238384Sjkim	s/\`([^\`]*)\`/eval $1/ge;
1574238384Sjkim
1575238384Sjkim	# made-up _instructions, _xtr, _ins, _ror and _bias, cope
1576238384Sjkim	# with byte order dependencies...
1577238384Sjkim	if (/^\s+_/) {
1578238384Sjkim	    s/(_[a-z]+\s+)(\$[0-9]+),([^,]+)(#.*)*$/$1$2,$2,$3/;
1579238384Sjkim
1580238384Sjkim	    s/_xtr\s+(\$[0-9]+),(\$[0-9]+),([0-9]+(\-2)*)/
1581238384Sjkim		sprintf("srl\t$1,$2,%d",$big_endian ?	eval($3)
1582238384Sjkim					:		eval("24-$3"))/e or
1583238384Sjkim	    s/_ins\s+(\$[0-9]+),(\$[0-9]+),([0-9]+)/
1584238384Sjkim		sprintf("sll\t$1,$2,%d",$big_endian ?	eval($3)
1585238384Sjkim					:		eval("24-$3"))/e or
1586238384Sjkim	    s/_ror\s+(\$[0-9]+),(\$[0-9]+),(\-?[0-9]+)/
1587238384Sjkim		sprintf("srl\t$1,$2,%d",$big_endian ?	eval($3)
1588238384Sjkim					:		eval("$3*-1"))/e or
1589238384Sjkim	    s/_bias\s+(\$[0-9]+),(\$[0-9]+),([0-9]+)/
1590238384Sjkim		sprintf("sll\t$1,$2,%d",$big_endian ?	eval($3)
1591238384Sjkim					:		eval("($3-16)&31"))/e;
1592238384Sjkim
1593238384Sjkim	    s/srl\s+(\$[0-9]+),(\$[0-9]+),\-([0-9]+)/
1594238384Sjkim		sprintf("sll\t$1,$2,$3")/e				or
1595238384Sjkim	    s/srl\s+(\$[0-9]+),(\$[0-9]+),0/
1596238384Sjkim		sprintf("and\t$1,$2,0xff")/e				or
1597238384Sjkim	    s/(sll\s+\$[0-9]+,\$[0-9]+,0)/#$1/;
1598238384Sjkim	}
1599238384Sjkim
1600238384Sjkim	# convert lwl/lwr and swr/swl to little-endian order
1601238384Sjkim	if (!$big_endian && /^\s+[sl]w[lr]\s+/) {
1602238384Sjkim	    s/([sl]wl.*)([0-9]+)\((\$[0-9]+)\)/
1603238384Sjkim		sprintf("$1%d($3)",eval("$2-$2%4+($2%4-1)&3"))/e	or
1604238384Sjkim	    s/([sl]wr.*)([0-9]+)\((\$[0-9]+)\)/
1605238384Sjkim		sprintf("$1%d($3)",eval("$2-$2%4+($2%4+1)&3"))/e;
1606238384Sjkim	}
1607238384Sjkim
1608238384Sjkim	print $_,"\n";
1609238384Sjkim}
1610238384Sjkim
1611238384Sjkimclose STDOUT;
1612