aes-x86_64.pl revision 656d9c7f52f88b3a3daccafa7655dec086c4756e
1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#!/usr/bin/env perl
2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#
3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# ====================================================================
4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# Written by Andy Polyakov <appro@fy.chalmers.se> for the OpenSSL
5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# project. Rights for redistribution and usage in source and binary
6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# forms are granted according to the OpenSSL license.
7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# ====================================================================
8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#
9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# Version 1.2.
10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#
11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# aes-*-cbc benchmarks are improved by >70% [compared to gcc 3.3.2 on
12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# Opteron 240 CPU] plus all the bells-n-whistles from 32-bit version
13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# [you'll notice a lot of resemblance], such as compressed S-boxes
14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# in little-endian byte order, prefetch of these tables in CBC mode,
15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# as well as avoiding L1 cache aliasing between stack frame and key
16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# schedule and already mentioned tables, compressed Td4...
17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#
18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# Performance in number of cycles per processed byte for 128-bit key:
19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#
20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#		ECB		CBC encrypt
21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# AMD64		13.7		13.0(*)
22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# EM64T		20.2		18.6(*)
23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#
24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# (*)	CBC benchmarks are better than ECB thanks to custom ABI used
25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#	by the private block encryption function.
26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$verticalspin=1;	# unlike 32-bit version $verticalspin performs
28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			# ~15% better on both AMD and Intel cores
29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$output=shift;
30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectopen STDOUT,"| $^X ../perlasm/x86_64-xlate.pl $output";
31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code=".text\n";
33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$s0="%eax";
35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$s1="%ebx";
36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$s2="%ecx";
37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$s3="%edx";
38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$acc0="%esi";
39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$acc1="%edi";
40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$acc2="%ebp";
41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$inp="%r8";
42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$out="%r9";
43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$t0="%r10d";
44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$t1="%r11d";
45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$t2="%r12d";
46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$rnds="%r13d";
47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$sbox="%r14";
48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$key="%r15";
49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub hi() { my $r=shift;	$r =~ s/%[er]([a-d])x/%\1h/;	$r; }
51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub lo() { my $r=shift;	$r =~ s/%[er]([a-d])x/%\1l/;
52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			$r =~ s/%[er]([sd]i)/%\1l/;
53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			$r =~ s/%(r[0-9]+)[d]?/%\1b/;	$r; }
54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub _data_word()
55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ my $i;
56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    while(defined($i=shift)) { $code.=sprintf".long\t0x%08x,0x%08x\n",$i,$i; }
57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub data_word()
59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ my $i;
60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  my $last=pop(@_);
61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    $code.=".long\t";
62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    while(defined($i=shift)) { $code.=sprintf"0x%08x,",$i; }
63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    $code.=sprintf"0x%08x\n",$last;
64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub data_byte()
67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ my $i;
68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  my $last=pop(@_);
69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    $code.=".byte\t";
70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    while(defined($i=shift)) { $code.=sprintf"0x%02x,",$i&0xff; }
71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    $code.=sprintf"0x%02x\n",$last&0xff;
72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub encvert()
75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ my $t3="%r8d";	# zaps $inp!
76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	# favor 3-way issue Opteron pipeline...
79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s0")`,$acc0
80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s1")`,$acc1
81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s2")`,$acc2
82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	0($sbox,$acc0,8),$t0
83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	0($sbox,$acc1,8),$t1
84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	0($sbox,$acc2,8),$t2
85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s1")`,$acc0
87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s2")`,$acc1
88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s3")`,$acc2
89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	3($sbox,$acc0,8),$t0
90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	3($sbox,$acc1,8),$t1
91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	0($sbox,$acc2,8),$t3
92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s3")`,$acc0
94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shr	\$16,$s2
95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s0")`,$acc2
96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	3($sbox,$acc0,8),$t2
97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shr	\$16,$s3
98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	3($sbox,$acc2,8),$t3
99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shr	\$16,$s1
101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	lea	16($key),$key
102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shr	\$16,$s0
103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s2")`,$acc0
105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s3")`,$acc1
106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s0")`,$acc2
107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	2($sbox,$acc0,8),$t0
108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	2($sbox,$acc1,8),$t1
109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	2($sbox,$acc2,8),$t2
110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s3")`,$acc0
112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s0")`,$acc1
113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s1")`,$acc2
114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	1($sbox,$acc0,8),$t0
115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	1($sbox,$acc1,8),$t1
116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	2($sbox,$acc2,8),$t3
117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	12($key),$s3
119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s1")`,$acc1
120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s2")`,$acc2
121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	0($key),$s0
122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	1($sbox,$acc1,8),$t2
123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	1($sbox,$acc2,8),$t3
124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	4($key),$s1
126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	8($key),$s2
127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$t0,$s0
128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$t1,$s1
129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$t2,$s2
130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$t3,$s3
131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub enclastvert()
135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ my $t3="%r8d";	# zaps $inp!
136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s0")`,$acc0
139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s1")`,$acc1
140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s2")`,$acc2
141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	2($sbox,$acc0,8),$t0
142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	2($sbox,$acc1,8),$t1
143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	2($sbox,$acc2,8),$t2
144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$0x000000ff,$t0
146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$0x000000ff,$t1
147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$0x000000ff,$t2
148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s3")`,$acc0
150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s1")`,$acc1
151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s2")`,$acc2
152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	2($sbox,$acc0,8),$t3
153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	0($sbox,$acc1,8),$acc1	#$t0
154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	0($sbox,$acc2,8),$acc2	#$t1
155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$0x000000ff,$t3
157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$0x0000ff00,$acc1
158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$0x0000ff00,$acc2
159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$acc1,$t0
161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$acc2,$t1
162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shr	\$16,$s2
163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s3")`,$acc0
165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s0")`,$acc1
166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shr	\$16,$s3
167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	0($sbox,$acc0,8),$acc0	#$t2
168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	0($sbox,$acc1,8),$acc1	#$t3
169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$0x0000ff00,$acc0
171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$0x0000ff00,$acc1
172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shr	\$16,$s1
173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$acc0,$t2
174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$acc1,$t3
175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shr	\$16,$s0
176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s2")`,$acc0
178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s3")`,$acc1
179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s0")`,$acc2
180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	0($sbox,$acc0,8),$acc0	#$t0
181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	0($sbox,$acc1,8),$acc1	#$t1
182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	0($sbox,$acc2,8),$acc2	#$t2
183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$0x00ff0000,$acc0
185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$0x00ff0000,$acc1
186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$0x00ff0000,$acc2
187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$acc0,$t0
189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$acc1,$t1
190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$acc2,$t2
191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s1")`,$acc0
193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s3")`,$acc1
194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s0")`,$acc2
195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	0($sbox,$acc0,8),$acc0	#$t3
196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	2($sbox,$acc1,8),$acc1	#$t0
197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	2($sbox,$acc2,8),$acc2	#$t1
198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$0x00ff0000,$acc0
200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$0xff000000,$acc1
201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$0xff000000,$acc2
202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$acc0,$t3
204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$acc1,$t0
205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$acc2,$t1
206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s1")`,$acc0
208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s2")`,$acc1
209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	16+12($key),$s3
210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	2($sbox,$acc0,8),$acc0	#$t2
211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	2($sbox,$acc1,8),$acc1	#$t3
212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	16+0($key),$s0
213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$0xff000000,$acc0
215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$0xff000000,$acc1
216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$acc0,$t2
218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$acc1,$t3
219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	16+4($key),$s1
221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	16+8($key),$s2
222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$t0,$s0
223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$t1,$s1
224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$t2,$s2
225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$t3,$s3
226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub encstep()
230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ my ($i,@s) = @_;
231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  my $tmp0=$acc0;
232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  my $tmp1=$acc1;
233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  my $tmp2=$acc2;
234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  my $out=($t0,$t1,$t2,$s[0])[$i];
235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ($i==3) {
237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		$tmp0=$s[1];
238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		$tmp1=$s[2];
239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		$tmp2=$s[3];
240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	movzb	".&lo($s[0]).",$out\n";
242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	$s[2],$tmp1\n"		if ($i!=3);
243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	lea	16($key),$key\n"	if ($i==0);
244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	movzb	".&hi($s[1]).",$tmp0\n";
246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	0($sbox,$out,8),$out\n";
247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	shr	\$16,$tmp1\n";
249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	$s[3],$tmp2\n"		if ($i!=3);
250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	xor	3($sbox,$tmp0,8),$out\n";
251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	movzb	".&lo($tmp1).",$tmp1\n";
253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	shr	\$24,$tmp2\n";
254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	xor	4*$i($key),$out\n";
255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	xor	2($sbox,$tmp1,8),$out\n";
257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	xor	1($sbox,$tmp2,8),$out\n";
258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	$t0,$s[1]\n"		if ($i==3);
260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	$t1,$s[2]\n"		if ($i==3);
261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	$t2,$s[3]\n"		if ($i==3);
262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="\n";
263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub enclast()
266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ my ($i,@s)=@_;
267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  my $tmp0=$acc0;
268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  my $tmp1=$acc1;
269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  my $tmp2=$acc2;
270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  my $out=($t0,$t1,$t2,$s[0])[$i];
271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ($i==3) {
273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		$tmp0=$s[1];
274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		$tmp1=$s[2];
275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		$tmp2=$s[3];
276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	movzb	".&lo($s[0]).",$out\n";
278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	$s[2],$tmp1\n"		if ($i!=3);
279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	2($sbox,$out,8),$out\n";
281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	shr	\$16,$tmp1\n";
282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	$s[3],$tmp2\n"		if ($i!=3);
283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	and	\$0x000000ff,$out\n";
285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	movzb	".&hi($s[1]).",$tmp0\n";
286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	movzb	".&lo($tmp1).",$tmp1\n";
287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	shr	\$24,$tmp2\n";
288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	0($sbox,$tmp0,8),$tmp0\n";
290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	0($sbox,$tmp1,8),$tmp1\n";
291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	2($sbox,$tmp2,8),$tmp2\n";
292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	and	\$0x0000ff00,$tmp0\n";
294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	and	\$0x00ff0000,$tmp1\n";
295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	and	\$0xff000000,$tmp2\n";
296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	xor	$tmp0,$out\n";
298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	$t0,$s[1]\n"		if ($i==3);
299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	xor	$tmp1,$out\n";
300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	$t1,$s[2]\n"		if ($i==3);
301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	xor	$tmp2,$out\n";
302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	$t2,$s[3]\n"		if ($i==3);
303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="\n";
304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.type	_x86_64_AES_encrypt,\@abi-omnipotent
308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	16
309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project_x86_64_AES_encrypt:
310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	0($key),$s0			# xor with key
311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	4($key),$s1
312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	8($key),$s2
313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	12($key),$s3
314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	240($key),$rnds			# load key->rounds
316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sub	\$1,$rnds
317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jmp	.Lenc_loop
318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	16
319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lenc_loop:
320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ($verticalspin) { &encvert(); }
322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else {	&encstep(0,$s0,$s1,$s2,$s3);
323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&encstep(1,$s1,$s2,$s3,$s0);
324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&encstep(2,$s2,$s3,$s0,$s1);
325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&encstep(3,$s3,$s0,$s1,$s2);
326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sub	\$1,$rnds
329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jnz	.Lenc_loop
330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ($verticalspin) { &enclastvert(); }
332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else {	&enclast(0,$s0,$s1,$s2,$s3);
333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&enclast(1,$s1,$s2,$s3,$s0);
334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&enclast(2,$s2,$s3,$s0,$s1);
335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&enclast(3,$s3,$s0,$s1,$s2);
336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		$code.=<<___;
337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	16+0($key),$s0		# xor with key
338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	16+4($key),$s1
339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	16+8($key),$s2
340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	16+12($key),$s3
341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	.byte	0xf3,0xc3			# rep ret
345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.size	_x86_64_AES_encrypt,.-_x86_64_AES_encrypt
346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# void AES_encrypt (const void *inp,void *out,const AES_KEY *key);
349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.globl	AES_encrypt
351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.type	AES_encrypt,\@function,3
352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	16
353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectAES_encrypt:
354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	push	%rbx
355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	push	%rbp
356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	push	%r12
357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	push	%r13
358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	push	%r14
359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	push	%r15
360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%rdx,$key
362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%rdi,$inp
363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%rsi,$out
364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	.picmeup	$sbox
366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	lea	AES_Te-.($sbox),$sbox
367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	0($inp),$s0
369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	4($inp),$s1
370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	8($inp),$s2
371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	12($inp),$s3
372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	call	_x86_64_AES_encrypt
374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$s0,0($out)
376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$s1,4($out)
377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$s2,8($out)
378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$s3,12($out)
379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	pop	%r15
381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	pop	%r14
382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	pop	%r13
383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	pop	%r12
384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	pop	%rbp
385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	pop	%rbx
386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret
387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.size	AES_encrypt,.-AES_encrypt
388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#------------------------------------------------------------------#
391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub decvert()
393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ my $t3="%r8d";	# zaps $inp!
394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	# favor 3-way issue Opteron pipeline...
397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s0")`,$acc0
398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s1")`,$acc1
399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s2")`,$acc2
400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	0($sbox,$acc0,8),$t0
401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	0($sbox,$acc1,8),$t1
402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	0($sbox,$acc2,8),$t2
403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s3")`,$acc0
405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s0")`,$acc1
406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s3")`,$acc2
407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	3($sbox,$acc0,8),$t0
408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	3($sbox,$acc1,8),$t1
409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	0($sbox,$acc2,8),$t3
410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s1")`,$acc0
412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shr	\$16,$s0
413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s2")`,$acc2
414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	3($sbox,$acc0,8),$t2
415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shr	\$16,$s3
416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	3($sbox,$acc2,8),$t3
417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shr	\$16,$s1
419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	lea	16($key),$key
420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shr	\$16,$s2
421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s2")`,$acc0
423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s3")`,$acc1
424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s0")`,$acc2
425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	2($sbox,$acc0,8),$t0
426656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	2($sbox,$acc1,8),$t1
427656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	2($sbox,$acc2,8),$t2
428656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
429656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s1")`,$acc0
430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s2")`,$acc1
431656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s1")`,$acc2
432656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	1($sbox,$acc0,8),$t0
433656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	1($sbox,$acc1,8),$t1
434656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	2($sbox,$acc2,8),$t3
435656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s3")`,$acc0
437656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	12($key),$s3
438656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s0")`,$acc2
439656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	1($sbox,$acc0,8),$t2
440656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	0($key),$s0
441656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	1($sbox,$acc2,8),$t3
442656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
443656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$t0,$s0
444656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	4($key),$s1
445656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	8($key),$s2
446656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$t2,$s2
447656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$t1,$s1
448656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$t3,$s3
449656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
450656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
451656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
452656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub declastvert()
453656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ my $t3="%r8d";	# zaps $inp!
454656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
455656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
456656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s0")`,$acc0
457656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s1")`,$acc1
458656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s2")`,$acc2
459656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	2048($sbox,$acc0,1),$t0
460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	2048($sbox,$acc1,1),$t1
461656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	2048($sbox,$acc2,1),$t2
462656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
463656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s3")`,$acc0
464656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s3")`,$acc1
465656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s0")`,$acc2
466656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	2048($sbox,$acc0,1),$t3
467656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	2048($sbox,$acc1,1),$acc1	#$t0
468656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	2048($sbox,$acc2,1),$acc2	#$t1
469656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
470656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shl	\$8,$acc1
471656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shl	\$8,$acc2
472656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
473656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$acc1,$t0
474656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$acc2,$t1
475656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shr	\$16,$s3
476656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
477656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s1")`,$acc0
478656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s2")`,$acc1
479656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shr	\$16,$s0
480656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	2048($sbox,$acc0,1),$acc0	#$t2
481656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	2048($sbox,$acc1,1),$acc1	#$t3
482656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
483656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shl	\$8,$acc0
484656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shl	\$8,$acc1
485656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shr	\$16,$s1
486656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$acc0,$t2
487656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$acc1,$t3
488656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shr	\$16,$s2
489656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
490656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s2")`,$acc0
491656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s3")`,$acc1
492656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s0")`,$acc2
493656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	2048($sbox,$acc0,1),$acc0	#$t0
494656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	2048($sbox,$acc1,1),$acc1	#$t1
495656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	2048($sbox,$acc2,1),$acc2	#$t2
496656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
497656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shl	\$16,$acc0
498656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shl	\$16,$acc1
499656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shl	\$16,$acc2
500656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
501656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$acc0,$t0
502656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$acc1,$t1
503656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$acc2,$t2
504656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
505656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s1")`,$acc0
506656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s1")`,$acc1
507656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s2")`,$acc2
508656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	2048($sbox,$acc0,1),$acc0	#$t3
509656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	2048($sbox,$acc1,1),$acc1	#$t0
510656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	2048($sbox,$acc2,1),$acc2	#$t1
511656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
512656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shl	\$16,$acc0
513656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shl	\$24,$acc1
514656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shl	\$24,$acc2
515656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
516656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$acc0,$t3
517656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$acc1,$t0
518656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$acc2,$t1
519656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
520656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s3")`,$acc0
521656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s0")`,$acc1
522656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	16+12($key),$s3
523656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	2048($sbox,$acc0,1),$acc0	#$t2
524656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	2048($sbox,$acc1,1),$acc1	#$t3
525656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	16+0($key),$s0
526656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
527656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shl	\$24,$acc0
528656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shl	\$24,$acc1
529656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
530656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$acc0,$t2
531656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$acc1,$t3
532656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
533656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	16+4($key),$s1
534656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	16+8($key),$s2
535656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$t0,$s0
536656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$t1,$s1
537656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$t2,$s2
538656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$t3,$s3
539656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
540656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
541656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
542656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub decstep()
543656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ my ($i,@s) = @_;
544656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  my $tmp0=$acc0;
545656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  my $tmp1=$acc1;
546656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  my $tmp2=$acc2;
547656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  my $out=($t0,$t1,$t2,$s[0])[$i];
548656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
549656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	$s[0],$out\n"		if ($i!=3);
550656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			$tmp1=$s[2]			if ($i==3);
551656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	$s[2],$tmp1\n"		if ($i!=3);
552656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	and	\$0xFF,$out\n";
553656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
554656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	0($sbox,$out,8),$out\n";
555656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	shr	\$16,$tmp1\n";
556656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			$tmp2=$s[3]			if ($i==3);
557656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	$s[3],$tmp2\n"		if ($i!=3);
558656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
559656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			$tmp0=$s[1]			if ($i==3);
560656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	movzb	".&hi($s[1]).",$tmp0\n";
561656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	and	\$0xFF,$tmp1\n";
562656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	shr	\$24,$tmp2\n";
563656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
564656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	xor	3($sbox,$tmp0,8),$out\n";
565656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	xor	2($sbox,$tmp1,8),$out\n";
566656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	xor	1($sbox,$tmp2,8),$out\n";
567656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
568656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	$t2,$s[1]\n"		if ($i==3);
569656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	$t1,$s[2]\n"		if ($i==3);
570656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	$t0,$s[3]\n"		if ($i==3);
571656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="\n";
572656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
573656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
574656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub declast()
575656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ my ($i,@s)=@_;
576656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  my $tmp0=$acc0;
577656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  my $tmp1=$acc1;
578656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  my $tmp2=$acc2;
579656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  my $out=($t0,$t1,$t2,$s[0])[$i];
580656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
581656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	$s[0],$out\n"		if ($i!=3);
582656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			$tmp1=$s[2]			if ($i==3);
583656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	$s[2],$tmp1\n"		if ($i!=3);
584656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	and	\$0xFF,$out\n";
585656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
586656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	movzb	2048($sbox,$out,1),$out\n";
587656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	shr	\$16,$tmp1\n";
588656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			$tmp2=$s[3]			if ($i==3);
589656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	$s[3],$tmp2\n"		if ($i!=3);
590656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
591656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			$tmp0=$s[1]			if ($i==3);
592656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	movzb	".&hi($s[1]).",$tmp0\n";
593656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	and	\$0xFF,$tmp1\n";
594656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	shr	\$24,$tmp2\n";
595656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
596656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	movzb	2048($sbox,$tmp0,1),$tmp0\n";
597656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	movzb	2048($sbox,$tmp1,1),$tmp1\n";
598656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	movzb	2048($sbox,$tmp2,1),$tmp2\n";
599656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
600656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	shl	\$8,$tmp0\n";
601656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	shl	\$16,$tmp1\n";
602656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	shl	\$24,$tmp2\n";
603656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
604656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	xor	$tmp0,$out\n";
605656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	$t2,$s[1]\n"		if ($i==3);
606656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	xor	$tmp1,$out\n";
607656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	$t1,$s[2]\n"		if ($i==3);
608656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	xor	$tmp2,$out\n";
609656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	$t0,$s[3]\n"		if ($i==3);
610656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="\n";
611656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
612656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
613656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
614656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.type	_x86_64_AES_decrypt,\@abi-omnipotent
615656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	16
616656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project_x86_64_AES_decrypt:
617656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	0($key),$s0			# xor with key
618656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	4($key),$s1
619656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	8($key),$s2
620656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	12($key),$s3
621656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
622656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	240($key),$rnds			# load key->rounds
623656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sub	\$1,$rnds
624656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jmp	.Ldec_loop
625656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	16
626656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Ldec_loop:
627656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
628656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ($verticalspin) { &decvert(); }
629656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else {	&decstep(0,$s0,$s3,$s2,$s1);
630656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&decstep(1,$s1,$s0,$s3,$s2);
631656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&decstep(2,$s2,$s1,$s0,$s3);
632656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&decstep(3,$s3,$s2,$s1,$s0);
633656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		$code.=<<___;
634656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		lea	16($key),$key
635656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	0($key),$s0			# xor with key
636656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	4($key),$s1
637656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	8($key),$s2
638656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	12($key),$s3
639656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
640656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
641656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
642656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sub	\$1,$rnds
643656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jnz	.Ldec_loop
644656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
645656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ($verticalspin) { &declastvert(); }
646656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else {	&declast(0,$s0,$s3,$s2,$s1);
647656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&declast(1,$s1,$s0,$s3,$s2);
648656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&declast(2,$s2,$s1,$s0,$s3);
649656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&declast(3,$s3,$s2,$s1,$s0);
650656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		$code.=<<___;
651656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	16+0($key),$s0			# xor with key
652656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	16+4($key),$s1
653656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	16+8($key),$s2
654656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	16+12($key),$s3
655656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
656656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
657656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
658656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	.byte	0xf3,0xc3			# rep ret
659656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.size	_x86_64_AES_decrypt,.-_x86_64_AES_decrypt
660656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
661656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
662656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# void AES_decrypt (const void *inp,void *out,const AES_KEY *key);
663656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
664656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.globl	AES_decrypt
665656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.type	AES_decrypt,\@function,3
666656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	16
667656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectAES_decrypt:
668656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	push	%rbx
669656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	push	%rbp
670656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	push	%r12
671656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	push	%r13
672656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	push	%r14
673656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	push	%r15
674656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
675656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%rdx,$key
676656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%rdi,$inp
677656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%rsi,$out
678656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
679656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	.picmeup	$sbox
680656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	lea	AES_Td-.($sbox),$sbox
681656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
682656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	# prefetch Td4
683656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	lea	2048+128($sbox),$sbox;
684656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	0-128($sbox),$s0
685656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	32-128($sbox),$s1
686656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	64-128($sbox),$s2
687656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	96-128($sbox),$s3
688656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	128-128($sbox),$s0
689656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	160-128($sbox),$s1
690656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	192-128($sbox),$s2
691656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	224-128($sbox),$s3
692656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	lea	-2048-128($sbox),$sbox;
693656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
694656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	0($inp),$s0
695656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	4($inp),$s1
696656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	8($inp),$s2
697656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	12($inp),$s3
698656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
699656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	call	_x86_64_AES_decrypt
700656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
701656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$s0,0($out)
702656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$s1,4($out)
703656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$s2,8($out)
704656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$s3,12($out)
705656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
706656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	pop	%r15
707656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	pop	%r14
708656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	pop	%r13
709656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	pop	%r12
710656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	pop	%rbp
711656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	pop	%rbx
712656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret
713656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.size	AES_decrypt,.-AES_decrypt
714656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
715656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#------------------------------------------------------------------#
716656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
717656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub enckey()
718656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
719656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
720656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movz	%dl,%esi		# rk[i]>>0
721656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	2(%rbp,%rsi,8),%ebx
722656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movz	%dh,%esi		# rk[i]>>8
723656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$0xFF000000,%ebx
724656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	%ebx,%eax
725656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
726656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	2(%rbp,%rsi,8),%ebx
727656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shr	\$16,%edx
728656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$0x000000FF,%ebx
729656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movz	%dl,%esi		# rk[i]>>16
730656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	%ebx,%eax
731656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
732656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	0(%rbp,%rsi,8),%ebx
733656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movz	%dh,%esi		# rk[i]>>24
734656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$0x0000FF00,%ebx
735656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	%ebx,%eax
736656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
737656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	0(%rbp,%rsi,8),%ebx
738656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$0x00FF0000,%ebx
739656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	%ebx,%eax
740656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
741656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	2048(%rbp,%rcx,4),%eax		# rcon
742656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
743656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
744656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
745656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# int AES_set_encrypt_key(const unsigned char *userKey, const int bits,
746656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#                        AES_KEY *key)
747656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
748656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.globl	AES_set_encrypt_key
749656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.type	AES_set_encrypt_key,\@function,3
750656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	16
751656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectAES_set_encrypt_key:
752656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	push	%rbx
753656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	push	%rbp
754656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
755656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%esi,%ecx			# %ecx=bits
756656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%rdi,%rsi			# %rsi=userKey
757656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%rdx,%rdi			# %rdi=key
758656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
759656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	test	\$-1,%rsi
760656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jz	.Lbadpointer
761656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	test	\$-1,%rdi
762656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jz	.Lbadpointer
763656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
764656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	.picmeup %rbp
765656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	lea	AES_Te-.(%rbp),%rbp
766656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
767656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	cmp	\$128,%ecx
768656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	je	.L10rounds
769656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	cmp	\$192,%ecx
770656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	je	.L12rounds
771656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	cmp	\$256,%ecx
772656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	je	.L14rounds
773656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	\$-2,%rax			# invalid number of bits
774656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jmp	.Lexit
775656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
776656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.L10rounds:
777656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	0(%rsi),%eax			# copy first 4 dwords
778656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	4(%rsi),%ebx
779656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	8(%rsi),%ecx
780656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	12(%rsi),%edx
781656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%eax,0(%rdi)
782656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%ebx,4(%rdi)
783656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%ecx,8(%rdi)
784656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%edx,12(%rdi)
785656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
786656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	%ecx,%ecx
787656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jmp	.L10shortcut
788656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	4
789656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.L10loop:
790656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	0(%rdi),%eax			# rk[0]
791656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	12(%rdi),%edx			# rk[3]
792656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.L10shortcut:
793656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
794656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&enckey	();
795656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
796656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%eax,16(%rdi)			# rk[4]
797656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	4(%rdi),%eax
798656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%eax,20(%rdi)			# rk[5]
799656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	8(%rdi),%eax
800656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%eax,24(%rdi)			# rk[6]
801656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	12(%rdi),%eax
802656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%eax,28(%rdi)			# rk[7]
803656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		add	\$1,%ecx
804656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		lea	16(%rdi),%rdi
805656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		cmp	\$10,%ecx
806656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jl	.L10loop
807656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
808656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movl	\$10,80(%rdi)			# setup number of rounds
809656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	%rax,%rax
810656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jmp	.Lexit
811656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
812656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.L12rounds:
813656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	0(%rsi),%eax			# copy first 6 dwords
814656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	4(%rsi),%ebx
815656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	8(%rsi),%ecx
816656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	12(%rsi),%edx
817656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%eax,0(%rdi)
818656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%ebx,4(%rdi)
819656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%ecx,8(%rdi)
820656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%edx,12(%rdi)
821656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	16(%rsi),%ecx
822656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	20(%rsi),%edx
823656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%ecx,16(%rdi)
824656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%edx,20(%rdi)
825656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
826656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	%ecx,%ecx
827656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jmp	.L12shortcut
828656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	4
829656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.L12loop:
830656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	0(%rdi),%eax			# rk[0]
831656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	20(%rdi),%edx			# rk[5]
832656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.L12shortcut:
833656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
834656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&enckey	();
835656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
836656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%eax,24(%rdi)			# rk[6]
837656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	4(%rdi),%eax
838656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%eax,28(%rdi)			# rk[7]
839656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	8(%rdi),%eax
840656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%eax,32(%rdi)			# rk[8]
841656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	12(%rdi),%eax
842656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%eax,36(%rdi)			# rk[9]
843656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
844656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		cmp	\$7,%ecx
845656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		je	.L12break
846656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		add	\$1,%ecx
847656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
848656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	16(%rdi),%eax
849656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%eax,40(%rdi)			# rk[10]
850656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	20(%rdi),%eax
851656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%eax,44(%rdi)			# rk[11]
852656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
853656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		lea	24(%rdi),%rdi
854656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jmp	.L12loop
855656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.L12break:
856656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movl	\$12,72(%rdi)		# setup number of rounds
857656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	%rax,%rax
858656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jmp	.Lexit
859656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
860656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.L14rounds:
861656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	0(%rsi),%eax			# copy first 8 dwords
862656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	4(%rsi),%ebx
863656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	8(%rsi),%ecx
864656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	12(%rsi),%edx
865656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%eax,0(%rdi)
866656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%ebx,4(%rdi)
867656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%ecx,8(%rdi)
868656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%edx,12(%rdi)
869656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	16(%rsi),%eax
870656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	20(%rsi),%ebx
871656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	24(%rsi),%ecx
872656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	28(%rsi),%edx
873656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%eax,16(%rdi)
874656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%ebx,20(%rdi)
875656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%ecx,24(%rdi)
876656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%edx,28(%rdi)
877656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
878656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	%ecx,%ecx
879656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jmp	.L14shortcut
880656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	4
881656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.L14loop:
882656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	28(%rdi),%edx			# rk[4]
883656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.L14shortcut:
884656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	0(%rdi),%eax			# rk[0]
885656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
886656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&enckey	();
887656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
888656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%eax,32(%rdi)			# rk[8]
889656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	4(%rdi),%eax
890656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%eax,36(%rdi)			# rk[9]
891656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	8(%rdi),%eax
892656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%eax,40(%rdi)			# rk[10]
893656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	12(%rdi),%eax
894656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%eax,44(%rdi)			# rk[11]
895656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
896656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		cmp	\$6,%ecx
897656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		je	.L14break
898656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		add	\$1,%ecx
899656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
900656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%eax,%edx
901656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	16(%rdi),%eax			# rk[4]
902656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		movz	%dl,%esi			# rk[11]>>0
903656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	2(%rbp,%rsi,8),%ebx
904656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		movz	%dh,%esi			# rk[11]>>8
905656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		and	\$0x000000FF,%ebx
906656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	%ebx,%eax
907656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
908656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	0(%rbp,%rsi,8),%ebx
909656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		shr	\$16,%edx
910656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		and	\$0x0000FF00,%ebx
911656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		movz	%dl,%esi			# rk[11]>>16
912656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	%ebx,%eax
913656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
914656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	0(%rbp,%rsi,8),%ebx
915656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		movz	%dh,%esi			# rk[11]>>24
916656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		and	\$0x00FF0000,%ebx
917656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	%ebx,%eax
918656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
919656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	2(%rbp,%rsi,8),%ebx
920656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		and	\$0xFF000000,%ebx
921656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	%ebx,%eax
922656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
923656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%eax,48(%rdi)			# rk[12]
924656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	20(%rdi),%eax
925656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%eax,52(%rdi)			# rk[13]
926656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	24(%rdi),%eax
927656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%eax,56(%rdi)			# rk[14]
928656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	28(%rdi),%eax
929656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%eax,60(%rdi)			# rk[15]
930656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
931656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		lea	32(%rdi),%rdi
932656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jmp	.L14loop
933656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.L14break:
934656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movl	\$14,48(%rdi)		# setup number of rounds
935656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	%rax,%rax
936656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jmp	.Lexit
937656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
938656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lbadpointer:
939656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	\$-1,%rax
940656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lexit:
941656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	pop	%rbp
942656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	pop	%rbx
943656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret
944656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.size	AES_set_encrypt_key,.-AES_set_encrypt_key
945656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
946656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
947656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub deckey()
948656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ my ($i,$ptr,$te,$td) = @_;
949656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
950656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$i($ptr),%eax
951656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%eax,%edx
952656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movz	%ah,%ebx
953656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shr	\$16,%edx
954656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$0xFF,%eax
955656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	2($te,%rax,8),%rax
956656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	2($te,%rbx,8),%rbx
957656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	0($td,%rax,8),%eax
958656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	3($td,%rbx,8),%eax
959656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	%dh,%ebx
960656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$0xFF,%edx
961656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	2($te,%rdx,8),%rdx
962656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	2($te,%rbx,8),%rbx
963656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	2($td,%rdx,8),%eax
964656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	1($td,%rbx,8),%eax
965656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%eax,$i($ptr)
966656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
967656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
968656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
969656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# int AES_set_decrypt_key(const unsigned char *userKey, const int bits,
970656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#                        AES_KEY *key)
971656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
972656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.globl	AES_set_decrypt_key
973656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.type	AES_set_decrypt_key,\@function,3
974656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	16
975656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectAES_set_decrypt_key:
976656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	push	%rdx
977656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	call	AES_set_encrypt_key
978656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	cmp	\$0,%eax
979656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	je	.Lproceed
980656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	lea	24(%rsp),%rsp
981656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret
982656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lproceed:
983656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	(%rsp),%r8		# restore key schedule
984656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%rbx,(%rsp)
985656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
986656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	240(%r8),%ecx		# pull number of rounds
987656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	%rdi,%rdi
988656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	lea	(%rdi,%rcx,4),%rcx
989656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%r8,%rsi
990656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	lea	(%r8,%rcx,4),%rdi	# pointer to last chunk
991656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	4
992656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Linvert:
993656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	0(%rsi),%rax
994656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	8(%rsi),%rbx
995656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	0(%rdi),%rcx
996656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	8(%rdi),%rdx
997656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%rax,0(%rdi)
998656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%rbx,8(%rdi)
999656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%rcx,0(%rsi)
1000656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%rdx,8(%rsi)
1001656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		lea	16(%rsi),%rsi
1002656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		lea	-16(%rdi),%rdi
1003656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		cmp	%rsi,%rdi
1004656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jne	.Linvert
1005656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1006656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	.picmeup %r9
1007656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	lea	AES_Td-.(%r9),%rdi
1008656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	lea	AES_Te-AES_Td(%rdi),%r9
1009656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1010656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%r8,%rsi
1011656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	240(%r8),%ecx		# pull number of rounds
1012656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sub	\$1,%ecx
1013656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	4
1014656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lpermute:
1015656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		lea	16(%rsi),%rsi
1016656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
1017656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&deckey	(0,"%rsi","%r9","%rdi");
1018656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&deckey	(4,"%rsi","%r9","%rdi");
1019656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&deckey	(8,"%rsi","%r9","%rdi");
1020656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&deckey	(12,"%rsi","%r9","%rdi");
1021656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
1022656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sub	\$1,%ecx
1023656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jnz	.Lpermute
1024656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1025656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	%rax,%rax
1026656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	pop	%rbx
1027656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret
1028656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.size	AES_set_decrypt_key,.-AES_set_decrypt_key
1029656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
1030656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1031656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# void AES_cbc_encrypt (const void char *inp, unsigned char *out,
1032656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#			size_t length, const AES_KEY *key,
1033656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#			unsigned char *ivp,const int enc);
1034656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
1035656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# stack frame layout
1036656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# -8(%rsp)		return address
1037656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectmy $_rsp="0(%rsp)";		# saved %rsp
1038656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectmy $_len="8(%rsp)";		# copy of 3rd parameter, length
1039656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectmy $_key="16(%rsp)";		# copy of 4th parameter, key
1040656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectmy $_ivp="24(%rsp)";		# copy of 5th parameter, ivp
1041656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectmy $keyp="32(%rsp)";		# one to pass as $key
1042656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectmy $ivec="40(%rsp)";		# ivec[16]
1043656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectmy $aes_key="56(%rsp)";		# copy of aes_key
1044656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectmy $mark="56+240(%rsp)";	# copy of aes_key->rounds
1045656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1046656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
1047656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.globl	AES_cbc_encrypt
1048656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.type	AES_cbc_encrypt,\@function,6
1049656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	16
1050656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectAES_cbc_encrypt:
1051656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	cmp	\$0,%rdx	# check length
1052656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	je	.Lcbc_just_ret
1053656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	push	%rbx
1054656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	push	%rbp
1055656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	push	%r12
1056656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	push	%r13
1057656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	push	%r14
1058656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	push	%r15
1059656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	pushfq
1060656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	cld
1061656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%r9d,%r9d	# clear upper half of enc
1062656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1063656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	.picmeup $sbox
1064656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_pic_point:
1065656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1066656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	cmp	\$0,%r9
1067656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	je	.LDECRYPT
1068656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1069656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	lea	AES_Te-.Lcbc_pic_point($sbox),$sbox
1070656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1071656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	# allocate aligned stack frame...
1072656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	lea	-64-248(%rsp),$key
1073656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$-64,$key
1074656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1075656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	# ... and make it doesn't alias with AES_Te modulo 4096
1076656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$sbox,%r10
1077656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	lea	2048($sbox),%r11
1078656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$key,%r12
1079656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$0xFFF,%r10	# s = $sbox&0xfff
1080656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$0xFFF,%r11	# e = ($sbox+2048)&0xfff
1081656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$0xFFF,%r12	# p = %rsp&0xfff
1082656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1083656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	cmp	%r11,%r12	# if (p=>e) %rsp =- (p-e);
1084656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jb	.Lcbc_te_break_out
1085656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sub	%r11,%r12
1086656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sub	%r12,$key
1087656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jmp	.Lcbc_te_ok
1088656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_te_break_out:		# else %rsp -= (p-s)&0xfff + framesz
1089656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sub	%r10,%r12
1090656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$0xFFF,%r12
1091656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	add	\$320,%r12
1092656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sub	%r12,$key
1093656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	4
1094656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_te_ok:
1095656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1096656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xchg	%rsp,$key
1097656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	add	\$8,%rsp	# reserve for return address!
1098656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$key,$_rsp	# save %rsp
1099656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%rdx,$_len	# save copy of len
1100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%rcx,$_key	# save copy of key
1101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%r8,$_ivp	# save copy of ivp
1102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movl	\$0,$mark	# copy of aes_key->rounds = 0;
1103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%r8,%rbp	# rearrange input arguments
1104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%rsi,$out
1105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%rdi,$inp
1106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%rcx,$key
1107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	# do we copy key schedule to stack?
1109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$key,%r10
1110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sub	$sbox,%r10
1111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$0xfff,%r10
1112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	cmp	\$2048,%r10
1113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jb	.Lcbc_do_ecopy
1114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	cmp	\$4096-248,%r10
1115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jb	.Lcbc_skip_ecopy
1116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	4
1117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_do_ecopy:
1118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	$key,%rsi
1119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		lea	$aes_key,%rdi
1120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		lea	$aes_key,$key
1121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	\$240/8,%ecx
1122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		.long	0x90A548F3	# rep movsq
1123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	(%rsi),%eax	# copy aes_key->rounds
1124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%eax,(%rdi)
1125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_skip_ecopy:
1126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$key,$keyp	# save key pointer
1127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	\$16,%ecx
1129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	4
1130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_prefetch_te:
1131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	0($sbox),%r10
1132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	32($sbox),%r11
1133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	64($sbox),%r12
1134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	96($sbox),%r13
1135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		lea	128($sbox),$sbox
1136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sub	\$1,%ecx
1137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jnz	.Lcbc_prefetch_te
1138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sub	\$2048,$sbox
1139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	test	\$-16,%rdx		# check upon length
1141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%rdx,%r10
1142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	0(%rbp),$s0		# load iv
1143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	4(%rbp),$s1
1144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	8(%rbp),$s2
1145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	12(%rbp),$s3
1146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jz	.Lcbc_enc_tail		# short input...
1147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	4
1149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_enc_loop:
1150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	0($inp),$s0
1151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	4($inp),$s1
1152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	8($inp),$s2
1153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	12($inp),$s3
1154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	$inp,$ivec	# if ($verticalspin) save inp
1155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	$keyp,$key	# restore key
1157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		call	_x86_64_AES_encrypt
1158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	$ivec,$inp	# if ($verticalspin) restore inp
1160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	$s0,0($out)
1161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	$s1,4($out)
1162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	$s2,8($out)
1163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	$s3,12($out)
1164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	$_len,%r10
1166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		lea	16($inp),$inp
1167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		lea	16($out),$out
1168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sub	\$16,%r10
1169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		test	\$-16,%r10
1170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%r10,$_len
1171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jnz	.Lcbc_enc_loop
1172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	test	\$15,%r10
1173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jnz	.Lcbc_enc_tail
1174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$_ivp,%rbp	# restore ivp
1175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$s0,0(%rbp)	# save ivec
1176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$s1,4(%rbp)
1177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$s2,8(%rbp)
1178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$s3,12(%rbp)
1179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	4
1181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_cleanup:
1182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	cmpl	\$0,$mark	# was the key schedule copied?
1183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	lea	$aes_key,%rdi
1184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$_rsp,%rsp
1185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	je	.Lcbc_exit
1186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	\$240/8,%ecx
1187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	%rax,%rax
1188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		.long	0x90AB48F3	# rep stosq
1189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_exit:
1190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	popfq
1191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	pop	%r15
1192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	pop	%r14
1193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	pop	%r13
1194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	pop	%r12
1195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	pop	%rbp
1196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	pop	%rbx
1197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_just_ret:
1198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret
1199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	4
1200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_enc_tail:
1201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	cmp	$inp,$out
1202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	je	.Lcbc_enc_in_place
1203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%r10,%rcx
1204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$inp,%rsi
1205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$out,%rdi
1206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	.long	0xF689A4F3		# rep movsb
1207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_enc_in_place:
1208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	\$16,%rcx		# zero tail
1209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sub	%r10,%rcx
1210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	%rax,%rax
1211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	.long	0xF689AAF3		# rep stosb
1212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$out,$inp		# this is not a mistake!
1213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movq	\$16,$_len		# len=16
1214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jmp	.Lcbc_enc_loop		# one more spin...
1215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#----------------------------- DECRYPT -----------------------------#
1216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	16
1217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.LDECRYPT:
1218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	lea	AES_Td-.Lcbc_pic_point($sbox),$sbox
1219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	# allocate aligned stack frame...
1221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	lea	-64-248(%rsp),$key
1222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$-64,$key
1223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	# ... and make it doesn't alias with AES_Td modulo 4096
1225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$sbox,%r10
1226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	lea	2304($sbox),%r11
1227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$key,%r12
1228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$0xFFF,%r10	# s = $sbox&0xfff
1229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$0xFFF,%r11	# e = ($sbox+2048+256)&0xfff
1230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$0xFFF,%r12	# p = %rsp&0xfff
1231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	cmp	%r11,%r12	# if (p=>e) %rsp =- (p-e);
1233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jb	.Lcbc_td_break_out
1234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sub	%r11,%r12
1235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sub	%r12,$key
1236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jmp	.Lcbc_td_ok
1237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_td_break_out:		# else %rsp -= (p-s)&0xfff + framesz
1238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sub	%r10,%r12
1239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$0xFFF,%r12
1240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	add	\$320,%r12
1241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sub	%r12,$key
1242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	4
1243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_td_ok:
1244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xchg	%rsp,$key
1246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	add	\$8,%rsp	# reserve for return address!
1247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$key,$_rsp	# save %rsp
1248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%rdx,$_len	# save copy of len
1249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%rcx,$_key	# save copy of key
1250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%r8,$_ivp	# save copy of ivp
1251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movl	\$0,$mark	# copy of aes_key->rounds = 0;
1252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%r8,%rbp	# rearrange input arguments
1253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%rsi,$out
1254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%rdi,$inp
1255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%rcx,$key
1256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	# do we copy key schedule to stack?
1258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$key,%r10
1259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sub	$sbox,%r10
1260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$0xfff,%r10
1261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	cmp	\$2304,%r10
1262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jb	.Lcbc_do_dcopy
1263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	cmp	\$4096-248,%r10
1264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jb	.Lcbc_skip_dcopy
1265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	4
1266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_do_dcopy:
1267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	$key,%rsi
1268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		lea	$aes_key,%rdi
1269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		lea	$aes_key,$key
1270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	\$240/8,%ecx
1271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		.long	0x90A548F3	# rep movsq
1272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	(%rsi),%eax	# copy aes_key->rounds
1273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%eax,(%rdi)
1274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_skip_dcopy:
1275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$key,$keyp	# save key pointer
1276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	\$18,%ecx
1278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	4
1279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_prefetch_td:
1280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	0($sbox),%r10
1281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	32($sbox),%r11
1282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	64($sbox),%r12
1283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	96($sbox),%r13
1284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		lea	128($sbox),$sbox
1285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sub	\$1,%ecx
1286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jnz	.Lcbc_prefetch_td
1287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sub	\$2304,$sbox
1288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	cmp	$inp,$out
1290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	je	.Lcbc_dec_in_place
1291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%rbp,$ivec
1293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	4
1294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_dec_loop:
1295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	0($inp),$s0		# read input
1296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	4($inp),$s1
1297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	8($inp),$s2
1298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	12($inp),$s3
1299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	$inp,8+$ivec	# if ($verticalspin) save inp
1300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	$keyp,$key	# restore key
1302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		call	_x86_64_AES_decrypt
1303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	$ivec,%rbp	# load ivp
1305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	8+$ivec,$inp	# if ($verticalspin) restore inp
1306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	0(%rbp),$s0	# xor iv
1307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	4(%rbp),$s1
1308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	8(%rbp),$s2
1309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	12(%rbp),$s3
1310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	$inp,%rbp	# current input, next iv
1311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	$_len,%r10	# load len
1313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sub	\$16,%r10
1314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		jc	.Lcbc_dec_partial
1315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%r10,$_len	# update len
1316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%rbp,$ivec	# update ivp
1317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	$s0,0($out)	# write output
1319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	$s1,4($out)
1320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	$s2,8($out)
1321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	$s3,12($out)
1322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		lea	16($inp),$inp
1324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		lea	16($out),$out
1325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jnz	.Lcbc_dec_loop
1326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_dec_end:
1327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$_ivp,%r12		# load user ivp
1328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	0(%rbp),%r10		# load iv
1329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	8(%rbp),%r11
1330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%r10,0(%r12)		# copy back to user
1331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%r11,8(%r12)
1332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jmp	.Lcbc_cleanup
1333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	4
1335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_dec_partial:
1336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$s0,0+$ivec		# dump output to stack
1337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$s1,4+$ivec
1338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$s2,8+$ivec
1339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$s3,12+$ivec
1340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$out,%rdi
1341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	lea	$ivec,%rsi
1342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	\$16,%rcx
1343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	add	%r10,%rcx		# number of bytes to copy
1344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	.long	0xF689A4F3		# rep movsb
1345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jmp	.Lcbc_dec_end
1346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	16
1348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_dec_in_place:
1349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	0($inp),$s0	# load input
1350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	4($inp),$s1
1351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	8($inp),$s2
1352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	12($inp),$s3
1353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	$inp,$ivec	# if ($verticalspin) save inp
1355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	$keyp,$key
1356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		call	_x86_64_AES_decrypt
1357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	$ivec,$inp	# if ($verticalspin) restore inp
1359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	$_ivp,%rbp
1360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	0(%rbp),$s0
1361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	4(%rbp),$s1
1362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	8(%rbp),$s2
1363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	12(%rbp),$s3
1364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	0($inp),%r10	# copy input to iv
1366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	8($inp),%r11
1367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%r10,0(%rbp)
1368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%r11,8(%rbp)
1369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	$s0,0($out)	# save output [zaps input]
1371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	$s1,4($out)
1372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	$s2,8($out)
1373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	$s3,12($out)
1374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	$_len,%rcx
1376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		lea	16($inp),$inp
1377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		lea	16($out),$out
1378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sub	\$16,%rcx
1379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		jc	.Lcbc_dec_in_place_partial
1380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%rcx,$_len
1381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jnz	.Lcbc_dec_in_place
1382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jmp	.Lcbc_cleanup
1383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	4
1385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_dec_in_place_partial:
1386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	# one can argue if this is actually required
1387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	lea	($out,%rcx),%rdi
1388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	lea	(%rbp,%rcx),%rsi
1389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	neg	%rcx
1390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	.long	0xF689A4F3	# rep movsb	# restore tail
1391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jmp	.Lcbc_cleanup
1392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.size	AES_cbc_encrypt,.-AES_cbc_encrypt
1393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
1394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
1395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
1397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.globl	AES_Te
1398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	64
1399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectAES_Te:
1400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
1401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xa56363c6, 0x847c7cf8, 0x997777ee, 0x8d7b7bf6);
1402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x0df2f2ff, 0xbd6b6bd6, 0xb16f6fde, 0x54c5c591);
1403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x50303060, 0x03010102, 0xa96767ce, 0x7d2b2b56);
1404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x19fefee7, 0x62d7d7b5, 0xe6abab4d, 0x9a7676ec);
1405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x45caca8f, 0x9d82821f, 0x40c9c989, 0x877d7dfa);
1406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x15fafaef, 0xeb5959b2, 0xc947478e, 0x0bf0f0fb);
1407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xecadad41, 0x67d4d4b3, 0xfda2a25f, 0xeaafaf45);
1408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xbf9c9c23, 0xf7a4a453, 0x967272e4, 0x5bc0c09b);
1409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xc2b7b775, 0x1cfdfde1, 0xae93933d, 0x6a26264c);
1410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x5a36366c, 0x413f3f7e, 0x02f7f7f5, 0x4fcccc83);
1411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x5c343468, 0xf4a5a551, 0x34e5e5d1, 0x08f1f1f9);
1412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x937171e2, 0x73d8d8ab, 0x53313162, 0x3f15152a);
1413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x0c040408, 0x52c7c795, 0x65232346, 0x5ec3c39d);
1414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x28181830, 0xa1969637, 0x0f05050a, 0xb59a9a2f);
1415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x0907070e, 0x36121224, 0x9b80801b, 0x3de2e2df);
1416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x26ebebcd, 0x6927274e, 0xcdb2b27f, 0x9f7575ea);
1417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x1b090912, 0x9e83831d, 0x742c2c58, 0x2e1a1a34);
1418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x2d1b1b36, 0xb26e6edc, 0xee5a5ab4, 0xfba0a05b);
1419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xf65252a4, 0x4d3b3b76, 0x61d6d6b7, 0xceb3b37d);
1420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x7b292952, 0x3ee3e3dd, 0x712f2f5e, 0x97848413);
1421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xf55353a6, 0x68d1d1b9, 0x00000000, 0x2cededc1);
1422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x60202040, 0x1ffcfce3, 0xc8b1b179, 0xed5b5bb6);
1423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xbe6a6ad4, 0x46cbcb8d, 0xd9bebe67, 0x4b393972);
1424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xde4a4a94, 0xd44c4c98, 0xe85858b0, 0x4acfcf85);
1425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x6bd0d0bb, 0x2aefefc5, 0xe5aaaa4f, 0x16fbfbed);
1426656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xc5434386, 0xd74d4d9a, 0x55333366, 0x94858511);
1427656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xcf45458a, 0x10f9f9e9, 0x06020204, 0x817f7ffe);
1428656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xf05050a0, 0x443c3c78, 0xba9f9f25, 0xe3a8a84b);
1429656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xf35151a2, 0xfea3a35d, 0xc0404080, 0x8a8f8f05);
1430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xad92923f, 0xbc9d9d21, 0x48383870, 0x04f5f5f1);
1431656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xdfbcbc63, 0xc1b6b677, 0x75dadaaf, 0x63212142);
1432656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x30101020, 0x1affffe5, 0x0ef3f3fd, 0x6dd2d2bf);
1433656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x4ccdcd81, 0x140c0c18, 0x35131326, 0x2fececc3);
1434656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xe15f5fbe, 0xa2979735, 0xcc444488, 0x3917172e);
1435656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x57c4c493, 0xf2a7a755, 0x827e7efc, 0x473d3d7a);
1436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xac6464c8, 0xe75d5dba, 0x2b191932, 0x957373e6);
1437656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xa06060c0, 0x98818119, 0xd14f4f9e, 0x7fdcdca3);
1438656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x66222244, 0x7e2a2a54, 0xab90903b, 0x8388880b);
1439656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xca46468c, 0x29eeeec7, 0xd3b8b86b, 0x3c141428);
1440656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x79dedea7, 0xe25e5ebc, 0x1d0b0b16, 0x76dbdbad);
1441656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x3be0e0db, 0x56323264, 0x4e3a3a74, 0x1e0a0a14);
1442656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xdb494992, 0x0a06060c, 0x6c242448, 0xe45c5cb8);
1443656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x5dc2c29f, 0x6ed3d3bd, 0xefacac43, 0xa66262c4);
1444656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xa8919139, 0xa4959531, 0x37e4e4d3, 0x8b7979f2);
1445656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x32e7e7d5, 0x43c8c88b, 0x5937376e, 0xb76d6dda);
1446656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x8c8d8d01, 0x64d5d5b1, 0xd24e4e9c, 0xe0a9a949);
1447656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xb46c6cd8, 0xfa5656ac, 0x07f4f4f3, 0x25eaeacf);
1448656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xaf6565ca, 0x8e7a7af4, 0xe9aeae47, 0x18080810);
1449656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xd5baba6f, 0x887878f0, 0x6f25254a, 0x722e2e5c);
1450656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x241c1c38, 0xf1a6a657, 0xc7b4b473, 0x51c6c697);
1451656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x23e8e8cb, 0x7cdddda1, 0x9c7474e8, 0x211f1f3e);
1452656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xdd4b4b96, 0xdcbdbd61, 0x868b8b0d, 0x858a8a0f);
1453656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x907070e0, 0x423e3e7c, 0xc4b5b571, 0xaa6666cc);
1454656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xd8484890, 0x05030306, 0x01f6f6f7, 0x120e0e1c);
1455656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xa36161c2, 0x5f35356a, 0xf95757ae, 0xd0b9b969);
1456656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x91868617, 0x58c1c199, 0x271d1d3a, 0xb99e9e27);
1457656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x38e1e1d9, 0x13f8f8eb, 0xb398982b, 0x33111122);
1458656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xbb6969d2, 0x70d9d9a9, 0x898e8e07, 0xa7949433);
1459656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xb69b9b2d, 0x221e1e3c, 0x92878715, 0x20e9e9c9);
1460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x49cece87, 0xff5555aa, 0x78282850, 0x7adfdfa5);
1461656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x8f8c8c03, 0xf8a1a159, 0x80898909, 0x170d0d1a);
1462656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xdabfbf65, 0x31e6e6d7, 0xc6424284, 0xb86868d0);
1463656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xc3414182, 0xb0999929, 0x772d2d5a, 0x110f0f1e);
1464656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xcbb0b07b, 0xfc5454a8, 0xd6bbbb6d, 0x3a16162c);
1465656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#rcon:
1466656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
1467656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	.long	0x00000001, 0x00000002, 0x00000004, 0x00000008
1468656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	.long	0x00000010, 0x00000020, 0x00000040, 0x00000080
1469656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	.long	0x0000001b, 0x00000036, 0, 0, 0, 0, 0, 0
1470656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
1471656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
1472656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.globl	AES_Td
1473656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	64
1474656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectAES_Td:
1475656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
1476656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x50a7f451, 0x5365417e, 0xc3a4171a, 0x965e273a);
1477656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xcb6bab3b, 0xf1459d1f, 0xab58faac, 0x9303e34b);
1478656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x55fa3020, 0xf66d76ad, 0x9176cc88, 0x254c02f5);
1479656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xfcd7e54f, 0xd7cb2ac5, 0x80443526, 0x8fa362b5);
1480656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x495ab1de, 0x671bba25, 0x980eea45, 0xe1c0fe5d);
1481656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x02752fc3, 0x12f04c81, 0xa397468d, 0xc6f9d36b);
1482656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xe75f8f03, 0x959c9215, 0xeb7a6dbf, 0xda595295);
1483656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x2d83bed4, 0xd3217458, 0x2969e049, 0x44c8c98e);
1484656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x6a89c275, 0x78798ef4, 0x6b3e5899, 0xdd71b927);
1485656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xb64fe1be, 0x17ad88f0, 0x66ac20c9, 0xb43ace7d);
1486656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x184adf63, 0x82311ae5, 0x60335197, 0x457f5362);
1487656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xe07764b1, 0x84ae6bbb, 0x1ca081fe, 0x942b08f9);
1488656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x58684870, 0x19fd458f, 0x876cde94, 0xb7f87b52);
1489656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x23d373ab, 0xe2024b72, 0x578f1fe3, 0x2aab5566);
1490656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x0728ebb2, 0x03c2b52f, 0x9a7bc586, 0xa50837d3);
1491656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xf2872830, 0xb2a5bf23, 0xba6a0302, 0x5c8216ed);
1492656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x2b1ccf8a, 0x92b479a7, 0xf0f207f3, 0xa1e2694e);
1493656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xcdf4da65, 0xd5be0506, 0x1f6234d1, 0x8afea6c4);
1494656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x9d532e34, 0xa055f3a2, 0x32e18a05, 0x75ebf6a4);
1495656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x39ec830b, 0xaaef6040, 0x069f715e, 0x51106ebd);
1496656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xf98a213e, 0x3d06dd96, 0xae053edd, 0x46bde64d);
1497656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xb58d5491, 0x055dc471, 0x6fd40604, 0xff155060);
1498656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x24fb9819, 0x97e9bdd6, 0xcc434089, 0x779ed967);
1499656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xbd42e8b0, 0x888b8907, 0x385b19e7, 0xdbeec879);
1500656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x470a7ca1, 0xe90f427c, 0xc91e84f8, 0x00000000);
1501656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x83868009, 0x48ed2b32, 0xac70111e, 0x4e725a6c);
1502656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xfbff0efd, 0x5638850f, 0x1ed5ae3d, 0x27392d36);
1503656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x64d90f0a, 0x21a65c68, 0xd1545b9b, 0x3a2e3624);
1504656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xb1670a0c, 0x0fe75793, 0xd296eeb4, 0x9e919b1b);
1505656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x4fc5c080, 0xa220dc61, 0x694b775a, 0x161a121c);
1506656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x0aba93e2, 0xe52aa0c0, 0x43e0223c, 0x1d171b12);
1507656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x0b0d090e, 0xadc78bf2, 0xb9a8b62d, 0xc8a91e14);
1508656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x8519f157, 0x4c0775af, 0xbbdd99ee, 0xfd607fa3);
1509656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x9f2601f7, 0xbcf5725c, 0xc53b6644, 0x347efb5b);
1510656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x7629438b, 0xdcc623cb, 0x68fcedb6, 0x63f1e4b8);
1511656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xcadc31d7, 0x10856342, 0x40229713, 0x2011c684);
1512656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x7d244a85, 0xf83dbbd2, 0x1132f9ae, 0x6da129c7);
1513656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x4b2f9e1d, 0xf330b2dc, 0xec52860d, 0xd0e3c177);
1514656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x6c16b32b, 0x99b970a9, 0xfa489411, 0x2264e947);
1515656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xc48cfca8, 0x1a3ff0a0, 0xd82c7d56, 0xef903322);
1516656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xc74e4987, 0xc1d138d9, 0xfea2ca8c, 0x360bd498);
1517656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xcf81f5a6, 0x28de7aa5, 0x268eb7da, 0xa4bfad3f);
1518656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xe49d3a2c, 0x0d927850, 0x9bcc5f6a, 0x62467e54);
1519656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xc2138df6, 0xe8b8d890, 0x5ef7392e, 0xf5afc382);
1520656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xbe805d9f, 0x7c93d069, 0xa92dd56f, 0xb31225cf);
1521656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x3b99acc8, 0xa77d1810, 0x6e639ce8, 0x7bbb3bdb);
1522656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x097826cd, 0xf418596e, 0x01b79aec, 0xa89a4f83);
1523656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x656e95e6, 0x7ee6ffaa, 0x08cfbc21, 0xe6e815ef);
1524656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xd99be7ba, 0xce366f4a, 0xd4099fea, 0xd67cb029);
1525656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xafb2a431, 0x31233f2a, 0x3094a5c6, 0xc066a235);
1526656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x37bc4e74, 0xa6ca82fc, 0xb0d090e0, 0x15d8a733);
1527656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x4a9804f1, 0xf7daec41, 0x0e50cd7f, 0x2ff69117);
1528656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x8dd64d76, 0x4db0ef43, 0x544daacc, 0xdf0496e4);
1529656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xe3b5d19e, 0x1b886a4c, 0xb81f2cc1, 0x7f516546);
1530656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x04ea5e9d, 0x5d358c01, 0x737487fa, 0x2e410bfb);
1531656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x5a1d67b3, 0x52d2db92, 0x335610e9, 0x1347d66d);
1532656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x8c61d79a, 0x7a0ca137, 0x8e14f859, 0x893c13eb);
1533656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xee27a9ce, 0x35c961b7, 0xede51ce1, 0x3cb1477a);
1534656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x59dfd29c, 0x3f73f255, 0x79ce1418, 0xbf37c773);
1535656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xeacdf753, 0x5baafd5f, 0x146f3ddf, 0x86db4478);
1536656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x81f3afca, 0x3ec468b9, 0x2c342438, 0x5f40a3c2);
1537656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x72c31d16, 0x0c25e2bc, 0x8b493c28, 0x41950dff);
1538656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x7101a839, 0xdeb30c08, 0x9ce4b4d8, 0x90c15664);
1539656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x6184cb7b, 0x70b632d5, 0x745c6c48, 0x4257b8d0);
1540656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#Td4:
1541656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38);
1542656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb);
1543656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87);
1544656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb);
1545656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d);
1546656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e);
1547656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2);
1548656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25);
1549656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16);
1550656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92);
1551656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda);
1552656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84);
1553656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a);
1554656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06);
1555656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02);
1556656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b);
1557656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea);
1558656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73);
1559656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85);
1560656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e);
1561656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89);
1562656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b);
1563656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20);
1564656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4);
1565656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31);
1566656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f);
1567656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d);
1568656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef);
1569656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0);
1570656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61);
1571656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26);
1572656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d);
1573656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1574656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code =~ s/\`([^\`]*)\`/eval($1)/gem;
1575656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1576656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectprint $code;
1577656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1578656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectclose STDOUT;
1579