xref: /netbsd-src/crypto/external/bsd/openssl/lib/libcrypto/arch/m68k/aes-m68k.S (revision f383fde5645482dd11bede5edee605931c14a6a6)
1|	$NetBSD: aes-m68k.S,v 1.4 2019/08/18 09:51:06 rin Exp $
2
3| Copyright (C) 2016 Tetsuya Isaki. All rights reserved.
4| Copyright (C) 2016 Y.Sugahara (moveccr). All rights reserved.
5|
6| Redistribution and use in source and binary forms, with or without
7| modification, are permitted provided that the following conditions
8| are met:
9| 1. Redistributions of source code must retain the above copyright
10|    notice, this list of conditions and the following disclaimer.
11| 2. Redistributions in binary form must reproduce the above copyright
12|    notice, this list of conditions and the following disclaimer in the
13|    documentation and/or other materials provided with the distribution.
14|
15| THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16| IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17| OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18| IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19| INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
20| BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
22| AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
23| OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24| OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25| SUCH DAMAGE.
26
27#define rd_key	(0)
28#define rounds	(60 * 4)
29
30| int
31| AES_set_encrypt_key(const unsigned char *userKey,
32|  const int bits,
33|  AES_KEY *key)
34	.global	AES_set_encrypt_key
35	.type	AES_set_encrypt_key, @function
36AES_set_encrypt_key:
37.Laes_set_encrypt_key:
38	moveml	%d2-%d7/%a2-%a6,%sp@-
39	moveal	%sp@(44+4),%a0		| userKey
40	moveal	%sp@(44+8),%a1		| bits
41	moveal	%sp@(44+12),%a3		| key
42
43	tstl	%a0
44	beq	.Lpek_return1		| return -1 if userKey == NULL
45	tstl	%a3
46	beq	.Lpek_return1		| return -1 if key == NULL
47
48	cmpaw	#128,%a1
49	bne	.Lpek192_check		| unless bits == 128
50.Lpek128:
51	| %d0-%d7 rk[0..7]
52	| %a0 userKey, Te0
53	| %a1          Te1
54	| %a2          Te2
55	| %a3 key,     Te3
56	| %a4 rcon_byte
57	| %a5 &rk[4]
58	| %a6 end of rcon_byte
59
60	moveq	#10,%d0
61	movel	%d0,%a3@(rounds)	| key->rounds = 10
62
63	lea	%a3@(rd_key),%a5	| &rk[0]
64
65	| rk[0] = GETU32(userKey     );
66	| rk[1] = GETU32(userKey +  4);
67	| rk[2] = GETU32(userKey +  8);
68	| rk[3] = GETU32(userKey + 12);
69	moveml	%a0@,%d0-%d3
70	movel	%d0,%a5@+
71	movel	%d1,%a5@+
72	movel	%d2,%a5@+
73	movel	%d3,%a5@+
74
75	lea	%pc@(Te0),%a0		| %a0 = Te0
76	lea	%a0@(256*4),%a1		| %a1 = Te1
77	lea	%a1@(256*4),%a2		| %a2 = Te2
78	lea	%a2@(256*4),%a3		| %a3 = Te3
79
80	moveq	#0,%d7
81	lea	%pc@(rcon_byte),%a4
82	lea	%a4@(10),%a6
83
84.Lpek128_loop:
85					| d6 consists of four Te index bytes
86	movel	%d3,%d5			| d5=rk[3] as {1,2,3,0}
87	moveb	%d5,%d7			| d7=temp
88	moveb	%a0@(2,%d7:w:4),%d4	| d4=$xxxxxx00
89	swap	%d5			| d5={3,0,1,2}
90	lsll	#8,%d4			| d4=$xxxx00xx
91	moveb	%d5,%d7			| d7=temp>>16
92	moveb	%a2@(0,%d7:w:4),%d6	| d6=$xxxxxx22
93	lsrl	#8,%d5			| d5={x,3,0,1}
94	moveb	%a4@+,%d7		| LSByte ^= rcon[i]
95	eorb	%d7,%d6
96	lsll	#8,%d6			| d6=$xxxx22xx
97	moveb	%d5,%d7			| d7=temp>>24
98	moveb	%a1@(3,%d7:w:4),%d4	| d4=$xxxx0011
99	swap	%d5			| d5={0,1,x,3}
100	moveb	%d5,%d7			| d7=temp>>8
101	moveb	%a3@(1,%d7:w:4),%d6	| d6=$xxxx2233
102	swap	%d6			| d6=$2233xxxx
103	movew	%d4,%d6			| d6=$22330011
104
105	eorl	%d6,%d0			| rk[4] = rk[0]^ (Te..)
106	movel	%d0,%a5@+
107	eorl	%d0,%d1			| rk[5] = rk[1] ^ rk[4];
108	movel	%d1,%a5@+
109	eorl	%d1,%d2			| rk[6] = rk[2] ^ rk[5];
110	movel	%d2,%a5@+
111	eorl	%d2,%d3			| rk[7] = rk[3] ^ rk[6];
112	movel	%d3,%a5@+
113
114	cmpal	%a4,%a6
115	bne	.Lpek128_loop		|if (++i == 10) return 0;
116
117.Lpek_return0:
118	moveql	#0,%d0
119.Lpek_return:
120	moveml	%sp@+,%d2-%d7/%a2-%a6
121	rts
122
123.Lpek192_check:
124	| %a0 userKey
125	| %a1 bits
126	| %a3 key
127	cmpaw	#192,%a1
128	bne	.Lpek256_check		| unless bits == 192
129.Lpek192:
130	| %a0 Te0
131	| %a1 Te1
132	| %a2 Te2
133	| %a3 Te3
134	| %a4 rcon_byte
135	| %a5 &rk[6]
136	| %a6 end of rcon_byte
137	moveq	#12,%d0
138	movel	%d0,%a3@(rounds)	| key->rounds = 12
139
140	lea	%a3@(rd_key),%a5	| &rk[0]
141
142	| rk[0] = GETU32(userKey     );
143	| rk[1] = GETU32(userKey +  4);
144	| rk[2] = GETU32(userKey +  8);
145	| rk[3] = GETU32(userKey + 12);
146	| rk[4] = GETU32(userKey + 16);
147	| rk[5] = GETU32(userKey + 20);
148	moveml	%a0@,%d0-%d5		| copy userKey[0..23]
149	movel	%d0,%a5@+
150	movel	%d1,%a5@+
151	movel	%d2,%a5@+
152	movel	%d3,%a5@+
153	movel	%d4,%a5@+
154	movel	%d5,%a5@		| read again later
155
156	lea	%pc@(Te0   +2),%a0	| %a0 = Te0 + 2
157	lea	%a0@(256*4 -2+3),%a1	| %a1 = Te1 + 3
158	lea	%a1@(256*4 -3+0),%a2	| %a2 = Te2 + 0
159	lea	%a2@(256*4 +0+1),%a3	| %a3 = Te3 + 1
160
161	moveq	#0,%d7
162	lea	%pc@(rcon_byte),%a4
163	lea	%a4@(8),%a6
164	bra	.Lpek192_loop_start
165
166.Lpek192_loop:
167	eorl	%d3,%d4			| rk[10] = rk[4] ^ rk[9]
168	movel	%d4,%a5@+		| %d4 is rk[10]
169	eorl	%d4,%d5			| rk[11] = rk[5] ^ rk[10]
170	movel	%d5,%a5@		| %d5 is rk[11]
171
172.Lpek192_loop_start:
173	| %d0..%d5 = rk[0..5]
174	|
175	| temp = rk[5];
176	| rk[6]  = (Te0[(temp      ) & 0xff] & 0x0000ff00)
177	| rk[6] |= (Te3[(temp >>  8) & 0xff] & 0x00ff0000)
178	| rk[6] |= (Te2[(temp >> 16) & 0xff] & 0xff000000)
179	|         ^ rcon[i]
180	| rk[6] |= (Te1[(temp >> 24)       ] & 0x000000ff)
181	moveb	%d5,%d7			| temp >> 0
182	moveb	%a0@(%d7:w:4),%d6	| d6=$xxxxxx00
183	rorl	#8,%d6			| d6=$00xxxxxx
184	lsrl	#8,%d5			| temp >> 8
185	moveb	%d5,%d7
186	moveb	%a3@(%d7:w:4),%d6	| d6=$00xxxx11
187	rorl	#8,%d6			| d6=$1100xxxx
188	lsrl	#8,%d5			| temp >> 16
189	moveb	%d5,%d7
190	moveb	%a2@(%d7:w:4),%d6	| d6=$1100xx22
191	moveb	%a4@+,%d7		| LSByte ^= rcon[i]
192	eorb	%d7,%d6
193	rorl	#8,%d6			| d6=$221100xx
194	lsrl	#8,%d5			| temp >> 24
195	moveb	%a1@(%d5:w:4),%d6	| d6=$22110033
196
197	movel	%a5@+,%d5		| read rk[5] again
198					| (faster than keeping %a5)
199
200	eorl	%d6,%d0			| rk[6] ^= rk[0]
201	movel	%d0,%a5@+		| %d0 is rk[6]
202	eorl	%d0,%d1			| rk[7] = rk[1] ^ rk[6]
203	movel	%d1,%a5@+		| %d1 is rk[7]
204	eorl	%d1,%d2			| rk[8] = rk[2] ^ rk[7]
205	movel	%d2,%a5@+		| %d2 is rk[8]
206	eorl	%d2,%d3			| rk[9] = rk[3] ^ rk[8]
207	movel	%d3,%a5@+		| %d3 is rk[9]
208
209	cmpal	%a4,%a6
210	bne	.Lpek192_loop
211	bra	.Lpek_return0
212
213
214.Lpek256_check:
215	| %a0 userKey
216	| %a1 bits
217	| %a3 key
218	cmpaw	#256,%a1
219	bne	.Lpek_return2		| otherwise return -2
220.Lpek256:
221	| %a0 Te0
222	| %a1 Te1
223	| %a2 Te2
224	| %a3 Te3
225	| %a4 rcon_byte
226	| %a5 &rk[6]
227	| %a6 end of rcon_byte
228	moveq	#14,%d0
229	movel	%d0,%a3@(rounds)	| key->rounds = 14
230
231	lea	%a3@(rd_key),%a5	| &rk[0]
232
233	| rk[0] = GETU32(userKey     );
234	| rk[1] = GETU32(userKey +  4);
235	| rk[2] = GETU32(userKey +  8);
236	| rk[3] = GETU32(userKey + 12);
237	| rk[4] = GETU32(userKey + 16);
238	| rk[5] = GETU32(userKey + 20);
239	| rk[6] = GETU32(userKey + 24);
240	| rk[7] = GETU32(userKey + 28);
241	moveml	%a0@,%d0-%d7		| copy userKey[0..31]
242	movel	%d0,%a5@+
243	movel	%d1,%a5@+
244	movel	%d2,%a5@+
245	movel	%d3,%a5@+
246	movel	%d4,%a5@+
247	movel	%d5,%a5@+
248	movel	%d6,%a5@+
249	movel	%d7,%a5@+
250
251	lea	%pc@(Te0   +2),%a0	| %a0 = Te0 + 2
252	lea	%a0@(256*4 -2+3),%a1	| %a1 = Te1 + 3
253	lea	%a1@(256*4 -3+0),%a2	| %a2 = Te2 + 0
254	lea	%a2@(256*4 +0+1),%a3	| %a3 = Te3 + 1
255
256	lea	%pc@(rcon_byte),%a4
257	lea	%a4@(7),%a6
258	bra	.Lpek256_loop_start
259
260.Lpek256_loop:
261	| %d0: rk[8]  -> work
262	| %d1: rk[9]  -> work
263	| %d2: rk[10]
264	| %d3: rk[11] -> work
265	| %d4: rk[4]
266	| %d5: work   -> rk[5]
267	| %d6: work   -> rk[6]
268	| %d7: work   -> rk[7]
269	| %a5 = &rk[12]
270	|
271	| temp = rk[11];
272	| rk[12]  = (Te1[(temp      ) & 0xff] & 0x000000ff);
273	| rk[12] |= (Te0[(temp >>  8) & 0xff] & 0x0000ff00);
274	| rk[12] |= (Te3[(temp >> 16) & 0xff] & 0x00ff0000);
275	| rk[12] |= (Te2[(temp >> 24)       ] & 0xff000000);
276	| rk[12] ^= rk[ 4];
277
278	moveml	%a5@(-7*4),%d5-%d7	| %d5..%d7 = rk[5..7]
279
280	moveq	#0,%d0
281	moveb	%d3,%d0			| temp >> 0
282	moveb	%a1@(%d0:w:4),%d1	| d1=$xxxxxx00
283	rorl	#8,%d1			| d1=$00xxxxxx
284	lsrl	#8,%d3			| temp >> 8
285	moveb	%d3,%d0
286	moveb	%a0@(%d0:w:4),%d1	| d1=$00xxxx11
287	rorl	#8,%d1			| d1=$1100xxxx
288	lsrl	#8,%d3			| temp >> 16
289	moveb	%d3,%d0
290	moveb	%a3@(%d0:w:4),%d1	| d1=$1100xx22
291	rorl	#8,%d1			| d1=$221100xx
292	lsrl	#8,%d3			| temp >> 24
293	moveb	%a2@(%d3:w:4),%d1	| d1=$22110033
294	rorl	#8,%d1			| d1=$33221100
295
296	eorl	%d1,%d4			| rk[12] ^= rk[4]
297	movel	%d4,%a5@+		| %d4 is rk[12]
298	eorl	%d4,%d5			| rk[13] = rk[5] ^ rk[12]
299	movel	%d5,%a5@+		| %d5 is rk[13]
300	eorl	%d5,%d6			| rk[14] = rk[6] ^ rk[13]
301	movel	%d6,%a5@+		| %d6 is rk[14]
302	eorl	%d6,%d7			| rk[15] = rk[7] ^ rk[14]
303	movel	%d7,%a5@+		| %d7 is rk[15]
304
305	| %d0: work -> rk[8]
306	| %d1: work -> rk[9]
307	| %d2: rk[10]
308	| %d3: work -> rk[11]
309	| %d4: rk[12]
310	| %d5: rk[13]
311	| %d6: rk[14]
312	| %d7: rk[15]
313	| %a5 = &rk[16]
314
315	moveml	%a5@(-8*4),%d0-%d1	| %d0..%d1 = rk[8..9]
316	movel	%a5@(-5*4),%d3		| %d3 = rk[11]
317
318.Lpek256_loop_start:
319	| %d0: rk[0]
320	| %d1: rk[1]
321	| %d2: rk[2]
322	| %d3: rk[3]
323	| %d4: rk[4]
324	| %d5: rk[5] -> work
325	| %d6: rk[6] -> work
326	| %d7: rk[7]
327	| %a5 = &rk[8]
328	|
329	| temp = rk[7]
330	| rk[8]  = (Te0[(temp      ) & 0xff] & 0x0000ff00);
331	| rk[8] |= (Te3[(temp >>  8) & 0xff] & 0x00ff0000);
332	| rk[8] |= (Te2[(temp >> 16) & 0xff] & 0xff000000);
333	| rk[8] ^= rcon[i];
334	| rk[8] |= (Te1[(temp >> 24)       ] & 0x000000ff);
335	| rk[8] ^= rk[ 0];
336
337	moveq	#0,%d5
338	moveb	%d7,%d5			| temp >> 0
339	moveb	%a0@(%d5:w:4),%d6	| d6=$xxxxxx00
340	rorl	#8,%d6			| d6=$00xxxxxx
341	lsrl	#8,%d7			| temp >> 8
342	moveb	%d7,%d5
343	moveb	%a3@(%d5:w:4),%d6	| d6=$00xxxx11
344	rorl	#8,%d6			| d6=$1100xxxx
345	lsrl	#8,%d7			| temp >> 16
346	moveb	%d7,%d5
347	moveb	%a2@(%d5:w:4),%d6	| d6=$1100xx22
348	moveb	%a4@+,%d5		| LSByte ^= rcon[i]
349	eorb	%d5,%d6
350	rorl	#8,%d6			| d6=$221100xx
351	lsrl	#8,%d7			| temp >> 24
352	moveb	%a1@(%d7:w:4),%d6	| d6=$22110033
353
354	eorl	%d6,%d0			| rk[8] ^= rk[0]
355	movel	%d0,%a5@+		| %d0 is rk[8]
356	eorl	%d0,%d1			| rk[9] = rk[1] ^ rk[8]
357	movel	%d1,%a5@+		| %d1 is rk[9]
358	eorl	%d1,%d2			| rk[10] = rk[2] ^ rk[9]
359	movel	%d2,%a5@+		| %d2 is rk[10]
360	eorl	%d2,%d3			| rk[11] = rk[3] ^ rk[10]
361	movel	%d3,%a5@+		| %d3 is rk[11]
362
363	| %d0: rk[8]
364	| %d1: rk[9]
365	| %d2: rk[10]
366	| %d3: rk[11]
367	| %d4: rk[4]
368	| %d5: work
369	| %d6: work
370	| %d7: work
371
372	cmpal	%a4,%a6
373	bne	.Lpek256_loop
374	bra	.Lpek_return0
375
376.Lpek_return1:
377	moveql	#-1,%d0
378	bra	.Lpek_return
379.Lpek_return2:
380	moveql	#-2,%d0
381	bra	.Lpek_return
382	.size	AES_set_encrypt_key, .-AES_set_encrypt_key
383
384
385| int
386| private_AES_set_decrypt_key(const unsigned char *userKey,
387|  const int bits,
388|  AES_KEY *key)
389	.global	AES_set_decrypt_key
390	.type	AES_set_decrypt_key, @function
391AES_set_decrypt_key:
392	moveml	%d2-%d7/%a2-%a6,%sp@-
393	moveal	%sp@(44+4),%a0		| userKey
394	moveal	%sp@(44+8),%a1		| bits
395	moveal	%sp@(44+12),%a3		| key
396
397	/* first, start with an encryption schedule */
398	movel	%a3,%sp@-
399	movel	%a1,%sp@-
400	movel	%a0,%sp@-
401	bsr	.Laes_set_encrypt_key
402	lea	%sp@(12),%sp
403	bmi	.Lpdk_return
404
405	/* invert the order of the round keys: */
406	lea	%a3@(rd_key),%a5	| %a5 := &rk[0]
407	movel	%a3@(rounds),%d4
408	lslw	#4,%d4
409	lea	%a5@(%d4),%a4		| %a4 := &rk[j]
410	moveal	%a4,%a6			| %a6 for the next loop
411.Lpdk_invert_loop:
412	movel	%a5@,%d0
413	movel	%a4@,%a5@+
414	movel	%d0,%a4@+
415
416	movel	%a5@,%d0
417	movel	%a4@,%a5@+
418	movel	%d0,%a4@+
419
420	movel	%a5@,%d0
421	movel	%a4@,%a5@+
422	movel	%d0,%a4@+
423
424	movel	%a5@,%d0
425	movel	%a4@,%a5@+
426	movel	%d0,%a4@
427
428	lea	%a4@(-28),%a4
429
430	cmpal	%a4,%a5
431	bcs	.Lpdk_invert_loop
432
433	/*
434	 * apply the inverse MixColumn transform to all round keys but
435	 * the first and the last:
436	 */
437	lea	%a3@(rd_key + 16),%a5	| rk += 4
438	lea	%pc@(Te1+3),%a4		| LSByte of Te1
439	lea	%pc@(Td0),%a0		| %a0 = Td0
440	lea	%a0@(256*4),%a1		| %a1 = Td1
441	lea	%a1@(256*4),%a2		| %a2 = Td2
442	lea	%a2@(256*4),%a3		| %a3 = Td3
443
444	| for (i = 1; i < key->rounds; i++)
445	moveq	#0,%d1
446.Lpdk_apply_loop:
447	| rk[0] =
448	|     Td3[Te1[(rk[0]      ) & 0xff] & 0xff] ^
449	|     Td2[Te1[(rk[0] >>  8) & 0xff] & 0xff] ^
450	|     Td1[Te1[(rk[0] >> 16) & 0xff] & 0xff] ^
451	|     Td0[Te1[(rk[0] >> 24)       ] & 0xff];
452	movel	%a5@,%d0
453	moveb	%d0,%d1			| rk[0] >>  0
454	moveb	%a4@(%d1:w:4),%d1	| Te1[]
455	movel	%a3@(%d1:w:4),%d2	| Td3[]
456	lsrl	#8,%d0
457	moveb	%d0,%d1			| rk[0] >>  8
458	moveb	%a4@(%d1:w:4),%d1	| Te1[]
459	movel	%a2@(%d1:w:4),%d3	| Td3[]
460	eorl	%d3,%d2
461	lsrl	#8,%d0
462	moveb	%d0,%d1			| rk[0] >> 16
463	moveb	%a4@(%d1:w:4),%d1	| Te1[]
464	movel	%a1@(%d1:w:4),%d3	| Td3[]
465	eorl	%d3,%d2
466	lsrl	#8,%d0			| rk[0] >> 24
467	moveb	%a4@(%d0:w:4),%d1	| Te1[]
468	movel	%a0@(%d1:w:4),%d3
469	eorl	%d3,%d2
470	movel	%d2,%a5@+		| -> rk[0]
471
472	cmpal	%a6,%a5
473	bcs	.Lpdk_apply_loop
474
475	moveql	#0,%d0
476.Lpdk_return:
477	moveml	%sp@+,%d2-%d7/%a2-%a6
478	rts
479	.size	AES_set_decrypt_key, .-AES_set_decrypt_key
480
481
482| void
483| AES_encrypt(const unsigned char *in,
484|  unsigned char *out,
485|  const AES_KEY *key)
486	.global AES_encrypt
487	.type	AES_encrypt, @function
488AES_encrypt:
489	| %a0  in,  Te0
490	| %a1  out, Te1
491	| %a2       Te2
492	| %a3  key, Te3
493	| %a4  loop end
494	| %a5  rk
495	moveml	%d2-%d7/%a2-%a5,%sp@-
496	moveal	%sp@(40+4),%a0		| in
497	moveal	%sp@(40+12),%a3		| key
498
499	lea	%a3@(rd_key),%a5
500	movel	%a3@(rounds),%d0
501
502	lslw	#4,%d0			| key->rounds * 16
503	lea	%a5@(0,%d0),%a4		| %a4 := %a5 + key->rounds * 16
504
505	movel	%a0@+,%d0
506	movel	%a5@+,%d5
507	eorl	%d5,%d0			| s0 = GETU32(in     ) ^ rk[0]
508
509	movel	%a0@+,%d1
510	movel	%a5@+,%d5
511	eorl	%d5,%d1			| s1 = GETU32(in +  4) ^ rk[1]
512
513	movel	%a0@+,%d2
514	movel	%a5@+,%d5
515	eorl	%d5,%d2			| s2 = GETU32(in +  8) ^ rk[2]
516
517	movel	%a0@+,%d3
518	movel	%a5@+,%d5
519	eorl	%d5,%d3			| s3 = GETU32(in + 12) ^ rk[3]
520
521	lea	%pc@(Te0),%a0		| %a0 = Te0
522	lea	%a0@(256*4),%a1		| %a1 = Te1
523	lea	%a1@(256*4),%a2		| %a2 = Te2
524	lea	%a2@(256*4),%a3		| %a3 = Te3
525
526	bra	.Lenc_loop_start
527
528.Lenc_loop:
529	| s1  = Te3[(t0      ) & 0xff];
530	| s2  = Te2[(t0 >>  8) & 0xff];
531	| s3  = Te1[(t0 >> 16) & 0xff];
532	| s0  = Te0[(t0 >> 24)       ];
533	|
534	| s2 ^= Te3[(t1      ) & 0xff];
535	| s3 ^= Te2[(t1 >>  8) & 0xff];
536	| s0 ^= Te1[(t1 >> 16) & 0xff];
537	| s1 ^= Te0[(t1 >> 24)       ];
538	|
539	| s3 ^= Te3[(t2      ) & 0xff];
540	| s0 ^= Te2[(t2 >>  8) & 0xff];
541	| s1 ^= Te1[(t2 >> 16) & 0xff];
542	| s2 ^= Te0[(t2 >> 24)       ];
543	|
544	| s0 ^= Te3[(t3      ) & 0xff];
545	| s1 ^= Te2[(t3 >>  8) & 0xff];
546	| s2 ^= Te1[(t3 >> 16) & 0xff];
547	| s3 ^= Te0[(t3 >> 24)       ];
548	|
549	| s0 ^= rk[0];
550	| s1 ^= rk[1];
551	| s2 ^= rk[2];
552	| s3 ^= rk[3];
553	|
554	| %d0..%d3: s0..s3
555	| %d4..%d7: t0..t3
556
557	moveq	#0,%d3
558	moveb	%d4,%d3
559	movel	%a3@(%d3:w:4),%d1
560	lsrl	#8,%d4
561	moveb	%d4,%d3
562	movel	%a2@(%d3:w:4),%d2
563	lsrl	#8,%d4
564	moveb	%d4,%d3
565	movel	%a1@(%d3:w:4),%d3
566	lsrl	#8,%d4
567	movel	%a0@(%d4:w:4),%d0
568
569	moveb	%d5,%d4
570	movel	%a3@(%d4:w:4),%d4
571	eorl	%d4,%d2
572	lsrl	#8,%d5
573	moveql	#0,%d4
574	moveb	%d5,%d4
575	movel	%a2@(%d4:w:4),%d4
576	eorl	%d4,%d3
577	lsrl	#8,%d5
578	moveql	#0,%d4
579	moveb	%d5,%d4
580	movel	%a1@(%d4:w:4),%d4
581	eorl	%d4,%d0
582	lsrl	#8,%d5
583	movel	%a0@(%d5:w:4),%d4
584	eorl	%d4,%d1
585
586	moveb	%d6,%d5
587	movel	%a3@(%d5:w:4),%d4
588	eorl	%d4,%d3
589	lsrl	#8,%d6
590	moveb	%d6,%d5
591	movel	%a2@(%d5:w:4),%d4
592	eorl	%d4,%d0
593	lsrl	#8,%d6
594	moveb	%d6,%d5
595	movel	%a1@(%d5:w:4),%d4
596	eorl	%d4,%d1
597	lsrl	#8,%d6
598	movel	%a0@(%d6:w:4),%d4
599	eorl	%d4,%d2
600
601	moveb	%d7,%d5
602	movel	%a3@(%d5:w:4),%d4
603	eorl	%d4,%d0
604	lsrl	#8,%d7
605	moveb	%d7,%d5
606	movel	%a2@(%d5:w:4),%d4
607	eorl	%d4,%d1
608	lsrl	#8,%d7
609	moveb	%d7,%d5
610	movel	%a1@(%d5:w:4),%d4
611	eorl	%d4,%d2
612	lsrl	#8,%d7
613	movel	%a0@(%d7:w:4),%d4
614	eorl	%d4,%d3
615
616	movel	%a5@+,%d4
617	eorl	%d4,%d0
618	movel	%a5@+,%d4
619	eorl	%d4,%d1
620	movel	%a5@+,%d4
621	eorl	%d4,%d2
622	movel	%a5@+,%d4
623	eorl	%d4,%d3
624
625.Lenc_loop_start:
626	| t1  = Te3[(s0      ) & 0xff];
627	| t2  = Te2[(s0 >>  8) & 0xff];
628	| t3  = Te1[(s0 >> 16) & 0xff];
629	| t0  = Te0[(s0 >> 24) & 0xff];
630	|
631	| t2 ^= Te3[(s1 >>  0) & 0xff];
632	| t3 ^= Te2[(s1 >>  8) & 0xff];
633	| t0 ^= Te1[(s1 >> 16) & 0xff];
634	| t1 ^= Te0[(s1 >> 24) & 0xff];
635	|
636	| t3 ^= Te3[(s2 >>  0) & 0xff];
637	| t0 ^= Te2[(s2 >>  8) & 0xff];
638	| t1 ^= Te1[(s2 >> 16) & 0xff];
639	| t2 ^= Te0[(s2 >> 24) & 0xff];
640	|
641	| t0 ^= Te3[(s3 >>  0) & 0xff];
642	| t1 ^= Te2[(s3 >>  8) & 0xff];
643	| t2 ^= Te1[(s3 >> 16) & 0xff];
644	| t3 ^= Te0[(s3 >> 24) & 0xff];
645	|
646	| t0 ^= rk[4];
647	| t1 ^= rk[5];
648	| t2 ^= rk[6];
649	| t3 ^= rk[7];
650	|
651	| %d0..%d3: s0..s3
652	| %d4..%d7: t0..t3
653
654	moveql	#0,%d7
655	moveb	%d0,%d7
656	movel	%a3@(%d7:w:4),%d5
657	lsrl	#8,%d0
658	moveb	%d0,%d7
659	movel	%a2@(%d7:w:4),%d6
660	lsrl	#8,%d0
661	moveb	%d0,%d7
662	movel	%a1@(%d7:w:4),%d7
663	lsrl	#8,%d0
664	movel	%a0@(%d0:w:4),%d4
665
666	moveb	%d1,%d0
667	movel	%a3@(%d0:w:4),%d0
668	eorl	%d0,%d6
669	lsrl	#8,%d1
670	moveql	#0,%d0
671	moveb	%d1,%d0
672	movel	%a2@(%d0:w:4),%d0
673	eorl	%d0,%d7
674	lsrl	#8,%d1
675	moveql	#0,%d0
676	moveb	%d1,%d0
677	movel	%a1@(%d0:w:4),%d0
678	eorl	%d0,%d4
679	lsrl	#8,%d1
680	movel	%a0@(%d1:w:4),%d0
681	eorl	%d0,%d5
682
683	moveb	%d2,%d1
684	movel	%a3@(%d1:w:4),%d0
685	eorl	%d0,%d7
686	lsrl	#8,%d2
687	moveb	%d2,%d1
688	movel	%a2@(%d1:w:4),%d0
689	eorl	%d0,%d4
690	lsrl	#8,%d2
691	moveb	%d2,%d1
692	movel	%a1@(%d1:w:4),%d0
693	eorl	%d0,%d5
694	lsrl	#8,%d2
695	movel	%a0@(%d2:w:4),%d0
696	eorl	%d0,%d6
697
698	moveb	%d3,%d1
699	movel	%a3@(%d1:w:4),%d0
700	eorl	%d0,%d4
701	lsrl	#8,%d3
702	moveb	%d3,%d1
703	movel	%a2@(%d1:w:4),%d0
704	eorl	%d0,%d5
705	lsrl	#8,%d3
706	moveb	%d3,%d1
707	movel	%a1@(%d1:w:4),%d0
708	eorl	%d0,%d6
709	lsrl	#8,%d3
710	movel	%a0@(%d3:w:4),%d0
711	eorl	%d0,%d7
712
713	movel	%a5@+,%d0
714	eorl	%d0,%d4
715	movel	%a5@+,%d0
716	eorl	%d0,%d5
717	movel	%a5@+,%d0
718	eorl	%d0,%d6
719	movel	%a5@+,%d0
720	eorl	%d0,%d7
721
722	cmpal	%a5,%a4
723	bne	.Lenc_loop		| if (--r == 0) break;
724.Lenc_last:
725	/*
726	 * apply last round and
727	 * map cipher state to byte array block:
728	 */
729	moveal	%sp@(40+8),%a4		| out
730	addql	#2,%a0			| Te0 += 2
731	addql	#3,%a1			| Te1 += 3
732	addql	#1,%a3			| Te3 += 1
733					| Te2 += 0
734
735	| s1  = (Te1[(t0      ) & 0xff] & 0x000000ff);
736	| s2  = (Te0[(t0 >>  8) & 0xff] & 0x0000ff00);
737	| s3  = (Te3[(t0 >> 16) & 0xff] & 0x00ff0000);
738	| s0  = (Te2[(t0 >> 24)       ] & 0xff000000);
739	|
740	| s2 |= (Te1[(t1      ) & 0xff] & 0x000000ff);
741	| s3 |= (Te0[(t1 >>  8) & 0xff] & 0x0000ff00);
742	| s0 |= (Te3[(t1 >> 16) & 0xff] & 0x00ff0000);
743	| s1 |= (Te2[(t1 >> 24)       ] & 0xff000000);
744	|
745	| s3 |= (Te1[(t2      ) & 0xff] & 0x000000ff);
746	| s0 |= (Te0[(t2 >>  8) & 0xff] & 0x0000ff00);
747	| s1 |= (Te3[(t2 >> 16) & 0xff] & 0x00ff0000);
748	| s2 |= (Te2[(t2 >> 24)       ] & 0xff000000);
749	|
750	| s0 |= (Te1[(t3      ) & 0xff] & 0x000000ff);
751	| s1 |= (Te0[(t3 >>  8) & 0xff] & 0x0000ff00);
752	| s2 |= (Te3[(t3 >> 16) & 0xff] & 0x00ff0000);
753	| s3 |= (Te2[(t3 >> 24)       ] & 0xff000000);
754
755	moveql	#0,%d0
756	moveb	%d4,%d0			| t0 >> 0
757	moveb	%a1@(%d0:w:4),%d1	| d1=$xxxxxx00
758	lsrl	#8,%d4			| t0 >> 8
759	lsll	#8,%d1			| d1=$xxxx00xx
760	moveb	%d4,%d0
761	moveb	%a0@(%d0:w:4),%d2	| d2=$xxxxxx00
762	lsrl	#8,%d4			| t0 >> 16
763	lsll	#8,%d2			| d2=$xxxx00xx
764	moveb	%d4,%d0
765	moveb	%a3@(%d0:w:4),%d3	| d3=$xxxxxx00
766	lsrl	#8,%d4			| t0 >> 24
767	lsll	#8,%d3			| d3=$xxxx00xx
768	moveb	%a2@(%d4:w:4),%d0	| d0=$xxxxxx00
769	lsll	#8,%d0			| d0=$xxxx00xx
770
771	moveb	%d5,%d4			| t1 >> 0
772	moveb	%a1@(%d4:w:4),%d2	| d2=$xxxx0011
773	lsrl	#8,%d5			| t1 >> 8
774	lsll	#8,%d2			| d2=$xx0011xx
775	moveb	%d5,%d4
776	moveb	%a0@(%d4:w:4),%d3	| d3=$xxxx0011
777	lsrl	#8,%d5			| t1 >> 16
778	lsll	#8,%d3			| d3=$xx0011xx
779	moveb	%d5,%d4
780	moveb	%a3@(%d4:w:4),%d0	| d0=$xxxx0011
781	lsrl	#8,%d5			| t1 >> 24
782	lsll	#8,%d0			| d0=$xx0011xx
783	moveb	%a1@(%d5:w:4),%d1	| d1=$xxxx0011
784	lsll	#8,%d1			| d1=$xx0011xx
785
786	moveb	%d6,%d4			| t2 >> 0
787	moveb	%a1@(%d4:w:4),%d3	| d3=$xx001122
788	lsrl	#8,%d6			| t2 >> 8
789	lsll	#8,%d3			| d3=$001122xx
790	moveb	%d6,%d4
791	moveb	%a0@(%d4:w:4),%d0	| d0=$xx001122
792	lsrl	#8,%d6			| t2 >> 16
793	lsll	#8,%d0			| d0=$001122xx
794	moveb	%d6,%d4
795	moveb	%a3@(%d4:w:4),%d1	| d1=$xx001122
796	lsrl	#8,%d6			| t2 >> 24
797	lsll	#8,%d1			| d1=$001122xx
798	moveb	%a2@(%d6:w:4),%d2	| d2=$xx001122
799	lsll	#8,%d2			| d2=$001122xx
800
801	moveb	%d7,%d4			| t3 >> 0
802	moveb	%a1@(%d4:w:4),%d0	| d0=$00112233
803	lsrl	#8,%d7			| t3 >> 8
804	moveb	%d7,%d4
805	moveb	%a0@(%d4:w:4),%d1	| d1=$00112233
806	lsrl	#8,%d7			| t3 >> 16
807	roll	#8,%d1			| d1=$11223300
808	moveb	%d7,%d4
809	moveb	%a3@(%d4:w:4),%d2	| d2=$00112233
810	lsrl	#8,%d7			| t3 >> 24
811	swap	%d2			| d2=$22330011
812	moveb	%a2@(%d7:w:4),%d3	| d3=$00112233
813	rorl	#8,%d3			| d3=$33001122
814
815	movel	%a5@+,%d4
816	eorl	%d4,%d0			| s0 ^= rk[0]
817	movel	%a5@+,%d4
818	eorl	%d4,%d1			| s1 ^= rk[1]
819	movel	%a5@+,%d4
820	eorl	%d4,%d2			| s2 ^= rk[2]
821	movel	%a5@+,%d4
822	eorl	%d4,%d3			| s3 ^= rk[3]
823
824	movel	%d0,%a4@+		| PUTU32(out     , s0);
825	movel	%d1,%a4@+		| PUTU32(out +  4, s1);
826	movel	%d2,%a4@+		| PUTU32(out +  8, s2);
827	movel	%d3,%a4@		| PUTU32(out + 12, s3);
828
829	moveml	%sp@+,%d2-%d7/%a2-%a5
830	rts
831	.size	AES_encrypt, .-AES_encrypt
832
833| void
834| AES_decrypt(const unsigned char *in,
835|  unsigned char *out,
836|  const AES_KEY *key)
837	.global	AES_decrypt
838	.type	AES_decrypt, @function
839AES_decrypt:
840	| %a0  in,  Td0
841	| %a1  out, Td1
842	| %a2       Td2
843	| %a3  key, Td3
844	| %a4  loop end, Td4
845	| %a5  rk
846	moveml	%d2-%d7/%a2-%a5,%sp@-
847	moveal	%sp@(40+4),%a0		| in
848	moveal	%sp@(40+12),%a3		| key
849
850	lea	%a3@(rd_key),%a5
851	movel	%a3@(rounds),%d0
852
853	lslw	#4,%d0			| key->rounds * 16
854	lea	%a5@(0,%d0),%a4		| %a4 := %a5 + key->rounds * 16
855
856	movel	%a0@+,%d0
857	movel	%a5@+,%d5
858	eorl	%d5,%d0			| s0 = GETU32(in     ) ^ rk[0]
859
860	movel	%a0@+,%d1
861	movel	%a5@+,%d5
862	eorl	%d5,%d1			| s1 = GETU32(in +  4) ^ rk[1]
863
864	movel	%a0@+,%d2
865	movel	%a5@+,%d5
866	eorl	%d5,%d2			| s2 = GETU32(in +  8) ^ rk[2]
867
868	movel	%a0@+,%d3
869	movel	%a5@+,%d5
870	eorl	%d5,%d3			| s3 = GETU32(in + 12) ^ rk[3]
871
872	lea	%pc@(Td0),%a0		| %a0 = Td0
873	lea	%a0@(256*4),%a1		| %a1 = Td1
874	lea	%a1@(256*4),%a2		| %a2 = Td2
875	lea	%a2@(256*4),%a3		| %a3 = Td3
876
877	bra	.Ldec_loop_start
878
879.Ldec_loop:
880	| s3  = Td3[(t0      ) & 0xff];
881	| s2  = Td2[(t0 >>  8) & 0xff];
882	| s1  = Td1[(t0 >> 16) & 0xff];
883	| s0  = Td0[(t0 >> 24)       ];
884	|
885	| s0 ^= Td3[(t1      ) & 0xff];
886	| s3 ^= Td2[(t1 >>  8) & 0xff];
887	| s2 ^= Td1[(t1 >> 16) & 0xff];
888	| s1 ^= Td0[(t1 >> 24)       ];
889	|
890	| s1 ^= Td3[(t2      ) & 0xff];
891	| s0 ^= Td2[(t2 >>  8) & 0xff];
892	| s3 ^= Td1[(t2 >> 16) & 0xff];
893	| s2 ^= Td0[(t2 >> 24)       ];
894	|
895	| s2 ^= Td3[(t3      ) & 0xff];
896	| s1 ^= Td2[(t3 >>  8) & 0xff];
897	| s0 ^= Td1[(t3 >> 16) & 0xff];
898	| s3 ^= Td0[(t3 >> 24)       ];
899	|
900	| s0 ^= rk[0];
901	| s1 ^= rk[1];
902	| s2 ^= rk[2];
903	| s3 ^= rk[3];
904	|
905	| %d0..%d3: s0..s3
906	| %d4..%d7: t0..t3
907
908	moveq	#0,%d1
909	moveb	%d4,%d1
910	movel	%a3@(%d1:w:4),%d3
911	lsrl	#8,%d4
912	moveb	%d4,%d1
913	movel	%a2@(%d1:w:4),%d2
914	lsrl	#8,%d4
915	moveb	%d4,%d1
916	movel	%a1@(%d1:w:4),%d1
917	lsrl	#8,%d4
918	movel	%a0@(%d4:w:4),%d0
919
920	moveb	%d5,%d4
921	movel	%a3@(%d4:w:4),%d4
922	eorl	%d4,%d0
923	lsrl	#8,%d5
924	moveql	#0,%d4
925	moveb	%d5,%d4
926	movel	%a2@(%d4:w:4),%d4
927	eorl	%d4,%d3
928	lsrl	#8,%d5
929	moveql	#0,%d4
930	moveb	%d5,%d4
931	movel	%a1@(%d4:w:4),%d4
932	eorl	%d4,%d2
933	lsrl	#8,%d5
934	movel	%a0@(%d5:w:4),%d4
935	eorl	%d4,%d1
936
937	moveb	%d6,%d5
938	movel	%a3@(%d5:w:4),%d4
939	eorl	%d4,%d1
940	lsrl	#8,%d6
941	moveb	%d6,%d5
942	movel	%a2@(%d5:w:4),%d4
943	eorl	%d4,%d0
944	lsrl	#8,%d6
945	moveb	%d6,%d5
946	movel	%a1@(%d5:w:4),%d4
947	eorl	%d4,%d3
948	lsrl	#8,%d6
949	movel	%a0@(%d6:w:4),%d4
950	eorl	%d4,%d2
951
952	moveb	%d7,%d5
953	movel	%a3@(%d5:w:4),%d4
954	eorl	%d4,%d2
955	lsrl	#8,%d7
956	moveb	%d7,%d5
957	movel	%a2@(%d5:w:4),%d4
958	eorl	%d4,%d1
959	lsrl	#8,%d7
960	moveb	%d7,%d5
961	movel	%a1@(%d5:w:4),%d4
962	eorl	%d4,%d0
963	lsrl	#8,%d7
964	movel	%a0@(%d7:w:4),%d4
965	eorl	%d4,%d3
966
967	movel	%a5@+,%d4
968	eorl	%d4,%d0
969	movel	%a5@+,%d4
970	eorl	%d4,%d1
971	movel	%a5@+,%d4
972	eorl	%d4,%d2
973	movel	%a5@+,%d4
974	eorl	%d4,%d3
975
976.Ldec_loop_start:
977	| t3  = Td3[(s0      ) & 0xff];
978	| t2  = Td2[(s0 >>  8) & 0xff];
979	| t1  = Td1[(s0 >> 16) & 0xff];
980	| t0  = Td0[(s0 >> 24) & 0xff];
981	|
982	| t0 ^= Td3[(s1 >>  0) & 0xff];
983	| t3 ^= Td2[(s1 >>  8) & 0xff];
984	| t2 ^= Td1[(s1 >> 16) & 0xff];
985	| t1 ^= Td0[(s1 >> 24) & 0xff];
986	|
987	| t1 ^= Td3[(s2 >>  0) & 0xff];
988	| t0 ^= Td2[(s2 >>  8) & 0xff];
989	| t3 ^= Td1[(s2 >> 16) & 0xff];
990	| t2 ^= Td0[(s2 >> 24) & 0xff];
991	|
992	| t2 ^= Td3[(s3 >>  0) & 0xff];
993	| t1 ^= Td2[(s3 >>  8) & 0xff];
994	| t0 ^= Td1[(s3 >> 16) & 0xff];
995	| t3 ^= Td0[(s3 >> 24) & 0xff];
996	|
997	| t0 ^= rk[4];
998	| t1 ^= rk[5];
999	| t2 ^= rk[6];
1000	| t3 ^= rk[7];
1001	|
1002	| %d0..%d3: s0..s3
1003	| %d4..%d7: t0..t3
1004
1005	moveql	#0,%d5
1006	moveb	%d0,%d5
1007	movel	%a3@(%d5:w:4),%d7
1008	lsrl	#8,%d0
1009	moveb	%d0,%d5
1010	movel	%a2@(%d5:w:4),%d6
1011	lsrl	#8,%d0
1012	moveb	%d0,%d5
1013	movel	%a1@(%d5:w:4),%d5
1014	lsrl	#8,%d0
1015	movel	%a0@(%d0:w:4),%d4
1016
1017	moveb	%d1,%d0
1018	movel	%a3@(%d0:w:4),%d0
1019	eorl	%d0,%d4
1020	lsrl	#8,%d1
1021	moveql	#0,%d0
1022	moveb	%d1,%d0
1023	movel	%a2@(%d0:w:4),%d0
1024	eorl	%d0,%d7
1025	lsrl	#8,%d1
1026	moveql	#0,%d0
1027	moveb	%d1,%d0
1028	movel	%a1@(%d0:w:4),%d0
1029	eorl	%d0,%d6
1030	lsrl	#8,%d1
1031	movel	%a0@(%d1:w:4),%d0
1032	eorl	%d0,%d5
1033
1034	moveb	%d2,%d1
1035	movel	%a3@(%d1:w:4),%d0
1036	eorl	%d0,%d5
1037	lsrl	#8,%d2
1038	moveb	%d2,%d1
1039	movel	%a2@(%d1:w:4),%d0
1040	eorl	%d0,%d4
1041	lsrl	#8,%d2
1042	moveb	%d2,%d1
1043	movel	%a1@(%d1:w:4),%d0
1044	eorl	%d0,%d7
1045	lsrl	#8,%d2
1046	movel	%a0@(%d2:w:4),%d0
1047	eorl	%d0,%d6
1048
1049	moveb	%d3,%d1
1050	movel	%a3@(%d1:w:4),%d0
1051	eorl	%d0,%d6
1052	lsrl	#8,%d3
1053	moveb	%d3,%d1
1054	movel	%a2@(%d1:w:4),%d0
1055	eorl	%d0,%d5
1056	lsrl	#8,%d3
1057	moveb	%d3,%d1
1058	movel	%a1@(%d1:w:4),%d0
1059	eorl	%d0,%d4
1060	lsrl	#8,%d3
1061	movel	%a0@(%d3:w:4),%d0
1062	eorl	%d0,%d7
1063
1064	movel	%a5@+,%d0
1065	eorl	%d0,%d4
1066	movel	%a5@+,%d0
1067	eorl	%d0,%d5
1068	movel	%a5@+,%d0
1069	eorl	%d0,%d6
1070	movel	%a5@+,%d0
1071	eorl	%d0,%d7
1072
1073	cmpal	%a5,%a4
1074	bne	.Ldec_loop		| if (--r == 0) break;
1075
1076	/*
1077	 * apply last round and
1078	 * map cipher state to byte array block:
1079	 */
1080	| s3  = ((u32)Td4[(t0 >>  0) & 0xff] <<  0);
1081	| s2  = ((u32)Td4[(t0 >>  8) & 0xff] <<  8);
1082	| s1  = ((u32)Td4[(t0 >> 16) & 0xff] << 16);
1083	| s0  = ((u32)Td4[(t0 >> 24) & 0xff] << 24);
1084	|
1085	| s0 |= ((u32)Td4[(t1 >>  0) & 0xff] <<  0);
1086	| s3 |= ((u32)Td4[(t1 >>  8) & 0xff] <<  8);
1087	| s2 |= ((u32)Td4[(t1 >> 16) & 0xff] << 16);
1088	| s1 |= ((u32)Td4[(t1 >> 24) & 0xff] << 24);
1089	|
1090	| s1 |= ((u32)Td4[(t2 >>  0) & 0xff] <<  0);
1091	| s0 |= ((u32)Td4[(t2 >>  8) & 0xff] <<  8);
1092	| s3 |= ((u32)Td4[(t2 >> 16) & 0xff] << 16);
1093	| s2 |= ((u32)Td4[(t2 >> 24) & 0xff] << 24);
1094	|
1095	| s2 |= ((u32)Td4[(t3 >>  0) & 0xff] <<  0);
1096	| s1 |= ((u32)Td4[(t3 >>  8) & 0xff] <<  8);
1097	| s0 |= ((u32)Td4[(t3 >> 16) & 0xff] << 16);
1098	| s3 |= ((u32)Td4[(t3 >> 24) & 0xff] << 24);
1099	|
1100	| s0 ^= rk[0];
1101	| PUTU32(out     , s0);
1102	| s1 ^= rk[1];
1103	| PUTU32(out +  4, s1);
1104	| s2 ^= rk[2];
1105	| PUTU32(out +  8, s2);
1106	| s3 ^= rk[3];
1107	| PUTU32(out + 12, s3);
1108	|
1109	| %d4..%d7: t0..t3
1110	| %d0..%d3: s0..s3
1111
1112	lea	%pc@(Td4),%a4
1113	moveq	#0,%d0
1114	moveb	%d4,%d0
1115	moveb	%a4@(%d0),%d3
1116	rorl	#8,%d3
1117	lsrl	#8,%d4
1118	moveb	%d4,%d0
1119	moveb	%a4@(%d0),%d2
1120	rorl	#8,%d2
1121	lsrl	#8,%d4
1122	moveb	%d4,%d0
1123	moveb	%a4@(%d0),%d1
1124	rorl	#8,%d1
1125	lsrl	#8,%d4
1126	moveb	%a4@(%d4),%d0
1127	rorl	#8,%d0
1128
1129	moveb	%d5,%d4
1130	moveb	%a4@(%d4),%d0
1131	rorl	#8,%d0
1132	lsrl	#8,%d5
1133	moveb	%d5,%d4
1134	moveb	%a4@(%d4),%d3
1135	rorl	#8,%d3
1136	lsrl	#8,%d5
1137	moveb	%d5,%d4
1138	moveb	%a4@(%d4),%d2
1139	rorl	#8,%d2
1140	lsrl	#8,%d5
1141	moveb	%a4@(%d5),%d1
1142	rorl	#8,%d1
1143
1144	moveb	%d6,%d4
1145	moveb	%a4@(%d4),%d1
1146	rorl	#8,%d1			| d1=$221100xx
1147	lsrl	#8,%d6
1148	moveb	%d6,%d4
1149	moveb	%a4@(%d4),%d0
1150	rorl	#8,%d0			| d0=$221100xx
1151	lsrl	#8,%d6
1152	moveb	%d6,%d4
1153	moveb	%a4@(%d4),%d3
1154	rorl	#8,%d3			| d3=$221100xx
1155	lsrl	#8,%d6
1156	moveb	%a4@(%d6),%d2
1157	rorl	#8,%d2			| d2=$221100xx
1158
1159	moveb	%d7,%d4
1160	moveb	%a4@(%d4),%d2		| d2=$22110033
1161	lsrl	#8,%d7
1162	moveb	%d7,%d4
1163	moveb	%a4@(%d4),%d1		| d1=$22110033
1164	roll	#8,%d1			| d1=$11003322
1165	lsrl	#8,%d7
1166	moveb	%d7,%d4
1167	moveb	%a4@(%d4),%d0		| d0=$22110033
1168	swap	%d0			| d0=$00332211
1169	lsrl	#8,%d7
1170	moveb	%a4@(%d7),%d3		| d3=$22110033
1171	rorl	#8,%d3			| d3=$33221100
1172
1173	moveal	%sp@(40+8),%a4		| out
1174
1175	movel	%a5@+,%d4
1176	eorl	%d4,%d0
1177	movel	%d0,%a4@+
1178
1179	movel	%a5@+,%d4
1180	eorl	%d4,%d1
1181	movel	%d1,%a4@+
1182
1183	movel	%a5@+,%d4
1184	eorl	%d4,%d2
1185	movel	%d2,%a4@+
1186
1187	movel	%a5@+,%d4
1188	eorl	%d4,%d3
1189	movel	%d3,%a4@
1190
1191	moveml	%sp@+,%d2-%d7/%a2-%a5
1192	rts
1193	.size	AES_decrypt, .-AES_decrypt
1194
1195	.data
1196	.balign	4
1197Te0:
1198	.long	0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d
1199	.long	0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554
1200	.long	0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d
1201	.long	0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a
1202	.long	0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87
1203	.long	0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b
1204	.long	0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea
1205	.long	0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b
1206	.long	0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a
1207	.long	0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f
1208	.long	0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108
1209	.long	0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f
1210	.long	0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e
1211	.long	0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5
1212	.long	0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d
1213	.long	0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f
1214	.long	0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e
1215	.long	0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb
1216	.long	0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce
1217	.long	0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497
1218	.long	0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c
1219	.long	0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed
1220	.long	0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b
1221	.long	0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a
1222	.long	0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16
1223	.long	0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594
1224	.long	0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81
1225	.long	0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3
1226	.long	0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a
1227	.long	0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504
1228	.long	0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163
1229	.long	0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d
1230	.long	0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f
1231	.long	0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739
1232	.long	0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47
1233	.long	0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395
1234	.long	0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f
1235	.long	0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883
1236	.long	0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c
1237	.long	0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76
1238	.long	0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e
1239	.long	0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4
1240	.long	0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6
1241	.long	0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b
1242	.long	0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7
1243	.long	0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0
1244	.long	0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25
1245	.long	0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818
1246	.long	0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72
1247	.long	0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651
1248	.long	0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21
1249	.long	0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85
1250	.long	0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa
1251	.long	0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12
1252	.long	0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0
1253	.long	0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9
1254	.long	0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133
1255	.long	0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7
1256	.long	0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920
1257	.long	0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a
1258	.long	0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17
1259	.long	0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8
1260	.long	0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11
1261	.long	0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a
1262Te1:
1263	.long	0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b
1264	.long	0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5
1265	.long	0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b
1266	.long	0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676
1267	.long	0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d
1268	.long	0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0
1269	.long	0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf
1270	.long	0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0
1271	.long	0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626
1272	.long	0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc
1273	.long	0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1
1274	.long	0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515
1275	.long	0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3
1276	.long	0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a
1277	.long	0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2
1278	.long	0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575
1279	.long	0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a
1280	.long	0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0
1281	.long	0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3
1282	.long	0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484
1283	.long	0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded
1284	.long	0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b
1285	.long	0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939
1286	.long	0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf
1287	.long	0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb
1288	.long	0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585
1289	.long	0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f
1290	.long	0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8
1291	.long	0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f
1292	.long	0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5
1293	.long	0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121
1294	.long	0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2
1295	.long	0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec
1296	.long	0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717
1297	.long	0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d
1298	.long	0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373
1299	.long	0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc
1300	.long	0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888
1301	.long	0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414
1302	.long	0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb
1303	.long	0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a
1304	.long	0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c
1305	.long	0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262
1306	.long	0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979
1307	.long	0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d
1308	.long	0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9
1309	.long	0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea
1310	.long	0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808
1311	.long	0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e
1312	.long	0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6
1313	.long	0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f
1314	.long	0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a
1315	.long	0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666
1316	.long	0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e
1317	.long	0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9
1318	.long	0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e
1319	.long	0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111
1320	.long	0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494
1321	.long	0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9
1322	.long	0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf
1323	.long	0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d
1324	.long	0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868
1325	.long	0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f
1326	.long	0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616
1327Te2:
1328	.long	0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b
1329	.long	0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5
1330	.long	0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b
1331	.long	0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76
1332	.long	0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d
1333	.long	0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0
1334	.long	0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af
1335	.long	0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0
1336	.long	0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26
1337	.long	0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc
1338	.long	0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1
1339	.long	0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15
1340	.long	0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3
1341	.long	0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a
1342	.long	0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2
1343	.long	0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75
1344	.long	0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a
1345	.long	0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0
1346	.long	0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3
1347	.long	0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384
1348	.long	0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed
1349	.long	0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b
1350	.long	0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239
1351	.long	0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf
1352	.long	0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb
1353	.long	0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185
1354	.long	0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f
1355	.long	0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8
1356	.long	0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f
1357	.long	0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5
1358	.long	0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221
1359	.long	0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2
1360	.long	0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec
1361	.long	0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17
1362	.long	0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d
1363	.long	0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673
1364	.long	0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc
1365	.long	0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88
1366	.long	0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814
1367	.long	0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb
1368	.long	0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a
1369	.long	0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c
1370	.long	0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462
1371	.long	0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279
1372	.long	0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d
1373	.long	0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9
1374	.long	0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea
1375	.long	0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008
1376	.long	0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e
1377	.long	0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6
1378	.long	0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f
1379	.long	0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a
1380	.long	0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66
1381	.long	0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e
1382	.long	0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9
1383	.long	0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e
1384	.long	0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211
1385	.long	0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394
1386	.long	0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9
1387	.long	0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df
1388	.long	0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d
1389	.long	0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068
1390	.long	0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f
1391	.long	0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16
1392Te3:
1393	.long	0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6
1394	.long	0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491
1395	.long	0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56
1396	.long	0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec
1397	.long	0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa
1398	.long	0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb
1399	.long	0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45
1400	.long	0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b
1401	.long	0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c
1402	.long	0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83
1403	.long	0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9
1404	.long	0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a
1405	.long	0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d
1406	.long	0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f
1407	.long	0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf
1408	.long	0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea
1409	.long	0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34
1410	.long	0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b
1411	.long	0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d
1412	.long	0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713
1413	.long	0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1
1414	.long	0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6
1415	.long	0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72
1416	.long	0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85
1417	.long	0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed
1418	.long	0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411
1419	.long	0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe
1420	.long	0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b
1421	.long	0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05
1422	.long	0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1
1423	.long	0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342
1424	.long	0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf
1425	.long	0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3
1426	.long	0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e
1427	.long	0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a
1428	.long	0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6
1429	.long	0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3
1430	.long	0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b
1431	.long	0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28
1432	.long	0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad
1433	.long	0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14
1434	.long	0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8
1435	.long	0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4
1436	.long	0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2
1437	.long	0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da
1438	.long	0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049
1439	.long	0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf
1440	.long	0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810
1441	.long	0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c
1442	.long	0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197
1443	.long	0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e
1444	.long	0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f
1445	.long	0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc
1446	.long	0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c
1447	.long	0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069
1448	.long	0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927
1449	.long	0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322
1450	.long	0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733
1451	.long	0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9
1452	.long	0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5
1453	.long	0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a
1454	.long	0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0
1455	.long	0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e
1456	.long	0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c
1457
1458Td0:
1459	.long	0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96
1460	.long	0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393
1461	.long	0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25
1462	.long	0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f
1463	.long	0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1
1464	.long	0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6
1465	.long	0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da
1466	.long	0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844
1467	.long	0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd
1468	.long	0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4
1469	.long	0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45
1470	.long	0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94
1471	.long	0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7
1472	.long	0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a
1473	.long	0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5
1474	.long	0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c
1475	.long	0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1
1476	.long	0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a
1477	.long	0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75
1478	.long	0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051
1479	.long	0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46
1480	.long	0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff
1481	.long	0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77
1482	.long	0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb
1483	.long	0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000
1484	.long	0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e
1485	.long	0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927
1486	.long	0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a
1487	.long	0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e
1488	.long	0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16
1489	.long	0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d
1490	.long	0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8
1491	.long	0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd
1492	.long	0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34
1493	.long	0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163
1494	.long	0xd731dcca, 0x42638510, 0x13972240, 0x84c61120
1495	.long	0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d
1496	.long	0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0
1497	.long	0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422
1498	.long	0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef
1499	.long	0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36
1500	.long	0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4
1501	.long	0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662
1502	.long	0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5
1503	.long	0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3
1504	.long	0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b
1505	.long	0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8
1506	.long	0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6
1507	.long	0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6
1508	.long	0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0
1509	.long	0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815
1510	.long	0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f
1511	.long	0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df
1512	.long	0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f
1513	.long	0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e
1514	.long	0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713
1515	.long	0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89
1516	.long	0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c
1517	.long	0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf
1518	.long	0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86
1519	.long	0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f
1520	.long	0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541
1521	.long	0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190
1522	.long	0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742
1523Td1:
1524	.long	0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e
1525	.long	0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303
1526	.long	0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c
1527	.long	0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3
1528	.long	0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0
1529	.long	0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9
1530	.long	0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259
1531	.long	0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8
1532	.long	0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971
1533	.long	0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a
1534	.long	0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f
1535	.long	0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b
1536	.long	0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8
1537	.long	0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab
1538	.long	0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708
1539	.long	0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682
1540	.long	0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2
1541	.long	0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe
1542	.long	0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb
1543	.long	0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10
1544	.long	0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd
1545	.long	0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015
1546	.long	0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e
1547	.long	0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee
1548	.long	0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000
1549	.long	0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72
1550	.long	0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39
1551	.long	0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e
1552	.long	0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91
1553	.long	0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a
1554	.long	0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17
1555	.long	0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9
1556	.long	0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60
1557	.long	0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e
1558	.long	0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1
1559	.long	0xcad731dc, 0x10426385, 0x40139722, 0x2084c611
1560	.long	0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1
1561	.long	0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3
1562	.long	0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964
1563	.long	0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390
1564	.long	0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b
1565	.long	0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf
1566	.long	0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46
1567	.long	0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af
1568	.long	0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512
1569	.long	0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb
1570	.long	0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a
1571	.long	0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8
1572	.long	0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c
1573	.long	0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266
1574	.long	0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8
1575	.long	0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6
1576	.long	0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604
1577	.long	0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551
1578	.long	0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41
1579	.long	0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647
1580	.long	0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c
1581	.long	0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1
1582	.long	0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737
1583	.long	0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db
1584	.long	0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340
1585	.long	0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95
1586	.long	0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1
1587	.long	0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857
1588Td2:
1589	.long	0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27
1590	.long	0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3
1591	.long	0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502
1592	.long	0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562
1593	.long	0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe
1594	.long	0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3
1595	.long	0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552
1596	.long	0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9
1597	.long	0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9
1598	.long	0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce
1599	.long	0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253
1600	.long	0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908
1601	.long	0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b
1602	.long	0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655
1603	.long	0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337
1604	.long	0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16
1605	.long	0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69
1606	.long	0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6
1607	.long	0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6
1608	.long	0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e
1609	.long	0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6
1610	.long	0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050
1611	.long	0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9
1612	.long	0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8
1613	.long	0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000
1614	.long	0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a
1615	.long	0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d
1616	.long	0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436
1617	.long	0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b
1618	.long	0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12
1619	.long	0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b
1620	.long	0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e
1621	.long	0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f
1622	.long	0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb
1623	.long	0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4
1624	.long	0xdccad731, 0x85104263, 0x22401397, 0x112084c6
1625	.long	0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729
1626	.long	0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1
1627	.long	0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9
1628	.long	0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233
1629	.long	0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4
1630	.long	0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad
1631	.long	0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e
1632	.long	0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3
1633	.long	0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25
1634	.long	0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b
1635	.long	0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f
1636	.long	0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15
1637	.long	0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0
1638	.long	0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2
1639	.long	0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7
1640	.long	0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791
1641	.long	0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496
1642	.long	0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665
1643	.long	0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b
1644	.long	0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6
1645	.long	0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13
1646	.long	0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47
1647	.long	0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7
1648	.long	0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844
1649	.long	0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3
1650	.long	0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d
1651	.long	0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456
1652	.long	0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8
1653Td3:
1654	.long	0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a
1655	.long	0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b
1656	.long	0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5
1657	.long	0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5
1658	.long	0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d
1659	.long	0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b
1660	.long	0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95
1661	.long	0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e
1662	.long	0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27
1663	.long	0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d
1664	.long	0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562
1665	.long	0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9
1666	.long	0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752
1667	.long	0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66
1668	.long	0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3
1669	.long	0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced
1670	.long	0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e
1671	.long	0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4
1672	.long	0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4
1673	.long	0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd
1674	.long	0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d
1675	.long	0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60
1676	.long	0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767
1677	.long	0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79
1678	.long	0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000
1679	.long	0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c
1680	.long	0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736
1681	.long	0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24
1682	.long	0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b
1683	.long	0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c
1684	.long	0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12
1685	.long	0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814
1686	.long	0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3
1687	.long	0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b
1688	.long	0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8
1689	.long	0x31dccad7, 0x63851042, 0x97224013, 0xc6112084
1690	.long	0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7
1691	.long	0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077
1692	.long	0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247
1693	.long	0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22
1694	.long	0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698
1695	.long	0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f
1696	.long	0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254
1697	.long	0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582
1698	.long	0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf
1699	.long	0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb
1700	.long	0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883
1701	.long	0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef
1702	.long	0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629
1703	.long	0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035
1704	.long	0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533
1705	.long	0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17
1706	.long	0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4
1707	.long	0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46
1708	.long	0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb
1709	.long	0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d
1710	.long	0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb
1711	.long	0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a
1712	.long	0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73
1713	.long	0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678
1714	.long	0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2
1715	.long	0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff
1716	.long	0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064
1717	.long	0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0
1718Td4:
1719	.byte	0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38
1720	.byte	0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb
1721	.byte	0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87
1722	.byte	0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb
1723	.byte	0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d
1724	.byte	0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e
1725	.byte	0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2
1726	.byte	0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25
1727	.byte	0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16
1728	.byte	0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92
1729	.byte	0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda
1730	.byte	0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84
1731	.byte	0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a
1732	.byte	0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06
1733	.byte	0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02
1734	.byte	0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b
1735	.byte	0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea
1736	.byte	0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73
1737	.byte	0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85
1738	.byte	0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e
1739	.byte	0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89
1740	.byte	0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b
1741	.byte	0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20
1742	.byte	0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4
1743	.byte	0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31
1744	.byte	0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f
1745	.byte	0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d
1746	.byte	0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef
1747	.byte	0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0
1748	.byte	0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61
1749	.byte	0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26
1750	.byte	0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d
1751
1752rcon_byte:
1753	.byte	0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36
1754