|	$NetBSD: aes-m68k.S,v 1.1 2025/07/17 14:25:31 christos Exp $

| Copyright (C) 2016 Tetsuya Isaki. All rights reserved.
| Copyright (C) 2016 Y.Sugahara (moveccr). All rights reserved.
|
| Redistribution and use in source and binary forms, with or without
| modification, are permitted provided that the following conditions
| are met:
| 1. Redistributions of source code must retain the above copyright
|    notice, this list of conditions and the following disclaimer.
| 2. Redistributions in binary form must reproduce the above copyright
|    notice, this list of conditions and the following disclaimer in the
|    documentation and/or other materials provided with the distribution.
|
| THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
| IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
| OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
| IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
| INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
| BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
| AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
| OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
| OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
| SUCH DAMAGE.

#define rd_key	(0)
#define rounds	(60 * 4)

| int
| AES_set_encrypt_key(const unsigned char *userKey,
|  const int bits,
|  AES_KEY *key)
	.global	AES_set_encrypt_key
	.type	AES_set_encrypt_key, @function
AES_set_encrypt_key:
.Laes_set_encrypt_key:
	moveml	%d2-%d7/%a2-%a6,%sp@-
	moveal	%sp@(44+4),%a0		| userKey
	moveal	%sp@(44+8),%a1		| bits
	moveal	%sp@(44+12),%a3		| key

	tstl	%a0
	beq	.Lpek_return1		| return -1 if userKey == NULL
	tstl	%a3
	beq	.Lpek_return1		| return -1 if key == NULL

	cmpaw	#128,%a1
	bne	.Lpek192_check		| unless bits == 128
.Lpek128:
	| %d0-%d7 rk[0..7]
	| %a0 userKey, Te0
	| %a1          Te1
	| %a2          Te2
	| %a3 key,     Te3
	| %a4 rcon_byte
	| %a5 &rk[4]
	| %a6 end of rcon_byte

	moveq	#10,%d0
	movel	%d0,%a3@(rounds)	| key->rounds = 10

	lea	%a3@(rd_key),%a5	| &rk[0]

	| rk[0] = GETU32(userKey     );
	| rk[1] = GETU32(userKey +  4);
	| rk[2] = GETU32(userKey +  8);
	| rk[3] = GETU32(userKey + 12);
	moveml	%a0@,%d0-%d3
	movel	%d0,%a5@+
	movel	%d1,%a5@+
	movel	%d2,%a5@+
	movel	%d3,%a5@+

	lea	%pc@(Te0),%a0		| %a0 = Te0
	lea	%a0@(256*4),%a1		| %a1 = Te1
	lea	%a1@(256*4),%a2		| %a2 = Te2
	lea	%a2@(256*4),%a3		| %a3 = Te3

	moveq	#0,%d7
	lea	%pc@(rcon_byte),%a4
	lea	%a4@(10),%a6

.Lpek128_loop:
					| d6 consists of four Te index bytes
	movel	%d3,%d5			| d5=rk[3] as {1,2,3,0}
	moveb	%d5,%d7			| d7=temp
	moveb	%a0@(2,%d7:w:4),%d4	| d4=$xxxxxx00
	swap	%d5			| d5={3,0,1,2}
	lsll	#8,%d4			| d4=$xxxx00xx
	moveb	%d5,%d7			| d7=temp>>16
	moveb	%a2@(0,%d7:w:4),%d6	| d6=$xxxxxx22
	lsrl	#8,%d5			| d5={x,3,0,1}
	moveb	%a4@+,%d7		| LSByte ^= rcon[i]
	eorb	%d7,%d6
	lsll	#8,%d6			| d6=$xxxx22xx
	moveb	%d5,%d7			| d7=temp>>24
	moveb	%a1@(3,%d7:w:4),%d4	| d4=$xxxx0011
	swap	%d5			| d5={0,1,x,3}
	moveb	%d5,%d7			| d7=temp>>8
	moveb	%a3@(1,%d7:w:4),%d6	| d6=$xxxx2233
	swap	%d6			| d6=$2233xxxx
	movew	%d4,%d6			| d6=$22330011

	eorl	%d6,%d0			| rk[4] = rk[0]^ (Te..)
	movel	%d0,%a5@+
	eorl	%d0,%d1			| rk[5] = rk[1] ^ rk[4];
	movel	%d1,%a5@+
	eorl	%d1,%d2			| rk[6] = rk[2] ^ rk[5];
	movel	%d2,%a5@+
	eorl	%d2,%d3			| rk[7] = rk[3] ^ rk[6];
	movel	%d3,%a5@+

	cmpal	%a4,%a6
	bne	.Lpek128_loop		|if (++i == 10) return 0;

.Lpek_return0:
	moveql	#0,%d0
.Lpek_return:
	moveml	%sp@+,%d2-%d7/%a2-%a6
	rts

.Lpek192_check:
	| %a0 userKey
	| %a1 bits
	| %a3 key
	cmpaw	#192,%a1
	bne	.Lpek256_check		| unless bits == 192
.Lpek192:
	| %a0 Te0
	| %a1 Te1
	| %a2 Te2
	| %a3 Te3
	| %a4 rcon_byte
	| %a5 &rk[6]
	| %a6 end of rcon_byte
	moveq	#12,%d0
	movel	%d0,%a3@(rounds)	| key->rounds = 12

	lea	%a3@(rd_key),%a5	| &rk[0]

	| rk[0] = GETU32(userKey     );
	| rk[1] = GETU32(userKey +  4);
	| rk[2] = GETU32(userKey +  8);
	| rk[3] = GETU32(userKey + 12);
	| rk[4] = GETU32(userKey + 16);
	| rk[5] = GETU32(userKey + 20);
	moveml	%a0@,%d0-%d5		| copy userKey[0..23]
	movel	%d0,%a5@+
	movel	%d1,%a5@+
	movel	%d2,%a5@+
	movel	%d3,%a5@+
	movel	%d4,%a5@+
	movel	%d5,%a5@		| read again later

	lea	%pc@(Te0   +2),%a0	| %a0 = Te0 + 2
	lea	%a0@(256*4 -2+3),%a1	| %a1 = Te1 + 3
	lea	%a1@(256*4 -3+0),%a2	| %a2 = Te2 + 0
	lea	%a2@(256*4 +0+1),%a3	| %a3 = Te3 + 1

	moveq	#0,%d7
	lea	%pc@(rcon_byte),%a4
	lea	%a4@(8),%a6
	bra	.Lpek192_loop_start

.Lpek192_loop:
	eorl	%d3,%d4			| rk[10] = rk[4] ^ rk[9]
	movel	%d4,%a5@+		| %d4 is rk[10]
	eorl	%d4,%d5			| rk[11] = rk[5] ^ rk[10]
	movel	%d5,%a5@		| %d5 is rk[11]

.Lpek192_loop_start:
	| %d0..%d5 = rk[0..5]
	|
	| temp = rk[5];
	| rk[6]  = (Te0[(temp      ) & 0xff] & 0x0000ff00)
	| rk[6] |= (Te3[(temp >>  8) & 0xff] & 0x00ff0000)
	| rk[6] |= (Te2[(temp >> 16) & 0xff] & 0xff000000)
	|         ^ rcon[i]
	| rk[6] |= (Te1[(temp >> 24)       ] & 0x000000ff)
	moveb	%d5,%d7			| temp >> 0
	moveb	%a0@(%d7:w:4),%d6	| d6=$xxxxxx00
	rorl	#8,%d6			| d6=$00xxxxxx
	lsrl	#8,%d5			| temp >> 8
	moveb	%d5,%d7
	moveb	%a3@(%d7:w:4),%d6	| d6=$00xxxx11
	rorl	#8,%d6			| d6=$1100xxxx
	lsrl	#8,%d5			| temp >> 16
	moveb	%d5,%d7
	moveb	%a2@(%d7:w:4),%d6	| d6=$1100xx22
	moveb	%a4@+,%d7		| LSByte ^= rcon[i]
	eorb	%d7,%d6
	rorl	#8,%d6			| d6=$221100xx
	lsrl	#8,%d5			| temp >> 24
	moveb	%a1@(%d5:w:4),%d6	| d6=$22110033

	movel	%a5@+,%d5		| read rk[5] again
					| (faster than keeping %a5)

	eorl	%d6,%d0			| rk[6] ^= rk[0]
	movel	%d0,%a5@+		| %d0 is rk[6]
	eorl	%d0,%d1			| rk[7] = rk[1] ^ rk[6]
	movel	%d1,%a5@+		| %d1 is rk[7]
	eorl	%d1,%d2			| rk[8] = rk[2] ^ rk[7]
	movel	%d2,%a5@+		| %d2 is rk[8]
	eorl	%d2,%d3			| rk[9] = rk[3] ^ rk[8]
	movel	%d3,%a5@+		| %d3 is rk[9]

	cmpal	%a4,%a6
	bne	.Lpek192_loop
	bra	.Lpek_return0


.Lpek256_check:
	| %a0 userKey
	| %a1 bits
	| %a3 key
	cmpaw	#256,%a1
	bne	.Lpek_return2		| otherwise return -2
.Lpek256:
	| %a0 Te0
	| %a1 Te1
	| %a2 Te2
	| %a3 Te3
	| %a4 rcon_byte
	| %a5 &rk[6]
	| %a6 end of rcon_byte
	moveq	#14,%d0
	movel	%d0,%a3@(rounds)	| key->rounds = 14

	lea	%a3@(rd_key),%a5	| &rk[0]

	| rk[0] = GETU32(userKey     );
	| rk[1] = GETU32(userKey +  4);
	| rk[2] = GETU32(userKey +  8);
	| rk[3] = GETU32(userKey + 12);
	| rk[4] = GETU32(userKey + 16);
	| rk[5] = GETU32(userKey + 20);
	| rk[6] = GETU32(userKey + 24);
	| rk[7] = GETU32(userKey + 28);
	moveml	%a0@,%d0-%d7		| copy userKey[0..31]
	movel	%d0,%a5@+
	movel	%d1,%a5@+
	movel	%d2,%a5@+
	movel	%d3,%a5@+
	movel	%d4,%a5@+
	movel	%d5,%a5@+
	movel	%d6,%a5@+
	movel	%d7,%a5@+

	lea	%pc@(Te0   +2),%a0	| %a0 = Te0 + 2
	lea	%a0@(256*4 -2+3),%a1	| %a1 = Te1 + 3
	lea	%a1@(256*4 -3+0),%a2	| %a2 = Te2 + 0
	lea	%a2@(256*4 +0+1),%a3	| %a3 = Te3 + 1

	lea	%pc@(rcon_byte),%a4
	lea	%a4@(7),%a6
	bra	.Lpek256_loop_start

.Lpek256_loop:
	| %d0: rk[8]  -> work
	| %d1: rk[9]  -> work
	| %d2: rk[10]
	| %d3: rk[11] -> work
	| %d4: rk[4]
	| %d5: work   -> rk[5]
	| %d6: work   -> rk[6]
	| %d7: work   -> rk[7]
	| %a5 = &rk[12]
	|
	| temp = rk[11];
	| rk[12]  = (Te1[(temp      ) & 0xff] & 0x000000ff);
	| rk[12] |= (Te0[(temp >>  8) & 0xff] & 0x0000ff00);
	| rk[12] |= (Te3[(temp >> 16) & 0xff] & 0x00ff0000);
	| rk[12] |= (Te2[(temp >> 24)       ] & 0xff000000);
	| rk[12] ^= rk[ 4];

	moveml	%a5@(-7*4),%d5-%d7	| %d5..%d7 = rk[5..7]

	moveq	#0,%d0
	moveb	%d3,%d0			| temp >> 0
	moveb	%a1@(%d0:w:4),%d1	| d1=$xxxxxx00
	rorl	#8,%d1			| d1=$00xxxxxx
	lsrl	#8,%d3			| temp >> 8
	moveb	%d3,%d0
	moveb	%a0@(%d0:w:4),%d1	| d1=$00xxxx11
	rorl	#8,%d1			| d1=$1100xxxx
	lsrl	#8,%d3			| temp >> 16
	moveb	%d3,%d0
	moveb	%a3@(%d0:w:4),%d1	| d1=$1100xx22
	rorl	#8,%d1			| d1=$221100xx
	lsrl	#8,%d3			| temp >> 24
	moveb	%a2@(%d3:w:4),%d1	| d1=$22110033
	rorl	#8,%d1			| d1=$33221100

	eorl	%d1,%d4			| rk[12] ^= rk[4]
	movel	%d4,%a5@+		| %d4 is rk[12]
	eorl	%d4,%d5			| rk[13] = rk[5] ^ rk[12]
	movel	%d5,%a5@+		| %d5 is rk[13]
	eorl	%d5,%d6			| rk[14] = rk[6] ^ rk[13]
	movel	%d6,%a5@+		| %d6 is rk[14]
	eorl	%d6,%d7			| rk[15] = rk[7] ^ rk[14]
	movel	%d7,%a5@+		| %d7 is rk[15]

	| %d0: work -> rk[8]
	| %d1: work -> rk[9]
	| %d2: rk[10]
	| %d3: work -> rk[11]
	| %d4: rk[12]
	| %d5: rk[13]
	| %d6: rk[14]
	| %d7: rk[15]
	| %a5 = &rk[16]

	moveml	%a5@(-8*4),%d0-%d1	| %d0..%d1 = rk[8..9]
	movel	%a5@(-5*4),%d3		| %d3 = rk[11]

.Lpek256_loop_start:
	| %d0: rk[0]
	| %d1: rk[1]
	| %d2: rk[2]
	| %d3: rk[3]
	| %d4: rk[4]
	| %d5: rk[5] -> work
	| %d6: rk[6] -> work
	| %d7: rk[7]
	| %a5 = &rk[8]
	|
	| temp = rk[7]
	| rk[8]  = (Te0[(temp      ) & 0xff] & 0x0000ff00);
	| rk[8] |= (Te3[(temp >>  8) & 0xff] & 0x00ff0000);
	| rk[8] |= (Te2[(temp >> 16) & 0xff] & 0xff000000);
	| rk[8] ^= rcon[i];
	| rk[8] |= (Te1[(temp >> 24)       ] & 0x000000ff);
	| rk[8] ^= rk[ 0];

	moveq	#0,%d5
	moveb	%d7,%d5			| temp >> 0
	moveb	%a0@(%d5:w:4),%d6	| d6=$xxxxxx00
	rorl	#8,%d6			| d6=$00xxxxxx
	lsrl	#8,%d7			| temp >> 8
	moveb	%d7,%d5
	moveb	%a3@(%d5:w:4),%d6	| d6=$00xxxx11
	rorl	#8,%d6			| d6=$1100xxxx
	lsrl	#8,%d7			| temp >> 16
	moveb	%d7,%d5
	moveb	%a2@(%d5:w:4),%d6	| d6=$1100xx22
	moveb	%a4@+,%d5		| LSByte ^= rcon[i]
	eorb	%d5,%d6
	rorl	#8,%d6			| d6=$221100xx
	lsrl	#8,%d7			| temp >> 24
	moveb	%a1@(%d7:w:4),%d6	| d6=$22110033

	eorl	%d6,%d0			| rk[8] ^= rk[0]
	movel	%d0,%a5@+		| %d0 is rk[8]
	eorl	%d0,%d1			| rk[9] = rk[1] ^ rk[8]
	movel	%d1,%a5@+		| %d1 is rk[9]
	eorl	%d1,%d2			| rk[10] = rk[2] ^ rk[9]
	movel	%d2,%a5@+		| %d2 is rk[10]
	eorl	%d2,%d3			| rk[11] = rk[3] ^ rk[10]
	movel	%d3,%a5@+		| %d3 is rk[11]

	| %d0: rk[8]
	| %d1: rk[9]
	| %d2: rk[10]
	| %d3: rk[11]
	| %d4: rk[4]
	| %d5: work
	| %d6: work
	| %d7: work

	cmpal	%a4,%a6
	bne	.Lpek256_loop
	bra	.Lpek_return0

.Lpek_return1:
	moveql	#-1,%d0
	bra	.Lpek_return
.Lpek_return2:
	moveql	#-2,%d0
	bra	.Lpek_return
	.size	AES_set_encrypt_key, .-AES_set_encrypt_key


| int
| private_AES_set_decrypt_key(const unsigned char *userKey,
|  const int bits,
|  AES_KEY *key)
	.global	AES_set_decrypt_key
	.type	AES_set_decrypt_key, @function
AES_set_decrypt_key:
	moveml	%d2-%d7/%a2-%a6,%sp@-
	moveal	%sp@(44+4),%a0		| userKey
	moveal	%sp@(44+8),%a1		| bits
	moveal	%sp@(44+12),%a3		| key

	/* first, start with an encryption schedule */
	movel	%a3,%sp@-
	movel	%a1,%sp@-
	movel	%a0,%sp@-
	bsr	.Laes_set_encrypt_key
	lea	%sp@(12),%sp
	bmi	.Lpdk_return

	/* invert the order of the round keys: */
	lea	%a3@(rd_key),%a5	| %a5 := &rk[0]
	movel	%a3@(rounds),%d4
	lslw	#4,%d4
	lea	%a5@(%d4),%a4		| %a4 := &rk[j]
	moveal	%a4,%a6			| %a6 for the next loop
.Lpdk_invert_loop:
	movel	%a5@,%d0
	movel	%a4@,%a5@+
	movel	%d0,%a4@+

	movel	%a5@,%d0
	movel	%a4@,%a5@+
	movel	%d0,%a4@+

	movel	%a5@,%d0
	movel	%a4@,%a5@+
	movel	%d0,%a4@+

	movel	%a5@,%d0
	movel	%a4@,%a5@+
	movel	%d0,%a4@

	lea	%a4@(-28),%a4

	cmpal	%a4,%a5
	bcs	.Lpdk_invert_loop

	/*
	 * apply the inverse MixColumn transform to all round keys but
	 * the first and the last:
	 */
	lea	%a3@(rd_key + 16),%a5	| rk += 4
	lea	%pc@(Te1+3),%a4		| LSByte of Te1
	lea	%pc@(Td0),%a0		| %a0 = Td0
	lea	%a0@(256*4),%a1		| %a1 = Td1
	lea	%a1@(256*4),%a2		| %a2 = Td2
	lea	%a2@(256*4),%a3		| %a3 = Td3

	| for (i = 1; i < key->rounds; i++)
	moveq	#0,%d1
.Lpdk_apply_loop:
	| rk[0] =
	|     Td3[Te1[(rk[0]      ) & 0xff] & 0xff] ^
	|     Td2[Te1[(rk[0] >>  8) & 0xff] & 0xff] ^
	|     Td1[Te1[(rk[0] >> 16) & 0xff] & 0xff] ^
	|     Td0[Te1[(rk[0] >> 24)       ] & 0xff];
	movel	%a5@,%d0
	moveb	%d0,%d1			| rk[0] >>  0
	moveb	%a4@(%d1:w:4),%d1	| Te1[]
	movel	%a3@(%d1:w:4),%d2	| Td3[]
	lsrl	#8,%d0
	moveb	%d0,%d1			| rk[0] >>  8
	moveb	%a4@(%d1:w:4),%d1	| Te1[]
	movel	%a2@(%d1:w:4),%d3	| Td3[]
	eorl	%d3,%d2
	lsrl	#8,%d0
	moveb	%d0,%d1			| rk[0] >> 16
	moveb	%a4@(%d1:w:4),%d1	| Te1[]
	movel	%a1@(%d1:w:4),%d3	| Td3[]
	eorl	%d3,%d2
	lsrl	#8,%d0			| rk[0] >> 24
	moveb	%a4@(%d0:w:4),%d1	| Te1[]
	movel	%a0@(%d1:w:4),%d3
	eorl	%d3,%d2
	movel	%d2,%a5@+		| -> rk[0]

	cmpal	%a6,%a5
	bcs	.Lpdk_apply_loop

	moveql	#0,%d0
.Lpdk_return:
	moveml	%sp@+,%d2-%d7/%a2-%a6
	rts
	.size	AES_set_decrypt_key, .-AES_set_decrypt_key


| void
| AES_encrypt(const unsigned char *in,
|  unsigned char *out,
|  const AES_KEY *key)
	.global AES_encrypt
	.type	AES_encrypt, @function
AES_encrypt:
	| %a0  in,  Te0
	| %a1  out, Te1
	| %a2       Te2
	| %a3  key, Te3
	| %a4  loop end
	| %a5  rk
	moveml	%d2-%d7/%a2-%a5,%sp@-
	moveal	%sp@(40+4),%a0		| in
	moveal	%sp@(40+12),%a3		| key

	lea	%a3@(rd_key),%a5
	movel	%a3@(rounds),%d0

	lslw	#4,%d0			| key->rounds * 16
	lea	%a5@(0,%d0),%a4		| %a4 := %a5 + key->rounds * 16

	movel	%a0@+,%d0
	movel	%a5@+,%d5
	eorl	%d5,%d0			| s0 = GETU32(in     ) ^ rk[0]

	movel	%a0@+,%d1
	movel	%a5@+,%d5
	eorl	%d5,%d1			| s1 = GETU32(in +  4) ^ rk[1]

	movel	%a0@+,%d2
	movel	%a5@+,%d5
	eorl	%d5,%d2			| s2 = GETU32(in +  8) ^ rk[2]

	movel	%a0@+,%d3
	movel	%a5@+,%d5
	eorl	%d5,%d3			| s3 = GETU32(in + 12) ^ rk[3]

	lea	%pc@(Te0),%a0		| %a0 = Te0
	lea	%a0@(256*4),%a1		| %a1 = Te1
	lea	%a1@(256*4),%a2		| %a2 = Te2
	lea	%a2@(256*4),%a3		| %a3 = Te3

	bra	.Lenc_loop_start

.Lenc_loop:
	| s1  = Te3[(t0      ) & 0xff];
	| s2  = Te2[(t0 >>  8) & 0xff];
	| s3  = Te1[(t0 >> 16) & 0xff];
	| s0  = Te0[(t0 >> 24)       ];
	|
	| s2 ^= Te3[(t1      ) & 0xff];
	| s3 ^= Te2[(t1 >>  8) & 0xff];
	| s0 ^= Te1[(t1 >> 16) & 0xff];
	| s1 ^= Te0[(t1 >> 24)       ];
	|
	| s3 ^= Te3[(t2      ) & 0xff];
	| s0 ^= Te2[(t2 >>  8) & 0xff];
	| s1 ^= Te1[(t2 >> 16) & 0xff];
	| s2 ^= Te0[(t2 >> 24)       ];
	|
	| s0 ^= Te3[(t3      ) & 0xff];
	| s1 ^= Te2[(t3 >>  8) & 0xff];
	| s2 ^= Te1[(t3 >> 16) & 0xff];
	| s3 ^= Te0[(t3 >> 24)       ];
	|
	| s0 ^= rk[0];
	| s1 ^= rk[1];
	| s2 ^= rk[2];
	| s3 ^= rk[3];
	|
	| %d0..%d3: s0..s3
	| %d4..%d7: t0..t3

	moveq	#0,%d3
	moveb	%d4,%d3
	movel	%a3@(%d3:w:4),%d1
	lsrl	#8,%d4
	moveb	%d4,%d3
	movel	%a2@(%d3:w:4),%d2
	lsrl	#8,%d4
	moveb	%d4,%d3
	movel	%a1@(%d3:w:4),%d3
	lsrl	#8,%d4
	movel	%a0@(%d4:w:4),%d0

	moveb	%d5,%d4
	movel	%a3@(%d4:w:4),%d4
	eorl	%d4,%d2
	lsrl	#8,%d5
	moveql	#0,%d4
	moveb	%d5,%d4
	movel	%a2@(%d4:w:4),%d4
	eorl	%d4,%d3
	lsrl	#8,%d5
	moveql	#0,%d4
	moveb	%d5,%d4
	movel	%a1@(%d4:w:4),%d4
	eorl	%d4,%d0
	lsrl	#8,%d5
	movel	%a0@(%d5:w:4),%d4
	eorl	%d4,%d1

	moveb	%d6,%d5
	movel	%a3@(%d5:w:4),%d4
	eorl	%d4,%d3
	lsrl	#8,%d6
	moveb	%d6,%d5
	movel	%a2@(%d5:w:4),%d4
	eorl	%d4,%d0
	lsrl	#8,%d6
	moveb	%d6,%d5
	movel	%a1@(%d5:w:4),%d4
	eorl	%d4,%d1
	lsrl	#8,%d6
	movel	%a0@(%d6:w:4),%d4
	eorl	%d4,%d2

	moveb	%d7,%d5
	movel	%a3@(%d5:w:4),%d4
	eorl	%d4,%d0
	lsrl	#8,%d7
	moveb	%d7,%d5
	movel	%a2@(%d5:w:4),%d4
	eorl	%d4,%d1
	lsrl	#8,%d7
	moveb	%d7,%d5
	movel	%a1@(%d5:w:4),%d4
	eorl	%d4,%d2
	lsrl	#8,%d7
	movel	%a0@(%d7:w:4),%d4
	eorl	%d4,%d3

	movel	%a5@+,%d4
	eorl	%d4,%d0
	movel	%a5@+,%d4
	eorl	%d4,%d1
	movel	%a5@+,%d4
	eorl	%d4,%d2
	movel	%a5@+,%d4
	eorl	%d4,%d3

.Lenc_loop_start:
	| t1  = Te3[(s0      ) & 0xff];
	| t2  = Te2[(s0 >>  8) & 0xff];
	| t3  = Te1[(s0 >> 16) & 0xff];
	| t0  = Te0[(s0 >> 24) & 0xff];
	|
	| t2 ^= Te3[(s1 >>  0) & 0xff];
	| t3 ^= Te2[(s1 >>  8) & 0xff];
	| t0 ^= Te1[(s1 >> 16) & 0xff];
	| t1 ^= Te0[(s1 >> 24) & 0xff];
	|
	| t3 ^= Te3[(s2 >>  0) & 0xff];
	| t0 ^= Te2[(s2 >>  8) & 0xff];
	| t1 ^= Te1[(s2 >> 16) & 0xff];
	| t2 ^= Te0[(s2 >> 24) & 0xff];
	|
	| t0 ^= Te3[(s3 >>  0) & 0xff];
	| t1 ^= Te2[(s3 >>  8) & 0xff];
	| t2 ^= Te1[(s3 >> 16) & 0xff];
	| t3 ^= Te0[(s3 >> 24) & 0xff];
	|
	| t0 ^= rk[4];
	| t1 ^= rk[5];
	| t2 ^= rk[6];
	| t3 ^= rk[7];
	|
	| %d0..%d3: s0..s3
	| %d4..%d7: t0..t3

	moveql	#0,%d7
	moveb	%d0,%d7
	movel	%a3@(%d7:w:4),%d5
	lsrl	#8,%d0
	moveb	%d0,%d7
	movel	%a2@(%d7:w:4),%d6
	lsrl	#8,%d0
	moveb	%d0,%d7
	movel	%a1@(%d7:w:4),%d7
	lsrl	#8,%d0
	movel	%a0@(%d0:w:4),%d4

	moveb	%d1,%d0
	movel	%a3@(%d0:w:4),%d0
	eorl	%d0,%d6
	lsrl	#8,%d1
	moveql	#0,%d0
	moveb	%d1,%d0
	movel	%a2@(%d0:w:4),%d0
	eorl	%d0,%d7
	lsrl	#8,%d1
	moveql	#0,%d0
	moveb	%d1,%d0
	movel	%a1@(%d0:w:4),%d0
	eorl	%d0,%d4
	lsrl	#8,%d1
	movel	%a0@(%d1:w:4),%d0
	eorl	%d0,%d5

	moveb	%d2,%d1
	movel	%a3@(%d1:w:4),%d0
	eorl	%d0,%d7
	lsrl	#8,%d2
	moveb	%d2,%d1
	movel	%a2@(%d1:w:4),%d0
	eorl	%d0,%d4
	lsrl	#8,%d2
	moveb	%d2,%d1
	movel	%a1@(%d1:w:4),%d0
	eorl	%d0,%d5
	lsrl	#8,%d2
	movel	%a0@(%d2:w:4),%d0
	eorl	%d0,%d6

	moveb	%d3,%d1
	movel	%a3@(%d1:w:4),%d0
	eorl	%d0,%d4
	lsrl	#8,%d3
	moveb	%d3,%d1
	movel	%a2@(%d1:w:4),%d0
	eorl	%d0,%d5
	lsrl	#8,%d3
	moveb	%d3,%d1
	movel	%a1@(%d1:w:4),%d0
	eorl	%d0,%d6
	lsrl	#8,%d3
	movel	%a0@(%d3:w:4),%d0
	eorl	%d0,%d7

	movel	%a5@+,%d0
	eorl	%d0,%d4
	movel	%a5@+,%d0
	eorl	%d0,%d5
	movel	%a5@+,%d0
	eorl	%d0,%d6
	movel	%a5@+,%d0
	eorl	%d0,%d7

	cmpal	%a5,%a4
	bne	.Lenc_loop		| if (--r == 0) break;
.Lenc_last:
	/*
	 * apply last round and
	 * map cipher state to byte array block:
	 */
	moveal	%sp@(40+8),%a4		| out
	addql	#2,%a0			| Te0 += 2
	addql	#3,%a1			| Te1 += 3
	addql	#1,%a3			| Te3 += 1
					| Te2 += 0

	| s1  = (Te1[(t0      ) & 0xff] & 0x000000ff);
	| s2  = (Te0[(t0 >>  8) & 0xff] & 0x0000ff00);
	| s3  = (Te3[(t0 >> 16) & 0xff] & 0x00ff0000);
	| s0  = (Te2[(t0 >> 24)       ] & 0xff000000);
	|
	| s2 |= (Te1[(t1      ) & 0xff] & 0x000000ff);
	| s3 |= (Te0[(t1 >>  8) & 0xff] & 0x0000ff00);
	| s0 |= (Te3[(t1 >> 16) & 0xff] & 0x00ff0000);
	| s1 |= (Te2[(t1 >> 24)       ] & 0xff000000);
	|
	| s3 |= (Te1[(t2      ) & 0xff] & 0x000000ff);
	| s0 |= (Te0[(t2 >>  8) & 0xff] & 0x0000ff00);
	| s1 |= (Te3[(t2 >> 16) & 0xff] & 0x00ff0000);
	| s2 |= (Te2[(t2 >> 24)       ] & 0xff000000);
	|
	| s0 |= (Te1[(t3      ) & 0xff] & 0x000000ff);
	| s1 |= (Te0[(t3 >>  8) & 0xff] & 0x0000ff00);
	| s2 |= (Te3[(t3 >> 16) & 0xff] & 0x00ff0000);
	| s3 |= (Te2[(t3 >> 24)       ] & 0xff000000);

	moveql	#0,%d0
	moveb	%d4,%d0			| t0 >> 0
	moveb	%a1@(%d0:w:4),%d1	| d1=$xxxxxx00
	lsrl	#8,%d4			| t0 >> 8
	lsll	#8,%d1			| d1=$xxxx00xx
	moveb	%d4,%d0
	moveb	%a0@(%d0:w:4),%d2	| d2=$xxxxxx00
	lsrl	#8,%d4			| t0 >> 16
	lsll	#8,%d2			| d2=$xxxx00xx
	moveb	%d4,%d0
	moveb	%a3@(%d0:w:4),%d3	| d3=$xxxxxx00
	lsrl	#8,%d4			| t0 >> 24
	lsll	#8,%d3			| d3=$xxxx00xx
	moveb	%a2@(%d4:w:4),%d0	| d0=$xxxxxx00
	lsll	#8,%d0			| d0=$xxxx00xx

	moveb	%d5,%d4			| t1 >> 0
	moveb	%a1@(%d4:w:4),%d2	| d2=$xxxx0011
	lsrl	#8,%d5			| t1 >> 8
	lsll	#8,%d2			| d2=$xx0011xx
	moveb	%d5,%d4
	moveb	%a0@(%d4:w:4),%d3	| d3=$xxxx0011
	lsrl	#8,%d5			| t1 >> 16
	lsll	#8,%d3			| d3=$xx0011xx
	moveb	%d5,%d4
	moveb	%a3@(%d4:w:4),%d0	| d0=$xxxx0011
	lsrl	#8,%d5			| t1 >> 24
	lsll	#8,%d0			| d0=$xx0011xx
	moveb	%a1@(%d5:w:4),%d1	| d1=$xxxx0011
	lsll	#8,%d1			| d1=$xx0011xx

	moveb	%d6,%d4			| t2 >> 0
	moveb	%a1@(%d4:w:4),%d3	| d3=$xx001122
	lsrl	#8,%d6			| t2 >> 8
	lsll	#8,%d3			| d3=$001122xx
	moveb	%d6,%d4
	moveb	%a0@(%d4:w:4),%d0	| d0=$xx001122
	lsrl	#8,%d6			| t2 >> 16
	lsll	#8,%d0			| d0=$001122xx
	moveb	%d6,%d4
	moveb	%a3@(%d4:w:4),%d1	| d1=$xx001122
	lsrl	#8,%d6			| t2 >> 24
	lsll	#8,%d1			| d1=$001122xx
	moveb	%a2@(%d6:w:4),%d2	| d2=$xx001122
	lsll	#8,%d2			| d2=$001122xx

	moveb	%d7,%d4			| t3 >> 0
	moveb	%a1@(%d4:w:4),%d0	| d0=$00112233
	lsrl	#8,%d7			| t3 >> 8
	moveb	%d7,%d4
	moveb	%a0@(%d4:w:4),%d1	| d1=$00112233
	lsrl	#8,%d7			| t3 >> 16
	roll	#8,%d1			| d1=$11223300
	moveb	%d7,%d4
	moveb	%a3@(%d4:w:4),%d2	| d2=$00112233
	lsrl	#8,%d7			| t3 >> 24
	swap	%d2			| d2=$22330011
	moveb	%a2@(%d7:w:4),%d3	| d3=$00112233
	rorl	#8,%d3			| d3=$33001122

	movel	%a5@+,%d4
	eorl	%d4,%d0			| s0 ^= rk[0]
	movel	%a5@+,%d4
	eorl	%d4,%d1			| s1 ^= rk[1]
	movel	%a5@+,%d4
	eorl	%d4,%d2			| s2 ^= rk[2]
	movel	%a5@+,%d4
	eorl	%d4,%d3			| s3 ^= rk[3]

	movel	%d0,%a4@+		| PUTU32(out     , s0);
	movel	%d1,%a4@+		| PUTU32(out +  4, s1);
	movel	%d2,%a4@+		| PUTU32(out +  8, s2);
	movel	%d3,%a4@		| PUTU32(out + 12, s3);

	moveml	%sp@+,%d2-%d7/%a2-%a5
	rts
	.size	AES_encrypt, .-AES_encrypt

| void
| AES_decrypt(const unsigned char *in,
|  unsigned char *out,
|  const AES_KEY *key)
	.global	AES_decrypt
	.type	AES_decrypt, @function
AES_decrypt:
	| %a0  in,  Td0
	| %a1  out, Td1
	| %a2       Td2
	| %a3  key, Td3
	| %a4  loop end, Td4
	| %a5  rk
	moveml	%d2-%d7/%a2-%a5,%sp@-
	moveal	%sp@(40+4),%a0		| in
	moveal	%sp@(40+12),%a3		| key

	lea	%a3@(rd_key),%a5
	movel	%a3@(rounds),%d0

	lslw	#4,%d0			| key->rounds * 16
	lea	%a5@(0,%d0),%a4		| %a4 := %a5 + key->rounds * 16

	movel	%a0@+,%d0
	movel	%a5@+,%d5
	eorl	%d5,%d0			| s0 = GETU32(in     ) ^ rk[0]

	movel	%a0@+,%d1
	movel	%a5@+,%d5
	eorl	%d5,%d1			| s1 = GETU32(in +  4) ^ rk[1]

	movel	%a0@+,%d2
	movel	%a5@+,%d5
	eorl	%d5,%d2			| s2 = GETU32(in +  8) ^ rk[2]

	movel	%a0@+,%d3
	movel	%a5@+,%d5
	eorl	%d5,%d3			| s3 = GETU32(in + 12) ^ rk[3]

	lea	%pc@(Td0),%a0		| %a0 = Td0
	lea	%a0@(256*4),%a1		| %a1 = Td1
	lea	%a1@(256*4),%a2		| %a2 = Td2
	lea	%a2@(256*4),%a3		| %a3 = Td3

	bra	.Ldec_loop_start

.Ldec_loop:
	| s3  = Td3[(t0      ) & 0xff];
	| s2  = Td2[(t0 >>  8) & 0xff];
	| s1  = Td1[(t0 >> 16) & 0xff];
	| s0  = Td0[(t0 >> 24)       ];
	|
	| s0 ^= Td3[(t1      ) & 0xff];
	| s3 ^= Td2[(t1 >>  8) & 0xff];
	| s2 ^= Td1[(t1 >> 16) & 0xff];
	| s1 ^= Td0[(t1 >> 24)       ];
	|
	| s1 ^= Td3[(t2      ) & 0xff];
	| s0 ^= Td2[(t2 >>  8) & 0xff];
	| s3 ^= Td1[(t2 >> 16) & 0xff];
	| s2 ^= Td0[(t2 >> 24)       ];
	|
	| s2 ^= Td3[(t3      ) & 0xff];
	| s1 ^= Td2[(t3 >>  8) & 0xff];
	| s0 ^= Td1[(t3 >> 16) & 0xff];
	| s3 ^= Td0[(t3 >> 24)       ];
	|
	| s0 ^= rk[0];
	| s1 ^= rk[1];
	| s2 ^= rk[2];
	| s3 ^= rk[3];
	|
	| %d0..%d3: s0..s3
	| %d4..%d7: t0..t3

	moveq	#0,%d1
	moveb	%d4,%d1
	movel	%a3@(%d1:w:4),%d3
	lsrl	#8,%d4
	moveb	%d4,%d1
	movel	%a2@(%d1:w:4),%d2
	lsrl	#8,%d4
	moveb	%d4,%d1
	movel	%a1@(%d1:w:4),%d1
	lsrl	#8,%d4
	movel	%a0@(%d4:w:4),%d0

	moveb	%d5,%d4
	movel	%a3@(%d4:w:4),%d4
	eorl	%d4,%d0
	lsrl	#8,%d5
	moveql	#0,%d4
	moveb	%d5,%d4
	movel	%a2@(%d4:w:4),%d4
	eorl	%d4,%d3
	lsrl	#8,%d5
	moveql	#0,%d4
	moveb	%d5,%d4
	movel	%a1@(%d4:w:4),%d4
	eorl	%d4,%d2
	lsrl	#8,%d5
	movel	%a0@(%d5:w:4),%d4
	eorl	%d4,%d1

	moveb	%d6,%d5
	movel	%a3@(%d5:w:4),%d4
	eorl	%d4,%d1
	lsrl	#8,%d6
	moveb	%d6,%d5
	movel	%a2@(%d5:w:4),%d4
	eorl	%d4,%d0
	lsrl	#8,%d6
	moveb	%d6,%d5
	movel	%a1@(%d5:w:4),%d4
	eorl	%d4,%d3
	lsrl	#8,%d6
	movel	%a0@(%d6:w:4),%d4
	eorl	%d4,%d2

	moveb	%d7,%d5
	movel	%a3@(%d5:w:4),%d4
	eorl	%d4,%d2
	lsrl	#8,%d7
	moveb	%d7,%d5
	movel	%a2@(%d5:w:4),%d4
	eorl	%d4,%d1
	lsrl	#8,%d7
	moveb	%d7,%d5
	movel	%a1@(%d5:w:4),%d4
	eorl	%d4,%d0
	lsrl	#8,%d7
	movel	%a0@(%d7:w:4),%d4
	eorl	%d4,%d3

	movel	%a5@+,%d4
	eorl	%d4,%d0
	movel	%a5@+,%d4
	eorl	%d4,%d1
	movel	%a5@+,%d4
	eorl	%d4,%d2
	movel	%a5@+,%d4
	eorl	%d4,%d3

.Ldec_loop_start:
	| t3  = Td3[(s0      ) & 0xff];
	| t2  = Td2[(s0 >>  8) & 0xff];
	| t1  = Td1[(s0 >> 16) & 0xff];
	| t0  = Td0[(s0 >> 24) & 0xff];
	|
	| t0 ^= Td3[(s1 >>  0) & 0xff];
	| t3 ^= Td2[(s1 >>  8) & 0xff];
	| t2 ^= Td1[(s1 >> 16) & 0xff];
	| t1 ^= Td0[(s1 >> 24) & 0xff];
	|
	| t1 ^= Td3[(s2 >>  0) & 0xff];
	| t0 ^= Td2[(s2 >>  8) & 0xff];
	| t3 ^= Td1[(s2 >> 16) & 0xff];
	| t2 ^= Td0[(s2 >> 24) & 0xff];
	|
	| t2 ^= Td3[(s3 >>  0) & 0xff];
	| t1 ^= Td2[(s3 >>  8) & 0xff];
	| t0 ^= Td1[(s3 >> 16) & 0xff];
	| t3 ^= Td0[(s3 >> 24) & 0xff];
	|
	| t0 ^= rk[4];
	| t1 ^= rk[5];
	| t2 ^= rk[6];
	| t3 ^= rk[7];
	|
	| %d0..%d3: s0..s3
	| %d4..%d7: t0..t3

	moveql	#0,%d5
	moveb	%d0,%d5
	movel	%a3@(%d5:w:4),%d7
	lsrl	#8,%d0
	moveb	%d0,%d5
	movel	%a2@(%d5:w:4),%d6
	lsrl	#8,%d0
	moveb	%d0,%d5
	movel	%a1@(%d5:w:4),%d5
	lsrl	#8,%d0
	movel	%a0@(%d0:w:4),%d4

	moveb	%d1,%d0
	movel	%a3@(%d0:w:4),%d0
	eorl	%d0,%d4
	lsrl	#8,%d1
	moveql	#0,%d0
	moveb	%d1,%d0
	movel	%a2@(%d0:w:4),%d0
	eorl	%d0,%d7
	lsrl	#8,%d1
	moveql	#0,%d0
	moveb	%d1,%d0
	movel	%a1@(%d0:w:4),%d0
	eorl	%d0,%d6
	lsrl	#8,%d1
	movel	%a0@(%d1:w:4),%d0
	eorl	%d0,%d5

	moveb	%d2,%d1
	movel	%a3@(%d1:w:4),%d0
	eorl	%d0,%d5
	lsrl	#8,%d2
	moveb	%d2,%d1
	movel	%a2@(%d1:w:4),%d0
	eorl	%d0,%d4
	lsrl	#8,%d2
	moveb	%d2,%d1
	movel	%a1@(%d1:w:4),%d0
	eorl	%d0,%d7
	lsrl	#8,%d2
	movel	%a0@(%d2:w:4),%d0
	eorl	%d0,%d6

	moveb	%d3,%d1
	movel	%a3@(%d1:w:4),%d0
	eorl	%d0,%d6
	lsrl	#8,%d3
	moveb	%d3,%d1
	movel	%a2@(%d1:w:4),%d0
	eorl	%d0,%d5
	lsrl	#8,%d3
	moveb	%d3,%d1
	movel	%a1@(%d1:w:4),%d0
	eorl	%d0,%d4
	lsrl	#8,%d3
	movel	%a0@(%d3:w:4),%d0
	eorl	%d0,%d7

	movel	%a5@+,%d0
	eorl	%d0,%d4
	movel	%a5@+,%d0
	eorl	%d0,%d5
	movel	%a5@+,%d0
	eorl	%d0,%d6
	movel	%a5@+,%d0
	eorl	%d0,%d7

	cmpal	%a5,%a4
	bne	.Ldec_loop		| if (--r == 0) break;

	/*
	 * apply last round and
	 * map cipher state to byte array block:
	 */
	| s3  = ((u32)Td4[(t0 >>  0) & 0xff] <<  0);
	| s2  = ((u32)Td4[(t0 >>  8) & 0xff] <<  8);
	| s1  = ((u32)Td4[(t0 >> 16) & 0xff] << 16);
	| s0  = ((u32)Td4[(t0 >> 24) & 0xff] << 24);
	|
	| s0 |= ((u32)Td4[(t1 >>  0) & 0xff] <<  0);
	| s3 |= ((u32)Td4[(t1 >>  8) & 0xff] <<  8);
	| s2 |= ((u32)Td4[(t1 >> 16) & 0xff] << 16);
	| s1 |= ((u32)Td4[(t1 >> 24) & 0xff] << 24);
	|
	| s1 |= ((u32)Td4[(t2 >>  0) & 0xff] <<  0);
	| s0 |= ((u32)Td4[(t2 >>  8) & 0xff] <<  8);
	| s3 |= ((u32)Td4[(t2 >> 16) & 0xff] << 16);
	| s2 |= ((u32)Td4[(t2 >> 24) & 0xff] << 24);
	|
	| s2 |= ((u32)Td4[(t3 >>  0) & 0xff] <<  0);
	| s1 |= ((u32)Td4[(t3 >>  8) & 0xff] <<  8);
	| s0 |= ((u32)Td4[(t3 >> 16) & 0xff] << 16);
	| s3 |= ((u32)Td4[(t3 >> 24) & 0xff] << 24);
	|
	| s0 ^= rk[0];
	| PUTU32(out     , s0);
	| s1 ^= rk[1];
	| PUTU32(out +  4, s1);
	| s2 ^= rk[2];
	| PUTU32(out +  8, s2);
	| s3 ^= rk[3];
	| PUTU32(out + 12, s3);
	|
	| %d4..%d7: t0..t3
	| %d0..%d3: s0..s3

	lea	%pc@(Td4),%a4
	moveq	#0,%d0
	moveb	%d4,%d0
	moveb	%a4@(%d0),%d3
	rorl	#8,%d3
	lsrl	#8,%d4
	moveb	%d4,%d0
	moveb	%a4@(%d0),%d2
	rorl	#8,%d2
	lsrl	#8,%d4
	moveb	%d4,%d0
	moveb	%a4@(%d0),%d1
	rorl	#8,%d1
	lsrl	#8,%d4
	moveb	%a4@(%d4),%d0
	rorl	#8,%d0

	moveb	%d5,%d4
	moveb	%a4@(%d4),%d0
	rorl	#8,%d0
	lsrl	#8,%d5
	moveb	%d5,%d4
	moveb	%a4@(%d4),%d3
	rorl	#8,%d3
	lsrl	#8,%d5
	moveb	%d5,%d4
	moveb	%a4@(%d4),%d2
	rorl	#8,%d2
	lsrl	#8,%d5
	moveb	%a4@(%d5),%d1
	rorl	#8,%d1

	moveb	%d6,%d4
	moveb	%a4@(%d4),%d1
	rorl	#8,%d1			| d1=$221100xx
	lsrl	#8,%d6
	moveb	%d6,%d4
	moveb	%a4@(%d4),%d0
	rorl	#8,%d0			| d0=$221100xx
	lsrl	#8,%d6
	moveb	%d6,%d4
	moveb	%a4@(%d4),%d3
	rorl	#8,%d3			| d3=$221100xx
	lsrl	#8,%d6
	moveb	%a4@(%d6),%d2
	rorl	#8,%d2			| d2=$221100xx

	moveb	%d7,%d4
	moveb	%a4@(%d4),%d2		| d2=$22110033
	lsrl	#8,%d7
	moveb	%d7,%d4
	moveb	%a4@(%d4),%d1		| d1=$22110033
	roll	#8,%d1			| d1=$11003322
	lsrl	#8,%d7
	moveb	%d7,%d4
	moveb	%a4@(%d4),%d0		| d0=$22110033
	swap	%d0			| d0=$00332211
	lsrl	#8,%d7
	moveb	%a4@(%d7),%d3		| d3=$22110033
	rorl	#8,%d3			| d3=$33221100

	moveal	%sp@(40+8),%a4		| out

	movel	%a5@+,%d4
	eorl	%d4,%d0
	movel	%d0,%a4@+

	movel	%a5@+,%d4
	eorl	%d4,%d1
	movel	%d1,%a4@+

	movel	%a5@+,%d4
	eorl	%d4,%d2
	movel	%d2,%a4@+

	movel	%a5@+,%d4
	eorl	%d4,%d3
	movel	%d3,%a4@

	moveml	%sp@+,%d2-%d7/%a2-%a5
	rts
	.size	AES_decrypt, .-AES_decrypt

	.data
	.balign	4
Te0:
	.long	0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d
	.long	0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554
	.long	0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d
	.long	0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a
	.long	0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87
	.long	0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b
	.long	0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea
	.long	0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b
	.long	0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a
	.long	0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f
	.long	0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108
	.long	0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f
	.long	0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e
	.long	0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5
	.long	0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d
	.long	0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f
	.long	0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e
	.long	0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb
	.long	0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce
	.long	0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497
	.long	0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c
	.long	0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed
	.long	0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b
	.long	0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a
	.long	0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16
	.long	0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594
	.long	0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81
	.long	0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3
	.long	0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a
	.long	0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504
	.long	0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163
	.long	0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d
	.long	0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f
	.long	0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739
	.long	0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47
	.long	0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395
	.long	0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f
	.long	0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883
	.long	0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c
	.long	0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76
	.long	0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e
	.long	0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4
	.long	0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6
	.long	0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b
	.long	0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7
	.long	0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0
	.long	0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25
	.long	0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818
	.long	0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72
	.long	0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651
	.long	0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21
	.long	0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85
	.long	0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa
	.long	0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12
	.long	0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0
	.long	0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9
	.long	0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133
	.long	0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7
	.long	0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920
	.long	0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a
	.long	0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17
	.long	0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8
	.long	0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11
	.long	0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a
Te1:
	.long	0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b
	.long	0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5
	.long	0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b
	.long	0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676
	.long	0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d
	.long	0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0
	.long	0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf
	.long	0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0
	.long	0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626
	.long	0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc
	.long	0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1
	.long	0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515
	.long	0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3
	.long	0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a
	.long	0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2
	.long	0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575
	.long	0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a
	.long	0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0
	.long	0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3
	.long	0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484
	.long	0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded
	.long	0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b
	.long	0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939
	.long	0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf
	.long	0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb
	.long	0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585
	.long	0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f
	.long	0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8
	.long	0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f
	.long	0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5
	.long	0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121
	.long	0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2
	.long	0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec
	.long	0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717
	.long	0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d
	.long	0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373
	.long	0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc
	.long	0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888
	.long	0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414
	.long	0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb
	.long	0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a
	.long	0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c
	.long	0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262
	.long	0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979
	.long	0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d
	.long	0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9
	.long	0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea
	.long	0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808
	.long	0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e
	.long	0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6
	.long	0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f
	.long	0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a
	.long	0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666
	.long	0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e
	.long	0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9
	.long	0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e
	.long	0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111
	.long	0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494
	.long	0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9
	.long	0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf
	.long	0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d
	.long	0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868
	.long	0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f
	.long	0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616
Te2:
	.long	0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b
	.long	0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5
	.long	0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b
	.long	0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76
	.long	0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d
	.long	0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0
	.long	0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af
	.long	0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0
	.long	0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26
	.long	0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc
	.long	0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1
	.long	0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15
	.long	0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3
	.long	0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a
	.long	0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2
	.long	0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75
	.long	0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a
	.long	0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0
	.long	0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3
	.long	0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384
	.long	0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed
	.long	0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b
	.long	0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239
	.long	0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf
	.long	0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb
	.long	0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185
	.long	0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f
	.long	0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8
	.long	0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f
	.long	0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5
	.long	0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221
	.long	0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2
	.long	0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec
	.long	0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17
	.long	0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d
	.long	0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673
	.long	0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc
	.long	0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88
	.long	0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814
	.long	0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb
	.long	0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a
	.long	0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c
	.long	0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462
	.long	0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279
	.long	0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d
	.long	0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9
	.long	0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea
	.long	0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008
	.long	0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e
	.long	0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6
	.long	0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f
	.long	0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a
	.long	0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66
	.long	0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e
	.long	0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9
	.long	0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e
	.long	0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211
	.long	0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394
	.long	0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9
	.long	0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df
	.long	0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d
	.long	0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068
	.long	0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f
	.long	0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16
Te3:
	.long	0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6
	.long	0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491
	.long	0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56
	.long	0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec
	.long	0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa
	.long	0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb
	.long	0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45
	.long	0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b
	.long	0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c
	.long	0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83
	.long	0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9
	.long	0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a
	.long	0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d
	.long	0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f
	.long	0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf
	.long	0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea
	.long	0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34
	.long	0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b
	.long	0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d
	.long	0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713
	.long	0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1
	.long	0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6
	.long	0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72
	.long	0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85
	.long	0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed
	.long	0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411
	.long	0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe
	.long	0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b
	.long	0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05
	.long	0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1
	.long	0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342
	.long	0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf
	.long	0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3
	.long	0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e
	.long	0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a
	.long	0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6
	.long	0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3
	.long	0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b
	.long	0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28
	.long	0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad
	.long	0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14
	.long	0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8
	.long	0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4
	.long	0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2
	.long	0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da
	.long	0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049
	.long	0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf
	.long	0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810
	.long	0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c
	.long	0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197
	.long	0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e
	.long	0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f
	.long	0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc
	.long	0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c
	.long	0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069
	.long	0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927
	.long	0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322
	.long	0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733
	.long	0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9
	.long	0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5
	.long	0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a
	.long	0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0
	.long	0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e
	.long	0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c

Td0:
	.long	0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96
	.long	0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393
	.long	0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25
	.long	0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f
	.long	0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1
	.long	0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6
	.long	0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da
	.long	0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844
	.long	0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd
	.long	0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4
	.long	0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45
	.long	0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94
	.long	0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7
	.long	0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a
	.long	0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5
	.long	0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c
	.long	0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1
	.long	0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a
	.long	0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75
	.long	0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051
	.long	0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46
	.long	0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff
	.long	0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77
	.long	0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb
	.long	0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000
	.long	0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e
	.long	0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927
	.long	0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a
	.long	0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e
	.long	0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16
	.long	0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d
	.long	0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8
	.long	0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd
	.long	0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34
	.long	0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163
	.long	0xd731dcca, 0x42638510, 0x13972240, 0x84c61120
	.long	0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d
	.long	0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0
	.long	0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422
	.long	0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef
	.long	0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36
	.long	0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4
	.long	0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662
	.long	0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5
	.long	0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3
	.long	0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b
	.long	0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8
	.long	0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6
	.long	0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6
	.long	0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0
	.long	0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815
	.long	0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f
	.long	0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df
	.long	0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f
	.long	0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e
	.long	0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713
	.long	0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89
	.long	0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c
	.long	0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf
	.long	0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86
	.long	0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f
	.long	0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541
	.long	0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190
	.long	0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742
Td1:
	.long	0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e
	.long	0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303
	.long	0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c
	.long	0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3
	.long	0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0
	.long	0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9
	.long	0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259
	.long	0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8
	.long	0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971
	.long	0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a
	.long	0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f
	.long	0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b
	.long	0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8
	.long	0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab
	.long	0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708
	.long	0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682
	.long	0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2
	.long	0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe
	.long	0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb
	.long	0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10
	.long	0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd
	.long	0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015
	.long	0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e
	.long	0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee
	.long	0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000
	.long	0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72
	.long	0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39
	.long	0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e
	.long	0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91
	.long	0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a
	.long	0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17
	.long	0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9
	.long	0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60
	.long	0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e
	.long	0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1
	.long	0xcad731dc, 0x10426385, 0x40139722, 0x2084c611
	.long	0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1
	.long	0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3
	.long	0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964
	.long	0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390
	.long	0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b
	.long	0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf
	.long	0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46
	.long	0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af
	.long	0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512
	.long	0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb
	.long	0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a
	.long	0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8
	.long	0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c
	.long	0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266
	.long	0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8
	.long	0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6
	.long	0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604
	.long	0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551
	.long	0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41
	.long	0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647
	.long	0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c
	.long	0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1
	.long	0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737
	.long	0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db
	.long	0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340
	.long	0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95
	.long	0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1
	.long	0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857
Td2:
	.long	0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27
	.long	0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3
	.long	0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502
	.long	0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562
	.long	0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe
	.long	0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3
	.long	0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552
	.long	0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9
	.long	0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9
	.long	0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce
	.long	0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253
	.long	0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908
	.long	0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b
	.long	0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655
	.long	0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337
	.long	0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16
	.long	0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69
	.long	0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6
	.long	0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6
	.long	0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e
	.long	0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6
	.long	0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050
	.long	0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9
	.long	0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8
	.long	0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000
	.long	0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a
	.long	0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d
	.long	0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436
	.long	0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b
	.long	0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12
	.long	0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b
	.long	0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e
	.long	0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f
	.long	0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb
	.long	0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4
	.long	0xdccad731, 0x85104263, 0x22401397, 0x112084c6
	.long	0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729
	.long	0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1
	.long	0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9
	.long	0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233
	.long	0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4
	.long	0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad
	.long	0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e
	.long	0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3
	.long	0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25
	.long	0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b
	.long	0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f
	.long	0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15
	.long	0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0
	.long	0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2
	.long	0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7
	.long	0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791
	.long	0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496
	.long	0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665
	.long	0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b
	.long	0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6
	.long	0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13
	.long	0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47
	.long	0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7
	.long	0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844
	.long	0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3
	.long	0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d
	.long	0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456
	.long	0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8
Td3:
	.long	0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a
	.long	0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b
	.long	0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5
	.long	0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5
	.long	0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d
	.long	0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b
	.long	0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95
	.long	0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e
	.long	0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27
	.long	0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d
	.long	0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562
	.long	0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9
	.long	0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752
	.long	0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66
	.long	0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3
	.long	0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced
	.long	0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e
	.long	0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4
	.long	0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4
	.long	0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd
	.long	0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d
	.long	0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60
	.long	0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767
	.long	0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79
	.long	0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000
	.long	0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c
	.long	0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736
	.long	0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24
	.long	0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b
	.long	0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c
	.long	0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12
	.long	0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814
	.long	0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3
	.long	0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b
	.long	0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8
	.long	0x31dccad7, 0x63851042, 0x97224013, 0xc6112084
	.long	0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7
	.long	0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077
	.long	0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247
	.long	0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22
	.long	0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698
	.long	0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f
	.long	0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254
	.long	0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582
	.long	0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf
	.long	0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb
	.long	0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883
	.long	0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef
	.long	0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629
	.long	0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035
	.long	0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533
	.long	0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17
	.long	0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4
	.long	0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46
	.long	0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb
	.long	0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d
	.long	0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb
	.long	0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a
	.long	0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73
	.long	0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678
	.long	0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2
	.long	0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff
	.long	0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064
	.long	0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0
Td4:
	.byte	0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38
	.byte	0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb
	.byte	0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87
	.byte	0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb
	.byte	0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d
	.byte	0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e
	.byte	0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2
	.byte	0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25
	.byte	0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16
	.byte	0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92
	.byte	0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda
	.byte	0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84
	.byte	0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a
	.byte	0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06
	.byte	0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02
	.byte	0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b
	.byte	0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea
	.byte	0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73
	.byte	0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85
	.byte	0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e
	.byte	0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89
	.byte	0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b
	.byte	0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20
	.byte	0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4
	.byte	0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31
	.byte	0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f
	.byte	0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d
	.byte	0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef
	.byte	0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0
	.byte	0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61
	.byte	0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26
	.byte	0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d

rcon_byte:
	.byte	0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36
