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
5221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# project. The module is, however, dual licensed under OpenSSL and
6221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# CRYPTOGAMS licenses depending on where you obtain it. For further
7221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# details see http://www.openssl.org/~appro/cryptogams/.
8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# ====================================================================
9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#
10221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# Version 2.1.
11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#
12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# aes-*-cbc benchmarks are improved by >70% [compared to gcc 3.3.2 on
13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# Opteron 240 CPU] plus all the bells-n-whistles from 32-bit version
14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# [you'll notice a lot of resemblance], such as compressed S-boxes
15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# in little-endian byte order, prefetch of these tables in CBC mode,
16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# as well as avoiding L1 cache aliasing between stack frame and key
17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# schedule and already mentioned tables, compressed Td4...
18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#
19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# Performance in number of cycles per processed byte for 128-bit key:
20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#
21221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#		ECB encrypt	ECB decrypt	CBC large chunk
22221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# AMD64		33		41		13.0
23221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# EM64T		38		59		18.6(*)
24221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# Core 2	30		43		14.5(*)
25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#
26221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# (*) with hyper-threading off
27221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
28221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$flavour = shift;
29221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$output  = shift;
30221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromif ($flavour =~ /\./) { $output = $flavour; undef $flavour; }
31221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
32221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$win64=0; $win64=1 if ($flavour =~ /[nm]asm|mingw64/ || $output =~ /\.asm$/);
33221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
34221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
35221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom( $xlate="${dir}x86_64-xlate.pl" and -f $xlate ) or
36221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom( $xlate="${dir}../../perlasm/x86_64-xlate.pl" and -f $xlate) or
37221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromdie "can't locate x86_64-xlate.pl";
38221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
39221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromopen STDOUT,"| $^X $xlate $flavour $output";
40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$verticalspin=1;	# unlike 32-bit version $verticalspin performs
42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			# ~15% better on both AMD and Intel cores
43221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$speed_limit=512;	# see aes-586.pl for details
44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code=".text\n";
46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$s0="%eax";
48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$s1="%ebx";
49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$s2="%ecx";
50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$s3="%edx";
51221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$acc0="%esi";	$mask80="%rsi";
52221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$acc1="%edi";	$maskfe="%rdi";
53221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$acc2="%ebp";	$mask1b="%rbp";
54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$inp="%r8";
55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$out="%r9";
56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$t0="%r10d";
57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$t1="%r11d";
58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$t2="%r12d";
59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$rnds="%r13d";
60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$sbox="%r14";
61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$key="%r15";
62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub hi() { my $r=shift;	$r =~ s/%[er]([a-d])x/%\1h/;	$r; }
64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub lo() { my $r=shift;	$r =~ s/%[er]([a-d])x/%\1l/;
65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			$r =~ s/%[er]([sd]i)/%\1l/;
66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			$r =~ s/%(r[0-9]+)[d]?/%\1b/;	$r; }
67221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromsub LO() { my $r=shift; $r =~ s/%r([a-z]+)/%e\1/;
68221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			$r =~ s/%r([0-9]+)/%r\1d/;	$r; }
69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub _data_word()
70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ my $i;
71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    while(defined($i=shift)) { $code.=sprintf".long\t0x%08x,0x%08x\n",$i,$i; }
72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub data_word()
74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ my $i;
75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  my $last=pop(@_);
76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    $code.=".long\t";
77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    while(defined($i=shift)) { $code.=sprintf"0x%08x,",$i; }
78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    $code.=sprintf"0x%08x\n",$last;
79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub data_byte()
82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ my $i;
83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  my $last=pop(@_);
84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    $code.=".byte\t";
85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    while(defined($i=shift)) { $code.=sprintf"0x%02x,",$i&0xff; }
86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    $code.=sprintf"0x%02x\n",$last&0xff;
87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub encvert()
90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ my $t3="%r8d";	# zaps $inp!
91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	# favor 3-way issue Opteron pipeline...
94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s0")`,$acc0
95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s1")`,$acc1
96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s2")`,$acc2
97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	0($sbox,$acc0,8),$t0
98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	0($sbox,$acc1,8),$t1
99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	0($sbox,$acc2,8),$t2
100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s1")`,$acc0
102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s2")`,$acc1
103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s3")`,$acc2
104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	3($sbox,$acc0,8),$t0
105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	3($sbox,$acc1,8),$t1
106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	0($sbox,$acc2,8),$t3
107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s3")`,$acc0
109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shr	\$16,$s2
110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s0")`,$acc2
111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	3($sbox,$acc0,8),$t2
112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shr	\$16,$s3
113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	3($sbox,$acc2,8),$t3
114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shr	\$16,$s1
116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	lea	16($key),$key
117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shr	\$16,$s0
118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s2")`,$acc0
120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s3")`,$acc1
121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s0")`,$acc2
122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	2($sbox,$acc0,8),$t0
123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	2($sbox,$acc1,8),$t1
124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	2($sbox,$acc2,8),$t2
125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s3")`,$acc0
127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s0")`,$acc1
128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s1")`,$acc2
129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	1($sbox,$acc0,8),$t0
130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	1($sbox,$acc1,8),$t1
131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	2($sbox,$acc2,8),$t3
132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	12($key),$s3
134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s1")`,$acc1
135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s2")`,$acc2
136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	0($key),$s0
137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	1($sbox,$acc1,8),$t2
138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	1($sbox,$acc2,8),$t3
139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	4($key),$s1
141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	8($key),$s2
142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$t0,$s0
143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$t1,$s1
144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$t2,$s2
145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$t3,$s3
146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub enclastvert()
150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ my $t3="%r8d";	# zaps $inp!
151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s0")`,$acc0
154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s1")`,$acc1
155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s2")`,$acc2
156221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	2($sbox,$acc0,8),$t0
157221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	2($sbox,$acc1,8),$t1
158221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	2($sbox,$acc2,8),$t2
159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s3")`,$acc0
161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s1")`,$acc1
162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s2")`,$acc2
163221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	2($sbox,$acc0,8),$t3
164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	0($sbox,$acc1,8),$acc1	#$t0
165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	0($sbox,$acc2,8),$acc2	#$t1
166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$0x0000ff00,$acc1
168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$0x0000ff00,$acc2
169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$acc1,$t0
171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$acc2,$t1
172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shr	\$16,$s2
173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s3")`,$acc0
175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s0")`,$acc1
176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shr	\$16,$s3
177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	0($sbox,$acc0,8),$acc0	#$t2
178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	0($sbox,$acc1,8),$acc1	#$t3
179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$0x0000ff00,$acc0
181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$0x0000ff00,$acc1
182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shr	\$16,$s1
183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$acc0,$t2
184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$acc1,$t3
185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shr	\$16,$s0
186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s2")`,$acc0
188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s3")`,$acc1
189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s0")`,$acc2
190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	0($sbox,$acc0,8),$acc0	#$t0
191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	0($sbox,$acc1,8),$acc1	#$t1
192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	0($sbox,$acc2,8),$acc2	#$t2
193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$0x00ff0000,$acc0
195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$0x00ff0000,$acc1
196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$0x00ff0000,$acc2
197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$acc0,$t0
199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$acc1,$t1
200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$acc2,$t2
201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s1")`,$acc0
203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s3")`,$acc1
204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s0")`,$acc2
205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	0($sbox,$acc0,8),$acc0	#$t3
206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	2($sbox,$acc1,8),$acc1	#$t0
207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	2($sbox,$acc2,8),$acc2	#$t1
208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$0x00ff0000,$acc0
210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$0xff000000,$acc1
211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$0xff000000,$acc2
212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$acc0,$t3
214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$acc1,$t0
215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$acc2,$t1
216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s1")`,$acc0
218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s2")`,$acc1
219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	16+12($key),$s3
220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	2($sbox,$acc0,8),$acc0	#$t2
221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	2($sbox,$acc1,8),$acc1	#$t3
222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	16+0($key),$s0
223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$0xff000000,$acc0
225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$0xff000000,$acc1
226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$acc0,$t2
228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$acc1,$t3
229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	16+4($key),$s1
231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	16+8($key),$s2
232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$t0,$s0
233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$t1,$s1
234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$t2,$s2
235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$t3,$s3
236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub encstep()
240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ my ($i,@s) = @_;
241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  my $tmp0=$acc0;
242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  my $tmp1=$acc1;
243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  my $tmp2=$acc2;
244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  my $out=($t0,$t1,$t2,$s[0])[$i];
245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ($i==3) {
247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		$tmp0=$s[1];
248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		$tmp1=$s[2];
249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		$tmp2=$s[3];
250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	movzb	".&lo($s[0]).",$out\n";
252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	$s[2],$tmp1\n"		if ($i!=3);
253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	lea	16($key),$key\n"	if ($i==0);
254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	movzb	".&hi($s[1]).",$tmp0\n";
256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	0($sbox,$out,8),$out\n";
257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	shr	\$16,$tmp1\n";
259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	$s[3],$tmp2\n"		if ($i!=3);
260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	xor	3($sbox,$tmp0,8),$out\n";
261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	movzb	".&lo($tmp1).",$tmp1\n";
263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	shr	\$24,$tmp2\n";
264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	xor	4*$i($key),$out\n";
265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	xor	2($sbox,$tmp1,8),$out\n";
267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	xor	1($sbox,$tmp2,8),$out\n";
268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	$t0,$s[1]\n"		if ($i==3);
270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	$t1,$s[2]\n"		if ($i==3);
271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	$t2,$s[3]\n"		if ($i==3);
272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="\n";
273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub enclast()
276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ my ($i,@s)=@_;
277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  my $tmp0=$acc0;
278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  my $tmp1=$acc1;
279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  my $tmp2=$acc2;
280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  my $out=($t0,$t1,$t2,$s[0])[$i];
281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ($i==3) {
283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		$tmp0=$s[1];
284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		$tmp1=$s[2];
285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		$tmp2=$s[3];
286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	movzb	".&lo($s[0]).",$out\n";
288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	$s[2],$tmp1\n"		if ($i!=3);
289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	2($sbox,$out,8),$out\n";
291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	shr	\$16,$tmp1\n";
292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	$s[3],$tmp2\n"		if ($i!=3);
293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	and	\$0x000000ff,$out\n";
295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	movzb	".&hi($s[1]).",$tmp0\n";
296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	movzb	".&lo($tmp1).",$tmp1\n";
297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	shr	\$24,$tmp2\n";
298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	0($sbox,$tmp0,8),$tmp0\n";
300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	0($sbox,$tmp1,8),$tmp1\n";
301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	2($sbox,$tmp2,8),$tmp2\n";
302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	and	\$0x0000ff00,$tmp0\n";
304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	and	\$0x00ff0000,$tmp1\n";
305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	and	\$0xff000000,$tmp2\n";
306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	xor	$tmp0,$out\n";
308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	$t0,$s[1]\n"		if ($i==3);
309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	xor	$tmp1,$out\n";
310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	$t1,$s[2]\n"		if ($i==3);
311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	xor	$tmp2,$out\n";
312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	$t2,$s[3]\n"		if ($i==3);
313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="\n";
314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.type	_x86_64_AES_encrypt,\@abi-omnipotent
318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	16
319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project_x86_64_AES_encrypt:
320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	0($key),$s0			# xor with key
321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	4($key),$s1
322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	8($key),$s2
323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	12($key),$s3
324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	240($key),$rnds			# load key->rounds
326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sub	\$1,$rnds
327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jmp	.Lenc_loop
328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	16
329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lenc_loop:
330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ($verticalspin) { &encvert(); }
332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else {	&encstep(0,$s0,$s1,$s2,$s3);
333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&encstep(1,$s1,$s2,$s3,$s0);
334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&encstep(2,$s2,$s3,$s0,$s1);
335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&encstep(3,$s3,$s0,$s1,$s2);
336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sub	\$1,$rnds
339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jnz	.Lenc_loop
340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ($verticalspin) { &enclastvert(); }
342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else {	&enclast(0,$s0,$s1,$s2,$s3);
343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&enclast(1,$s1,$s2,$s3,$s0);
344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&enclast(2,$s2,$s3,$s0,$s1);
345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&enclast(3,$s3,$s0,$s1,$s2);
346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		$code.=<<___;
347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	16+0($key),$s0		# xor with key
348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	16+4($key),$s1
349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	16+8($key),$s2
350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	16+12($key),$s3
351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	.byte	0xf3,0xc3			# rep ret
355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.size	_x86_64_AES_encrypt,.-_x86_64_AES_encrypt
356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
358221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# it's possible to implement this by shifting tN by 8, filling least
359221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# significant byte with byte load and finally bswap-ing at the end,
360221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# but such partial register load kills Core 2...
361221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromsub enccompactvert()
362221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom{ my ($t3,$t4,$t5)=("%r8d","%r9d","%r13d");
363221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
364221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___;
365221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	`&lo("$s0")`,$t0
366221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	`&lo("$s1")`,$t1
367221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	`&lo("$s2")`,$t2
368221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	($sbox,$t0,1),$t0
369221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	($sbox,$t1,1),$t1
370221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	($sbox,$t2,1),$t2
371221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
372221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	`&lo("$s3")`,$t3
373221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	`&hi("$s1")`,$acc0
374221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	`&hi("$s2")`,$acc1
375221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	($sbox,$t3,1),$t3
376221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	($sbox,$acc0,1),$t4	#$t0
377221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	($sbox,$acc1,1),$t5	#$t1
378221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
379221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	`&hi("$s3")`,$acc2
380221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	`&hi("$s0")`,$acc0
381221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shr	\$16,$s2
382221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	($sbox,$acc2,1),$acc2	#$t2
383221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	($sbox,$acc0,1),$acc0	#$t3
384221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shr	\$16,$s3
385221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
386221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	`&lo("$s2")`,$acc1
387221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shl	\$8,$t4
388221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shl	\$8,$t5
389221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	($sbox,$acc1,1),$acc1	#$t0
390221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$t4,$t0
391221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$t5,$t1
392221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
393221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	`&lo("$s3")`,$t4
394221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shr	\$16,$s0
395221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shr	\$16,$s1
396221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	`&lo("$s0")`,$t5
397221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shl	\$8,$acc2
398221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shl	\$8,$acc0
399221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	($sbox,$t4,1),$t4	#$t1
400221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	($sbox,$t5,1),$t5	#$t2
401221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$acc2,$t2
402221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$acc0,$t3
403221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
404221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	`&lo("$s1")`,$acc2
405221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	`&hi("$s3")`,$acc0
406221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shl	\$16,$acc1
407221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	($sbox,$acc2,1),$acc2	#$t3
408221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	($sbox,$acc0,1),$acc0	#$t0
409221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$acc1,$t0
410221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
411221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	`&hi("$s0")`,$acc1
412221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shr	\$8,$s2
413221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shr	\$8,$s1
414221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	($sbox,$acc1,1),$acc1	#$t1
415221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	($sbox,$s2,1),$s3	#$t3
416221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	($sbox,$s1,1),$s2	#$t2
417221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shl	\$16,$t4
418221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shl	\$16,$t5
419221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shl	\$16,$acc2
420221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$t4,$t1
421221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$t5,$t2
422221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$acc2,$t3
423221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
424221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shl	\$24,$acc0
425221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shl	\$24,$acc1
426221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shl	\$24,$s3
427221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$acc0,$t0
428221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shl	\$24,$s2
429221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$acc1,$t1
430221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$t0,$s0
431221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$t1,$s1
432221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$t2,$s2
433221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$t3,$s3
434221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___
435221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom}
436221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
437221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromsub enctransform_ref()
438221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom{ my $sn = shift;
439221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  my ($acc,$r2,$tmp)=("%r8d","%r9d","%r13d");
440221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
441221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___;
442221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$sn,$acc
443221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and	\$0x80808080,$acc
444221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$acc,$tmp
445221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shr	\$7,$tmp
446221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	($sn,$sn),$r2
447221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sub	$tmp,$acc
448221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and	\$0xfefefefe,$r2
449221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and	\$0x1b1b1b1b,$acc
450221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$sn,$tmp
451221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$acc,$r2
452221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
453221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$r2,$sn
454221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	rol	\$24,$sn
455221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$r2,$sn
456221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ror	\$16,$tmp
457221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$tmp,$sn
458221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ror	\$8,$tmp
459221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$tmp,$sn
460221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___
461221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom}
462221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
463221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# unlike decrypt case it does not pay off to parallelize enctransform
464221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromsub enctransform()
465221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom{ my ($t3,$r20,$r21)=($acc2,"%r8d","%r9d");
466221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
467221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___;
468221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$s0,$acc0
469221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$s1,$acc1
470221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and	\$0x80808080,$acc0
471221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and	\$0x80808080,$acc1
472221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$acc0,$t0
473221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$acc1,$t1
474221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shr	\$7,$t0
475221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	($s0,$s0),$r20
476221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shr	\$7,$t1
477221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	($s1,$s1),$r21
478221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sub	$t0,$acc0
479221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sub	$t1,$acc1
480221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and	\$0xfefefefe,$r20
481221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and	\$0xfefefefe,$r21
482221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and	\$0x1b1b1b1b,$acc0
483221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and	\$0x1b1b1b1b,$acc1
484221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$s0,$t0
485221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$s1,$t1
486221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$acc0,$r20
487221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$acc1,$r21
488221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
489221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$r20,$s0
490221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$r21,$s1
491221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	 mov	$s2,$acc0
492221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	 mov	$s3,$acc1
493221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	rol	\$24,$s0
494221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	rol	\$24,$s1
495221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	 and	\$0x80808080,$acc0
496221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	 and	\$0x80808080,$acc1
497221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$r20,$s0
498221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$r21,$s1
499221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	 mov	$acc0,$t2
500221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	 mov	$acc1,$t3
501221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ror	\$16,$t0
502221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ror	\$16,$t1
503221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	 shr	\$7,$t2
504221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	 lea	($s2,$s2),$r20
505221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$t0,$s0
506221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$t1,$s1
507221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	 shr	\$7,$t3
508221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	 lea	($s3,$s3),$r21
509221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ror	\$8,$t0
510221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ror	\$8,$t1
511221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	 sub	$t2,$acc0
512221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	 sub	$t3,$acc1
513221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$t0,$s0
514221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$t1,$s1
515221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
516221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and	\$0xfefefefe,$r20
517221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and	\$0xfefefefe,$r21
518221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and	\$0x1b1b1b1b,$acc0
519221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and	\$0x1b1b1b1b,$acc1
520221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$s2,$t2
521221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$s3,$t3
522221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$acc0,$r20
523221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$acc1,$r21
524221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
525221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$r20,$s2
526221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$r21,$s3
527221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	rol	\$24,$s2
528221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	rol	\$24,$s3
529221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$r20,$s2
530221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$r21,$s3
531221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	0($sbox),$acc0			# prefetch Te4
532221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ror	\$16,$t2
533221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ror	\$16,$t3
534221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	64($sbox),$acc1
535221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$t2,$s2
536221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$t3,$s3
537221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	128($sbox),$r20
538221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ror	\$8,$t2
539221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ror	\$8,$t3
540221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	192($sbox),$r21
541221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$t2,$s2
542221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$t3,$s3
543221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___
544221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom}
545221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
546221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___;
547221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.type	_x86_64_AES_encrypt_compact,\@abi-omnipotent
548221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align	16
549221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom_x86_64_AES_encrypt_compact:
550221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	128($sbox),$inp			# size optimization
551221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	0-128($inp),$acc1		# prefetch Te4
552221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	32-128($inp),$acc2
553221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	64-128($inp),$t0
554221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	96-128($inp),$t1
555221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	128-128($inp),$acc1
556221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	160-128($inp),$acc2
557221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	192-128($inp),$t0
558221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	224-128($inp),$t1
559221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	jmp	.Lenc_loop_compact
560221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align	16
561221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lenc_loop_compact:
562221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		xor	0($key),$s0		# xor with key
563221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		xor	4($key),$s1
564221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		xor	8($key),$s2
565221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		xor	12($key),$s3
566221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		lea	16($key),$key
567221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___
568221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		&enccompactvert();
569221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___;
570221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		cmp	16(%rsp),$key
571221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		je	.Lenc_compact_done
572221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___
573221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		&enctransform();
574221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___;
575221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	jmp	.Lenc_loop_compact
576221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align	16
577221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lenc_compact_done:
578221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	0($key),$s0
579221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	4($key),$s1
580221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	8($key),$s2
581221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	12($key),$s3
582221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	.byte	0xf3,0xc3			# rep ret
583221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.size	_x86_64_AES_encrypt_compact,.-_x86_64_AES_encrypt_compact
584221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___
585221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
586656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# void AES_encrypt (const void *inp,void *out,const AES_KEY *key);
587656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
588656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.globl	AES_encrypt
589656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.type	AES_encrypt,\@function,3
590656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	16
591392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.globl	asm_AES_encrypt
592392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.hidden	asm_AES_encrypt
593392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromasm_AES_encrypt:
594656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectAES_encrypt:
595656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	push	%rbx
596656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	push	%rbp
597656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	push	%r12
598656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	push	%r13
599656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	push	%r14
600656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	push	%r15
601656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
602221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	# allocate frame "above" key schedule
603221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%rsp,%r10
604221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	-63(%rdx),%rcx	# %rdx is key argument
605221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and	\$-64,%rsp
606221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sub	%rsp,%rcx
607221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	neg	%rcx
608221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and	\$0x3c0,%rcx
609221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sub	%rcx,%rsp
610221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sub	\$32,%rsp
611656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
612221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%rsi,16(%rsp)	# save out
613221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%r10,24(%rsp)	# save real stack pointer
614221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lenc_prologue:
615656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
616221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%rdx,$key
617221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	240($key),$rnds	# load rounds
618221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
619221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	0(%rdi),$s0	# load input vector
620221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	4(%rdi),$s1
621221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	8(%rdi),$s2
622221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	12(%rdi),$s3
623221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
624221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shl	\$4,$rnds
625221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	($key,$rnds),%rbp
626221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$key,(%rsp)	# key schedule
627221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%rbp,8(%rsp)	# end of key schedule
628221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
629221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	# pick Te4 copy which can't "overlap" with stack frame or key schedule
630221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	.LAES_Te+2048(%rip),$sbox
631221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	768(%rsp),%rbp
632221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sub	$sbox,%rbp
633221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and	\$0x300,%rbp
634221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	($sbox,%rbp),$sbox
635221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
636221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	call	_x86_64_AES_encrypt_compact
637221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
638221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	16(%rsp),$out	# restore out
639221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	24(%rsp),%rsi	# restore saved stack pointer
640221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$s0,0($out)	# write output vector
641656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$s1,4($out)
642656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$s2,8($out)
643656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$s3,12($out)
644656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
645221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	(%rsi),%r15
646221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	8(%rsi),%r14
647221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	16(%rsi),%r13
648221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	24(%rsi),%r12
649221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	32(%rsi),%rbp
650221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	40(%rsi),%rbx
651221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	48(%rsi),%rsp
652221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lenc_epilogue:
653656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret
654656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.size	AES_encrypt,.-AES_encrypt
655656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
656656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
657656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#------------------------------------------------------------------#
658656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
659656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub decvert()
660656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ my $t3="%r8d";	# zaps $inp!
661656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
662656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
663656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	# favor 3-way issue Opteron pipeline...
664656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s0")`,$acc0
665656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s1")`,$acc1
666656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s2")`,$acc2
667656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	0($sbox,$acc0,8),$t0
668656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	0($sbox,$acc1,8),$t1
669656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	0($sbox,$acc2,8),$t2
670656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
671656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s3")`,$acc0
672656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s0")`,$acc1
673656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s3")`,$acc2
674656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	3($sbox,$acc0,8),$t0
675656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	3($sbox,$acc1,8),$t1
676656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	0($sbox,$acc2,8),$t3
677656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
678656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s1")`,$acc0
679656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shr	\$16,$s0
680656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s2")`,$acc2
681656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	3($sbox,$acc0,8),$t2
682656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shr	\$16,$s3
683656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	3($sbox,$acc2,8),$t3
684656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
685656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shr	\$16,$s1
686656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	lea	16($key),$key
687656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shr	\$16,$s2
688656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
689656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s2")`,$acc0
690656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s3")`,$acc1
691656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s0")`,$acc2
692656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	2($sbox,$acc0,8),$t0
693656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	2($sbox,$acc1,8),$t1
694656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	2($sbox,$acc2,8),$t2
695656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
696656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s1")`,$acc0
697656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s2")`,$acc1
698656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s1")`,$acc2
699656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	1($sbox,$acc0,8),$t0
700656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	1($sbox,$acc1,8),$t1
701656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	2($sbox,$acc2,8),$t3
702656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
703656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s3")`,$acc0
704656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	12($key),$s3
705656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s0")`,$acc2
706656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	1($sbox,$acc0,8),$t2
707656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	0($key),$s0
708656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	1($sbox,$acc2,8),$t3
709656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
710656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$t0,$s0
711656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	4($key),$s1
712656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	8($key),$s2
713656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$t2,$s2
714656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$t1,$s1
715656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$t3,$s3
716656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
717656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
718656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
719656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub declastvert()
720656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ my $t3="%r8d";	# zaps $inp!
721656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
722656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
723221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	2048($sbox),$sbox	# size optimization
724656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s0")`,$acc0
725656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s1")`,$acc1
726656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s2")`,$acc2
727221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	($sbox,$acc0,1),$t0
728221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	($sbox,$acc1,1),$t1
729221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	($sbox,$acc2,1),$t2
730656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
731656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s3")`,$acc0
732656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s3")`,$acc1
733656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s0")`,$acc2
734221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	($sbox,$acc0,1),$t3
735221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	($sbox,$acc1,1),$acc1	#$t0
736221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	($sbox,$acc2,1),$acc2	#$t1
737656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
738656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shl	\$8,$acc1
739656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shl	\$8,$acc2
740656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
741656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$acc1,$t0
742656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$acc2,$t1
743656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shr	\$16,$s3
744656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
745656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s1")`,$acc0
746656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s2")`,$acc1
747656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shr	\$16,$s0
748221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	($sbox,$acc0,1),$acc0	#$t2
749221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	($sbox,$acc1,1),$acc1	#$t3
750656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
751656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shl	\$8,$acc0
752656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shl	\$8,$acc1
753656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shr	\$16,$s1
754656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$acc0,$t2
755656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$acc1,$t3
756656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shr	\$16,$s2
757656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
758656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s2")`,$acc0
759656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s3")`,$acc1
760656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s0")`,$acc2
761221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	($sbox,$acc0,1),$acc0	#$t0
762221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	($sbox,$acc1,1),$acc1	#$t1
763221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	($sbox,$acc2,1),$acc2	#$t2
764656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
765656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shl	\$16,$acc0
766656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shl	\$16,$acc1
767656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shl	\$16,$acc2
768656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
769656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$acc0,$t0
770656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$acc1,$t1
771656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$acc2,$t2
772656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
773656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&lo("$s1")`,$acc0
774656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s1")`,$acc1
775656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s2")`,$acc2
776221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	($sbox,$acc0,1),$acc0	#$t3
777221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	($sbox,$acc1,1),$acc1	#$t0
778221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	($sbox,$acc2,1),$acc2	#$t1
779656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
780656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shl	\$16,$acc0
781656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shl	\$24,$acc1
782656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shl	\$24,$acc2
783656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
784656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$acc0,$t3
785656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$acc1,$t0
786656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$acc2,$t1
787656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
788656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s3")`,$acc0
789656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movzb	`&hi("$s0")`,$acc1
790656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	16+12($key),$s3
791221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	($sbox,$acc0,1),$acc0	#$t2
792221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	($sbox,$acc1,1),$acc1	#$t3
793656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	16+0($key),$s0
794656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
795656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shl	\$24,$acc0
796656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shl	\$24,$acc1
797656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
798656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$acc0,$t2
799656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$acc1,$t3
800656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
801656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	16+4($key),$s1
802656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	16+8($key),$s2
803221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	-2048($sbox),$sbox
804656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$t0,$s0
805656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$t1,$s1
806656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$t2,$s2
807656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	$t3,$s3
808656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
809656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
810656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
811656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub decstep()
812656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ my ($i,@s) = @_;
813656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  my $tmp0=$acc0;
814656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  my $tmp1=$acc1;
815656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  my $tmp2=$acc2;
816656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  my $out=($t0,$t1,$t2,$s[0])[$i];
817656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
818656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	$s[0],$out\n"		if ($i!=3);
819656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			$tmp1=$s[2]			if ($i==3);
820656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	$s[2],$tmp1\n"		if ($i!=3);
821656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	and	\$0xFF,$out\n";
822656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
823656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	0($sbox,$out,8),$out\n";
824656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	shr	\$16,$tmp1\n";
825656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			$tmp2=$s[3]			if ($i==3);
826656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	$s[3],$tmp2\n"		if ($i!=3);
827656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
828656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			$tmp0=$s[1]			if ($i==3);
829656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	movzb	".&hi($s[1]).",$tmp0\n";
830656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	and	\$0xFF,$tmp1\n";
831656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	shr	\$24,$tmp2\n";
832656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
833656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	xor	3($sbox,$tmp0,8),$out\n";
834656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	xor	2($sbox,$tmp1,8),$out\n";
835656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	xor	1($sbox,$tmp2,8),$out\n";
836656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
837656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	$t2,$s[1]\n"		if ($i==3);
838656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	$t1,$s[2]\n"		if ($i==3);
839656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	$t0,$s[3]\n"		if ($i==3);
840656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="\n";
841656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
842656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
843656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub declast()
844656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ my ($i,@s)=@_;
845656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  my $tmp0=$acc0;
846656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  my $tmp1=$acc1;
847656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  my $tmp2=$acc2;
848656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  my $out=($t0,$t1,$t2,$s[0])[$i];
849656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
850656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	$s[0],$out\n"		if ($i!=3);
851656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			$tmp1=$s[2]			if ($i==3);
852656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	$s[2],$tmp1\n"		if ($i!=3);
853656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	and	\$0xFF,$out\n";
854656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
855656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	movzb	2048($sbox,$out,1),$out\n";
856656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	shr	\$16,$tmp1\n";
857656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			$tmp2=$s[3]			if ($i==3);
858656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	$s[3],$tmp2\n"		if ($i!=3);
859656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
860656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			$tmp0=$s[1]			if ($i==3);
861656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	movzb	".&hi($s[1]).",$tmp0\n";
862656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	and	\$0xFF,$tmp1\n";
863656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	shr	\$24,$tmp2\n";
864656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
865656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	movzb	2048($sbox,$tmp0,1),$tmp0\n";
866656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	movzb	2048($sbox,$tmp1,1),$tmp1\n";
867656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	movzb	2048($sbox,$tmp2,1),$tmp2\n";
868656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
869656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	shl	\$8,$tmp0\n";
870656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	shl	\$16,$tmp1\n";
871656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	shl	\$24,$tmp2\n";
872656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
873656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	xor	$tmp0,$out\n";
874656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	$t2,$s[1]\n"		if ($i==3);
875656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	xor	$tmp1,$out\n";
876656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	$t1,$s[2]\n"		if ($i==3);
877656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	xor	$tmp2,$out\n";
878656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="	mov	$t0,$s[3]\n"		if ($i==3);
879656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$code.="\n";
880656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
881656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
882656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
883656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.type	_x86_64_AES_decrypt,\@abi-omnipotent
884656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	16
885656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project_x86_64_AES_decrypt:
886656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	0($key),$s0			# xor with key
887656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	4($key),$s1
888656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	8($key),$s2
889656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	12($key),$s3
890656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
891656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	240($key),$rnds			# load key->rounds
892656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sub	\$1,$rnds
893656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jmp	.Ldec_loop
894656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	16
895656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Ldec_loop:
896656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
897656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ($verticalspin) { &decvert(); }
898656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else {	&decstep(0,$s0,$s3,$s2,$s1);
899656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&decstep(1,$s1,$s0,$s3,$s2);
900656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&decstep(2,$s2,$s1,$s0,$s3);
901656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&decstep(3,$s3,$s2,$s1,$s0);
902656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		$code.=<<___;
903656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		lea	16($key),$key
904656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	0($key),$s0			# xor with key
905656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	4($key),$s1
906656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	8($key),$s2
907656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	12($key),$s3
908656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
909656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
910656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
911656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sub	\$1,$rnds
912656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jnz	.Ldec_loop
913656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
914656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ($verticalspin) { &declastvert(); }
915656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else {	&declast(0,$s0,$s3,$s2,$s1);
916656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&declast(1,$s1,$s0,$s3,$s2);
917656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&declast(2,$s2,$s1,$s0,$s3);
918656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&declast(3,$s3,$s2,$s1,$s0);
919656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		$code.=<<___;
920656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	16+0($key),$s0			# xor with key
921656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	16+4($key),$s1
922656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	16+8($key),$s2
923656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	16+12($key),$s3
924656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
925656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
926656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
927656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	.byte	0xf3,0xc3			# rep ret
928656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.size	_x86_64_AES_decrypt,.-_x86_64_AES_decrypt
929656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
930656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
931221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromsub deccompactvert()
932221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom{ my ($t3,$t4,$t5)=("%r8d","%r9d","%r13d");
933221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
934221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___;
935221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	`&lo("$s0")`,$t0
936221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	`&lo("$s1")`,$t1
937221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	`&lo("$s2")`,$t2
938221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	($sbox,$t0,1),$t0
939221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	($sbox,$t1,1),$t1
940221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	($sbox,$t2,1),$t2
941221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
942221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	`&lo("$s3")`,$t3
943221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	`&hi("$s3")`,$acc0
944221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	`&hi("$s0")`,$acc1
945221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	($sbox,$t3,1),$t3
946221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	($sbox,$acc0,1),$t4	#$t0
947221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	($sbox,$acc1,1),$t5	#$t1
948221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
949221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	`&hi("$s1")`,$acc2
950221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	`&hi("$s2")`,$acc0
951221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shr	\$16,$s2
952221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	($sbox,$acc2,1),$acc2	#$t2
953221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	($sbox,$acc0,1),$acc0	#$t3
954221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shr	\$16,$s3
955221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
956221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	`&lo("$s2")`,$acc1
957221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shl	\$8,$t4
958221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shl	\$8,$t5
959221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	($sbox,$acc1,1),$acc1	#$t0
960221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$t4,$t0
961221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$t5,$t1
962221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
963221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	`&lo("$s3")`,$t4
964221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shr	\$16,$s0
965221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shr	\$16,$s1
966221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	`&lo("$s0")`,$t5
967221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shl	\$8,$acc2
968221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shl	\$8,$acc0
969221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	($sbox,$t4,1),$t4	#$t1
970221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	($sbox,$t5,1),$t5	#$t2
971221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$acc2,$t2
972221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$acc0,$t3
973221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
974221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	`&lo("$s1")`,$acc2
975221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	`&hi("$s1")`,$acc0
976221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shl	\$16,$acc1
977221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	($sbox,$acc2,1),$acc2	#$t3
978221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	($sbox,$acc0,1),$acc0	#$t0
979221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$acc1,$t0
980221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
981221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	`&hi("$s2")`,$acc1
982221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shl	\$16,$t4
983221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shl	\$16,$t5
984221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	($sbox,$acc1,1),$s1	#$t1
985221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$t4,$t1
986221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$t5,$t2
987221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
988221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	`&hi("$s3")`,$acc1
989221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shr	\$8,$s0
990221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shl	\$16,$acc2
991221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	($sbox,$acc1,1),$s2	#$t2
992221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	($sbox,$s0,1),$s3	#$t3
993221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$acc2,$t3
994221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
995221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shl	\$24,$acc0
996221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shl	\$24,$s1
997221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shl	\$24,$s2
998221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$acc0,$t0
999221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shl	\$24,$s3
1000221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$t1,$s1
1001221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$t0,$s0
1002221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$t2,$s2
1003221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$t3,$s3
1004221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___
1005221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom}
1006221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1007221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# parallelized version! input is pair of 64-bit values: %rax=s1.s0
1008221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# and %rcx=s3.s2, output is four 32-bit values in %eax=s0, %ebx=s1,
1009221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# %ecx=s2 and %edx=s3.
1010221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromsub dectransform()
1011221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom{ my ($tp10,$tp20,$tp40,$tp80,$acc0)=("%rax","%r8", "%r9", "%r10","%rbx");
1012221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  my ($tp18,$tp28,$tp48,$tp88,$acc8)=("%rcx","%r11","%r12","%r13","%rdx");
1013221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  my $prefetch = shift;
1014221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1015221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___;
1016221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$tp10,$acc0
1017221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$tp18,$acc8
1018221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and	$mask80,$acc0
1019221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and	$mask80,$acc8
1020221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$acc0,$tp40
1021221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$acc8,$tp48
1022221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shr	\$7,$tp40
1023221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	($tp10,$tp10),$tp20
1024221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shr	\$7,$tp48
1025221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	($tp18,$tp18),$tp28
1026221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sub	$tp40,$acc0
1027221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sub	$tp48,$acc8
1028221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and	$maskfe,$tp20
1029221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and	$maskfe,$tp28
1030221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and	$mask1b,$acc0
1031221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and	$mask1b,$acc8
1032221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$tp20,$acc0
1033221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$tp28,$acc8
1034221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$acc0,$tp20
1035221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$acc8,$tp28
1036221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1037221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and	$mask80,$acc0
1038221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and	$mask80,$acc8
1039221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$acc0,$tp80
1040221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$acc8,$tp88
1041221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shr	\$7,$tp80
1042221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	($tp20,$tp20),$tp40
1043221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shr	\$7,$tp88
1044221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	($tp28,$tp28),$tp48
1045221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sub	$tp80,$acc0
1046221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sub	$tp88,$acc8
1047221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and	$maskfe,$tp40
1048221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and	$maskfe,$tp48
1049221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and	$mask1b,$acc0
1050221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and	$mask1b,$acc8
1051221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$tp40,$acc0
1052221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$tp48,$acc8
1053221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$acc0,$tp40
1054221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$acc8,$tp48
1055221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1056221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and	$mask80,$acc0
1057221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and	$mask80,$acc8
1058221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$acc0,$tp80
1059221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$acc8,$tp88
1060221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shr	\$7,$tp80
1061221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	 xor	$tp10,$tp20		# tp2^=tp1
1062221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shr	\$7,$tp88
1063221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	 xor	$tp18,$tp28		# tp2^=tp1
1064221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sub	$tp80,$acc0
1065221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sub	$tp88,$acc8
1066221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	($tp40,$tp40),$tp80
1067221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	($tp48,$tp48),$tp88
1068221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	 xor	$tp10,$tp40		# tp4^=tp1
1069221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	 xor	$tp18,$tp48		# tp4^=tp1
1070221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and	$maskfe,$tp80
1071221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and	$maskfe,$tp88
1072221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and	$mask1b,$acc0
1073221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and	$mask1b,$acc8
1074221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$acc0,$tp80
1075221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$acc8,$tp88
1076221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1077221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$tp80,$tp10		# tp1^=tp8
1078221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$tp88,$tp18		# tp1^=tp8
1079221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$tp80,$tp20		# tp2^tp1^=tp8
1080221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$tp88,$tp28		# tp2^tp1^=tp8
1081221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$tp10,$acc0
1082221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$tp18,$acc8
1083221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$tp80,$tp40		# tp4^tp1^=tp8
1084221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$tp88,$tp48		# tp4^tp1^=tp8
1085221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shr	\$32,$acc0
1086221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shr	\$32,$acc8
1087221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$tp20,$tp80		# tp8^=tp8^tp2^tp1=tp2^tp1
1088221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$tp28,$tp88		# tp8^=tp8^tp2^tp1=tp2^tp1
1089221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	rol	\$8,`&LO("$tp10")`	# ROTATE(tp1^tp8,8)
1090221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	rol	\$8,`&LO("$tp18")`	# ROTATE(tp1^tp8,8)
1091221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$tp40,$tp80		# tp2^tp1^=tp8^tp4^tp1=tp8^tp4^tp2
1092221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$tp48,$tp88		# tp2^tp1^=tp8^tp4^tp1=tp8^tp4^tp2
1093221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1094221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	rol	\$8,`&LO("$acc0")`	# ROTATE(tp1^tp8,8)
1095221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	rol	\$8,`&LO("$acc8")`	# ROTATE(tp1^tp8,8)
1096221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	`&LO("$tp80")`,`&LO("$tp10")`
1097221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	`&LO("$tp88")`,`&LO("$tp18")`
1098221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shr	\$32,$tp80
1099221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shr	\$32,$tp88
1100221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	`&LO("$tp80")`,`&LO("$acc0")`
1101221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	`&LO("$tp88")`,`&LO("$acc8")`
1102221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1103221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$tp20,$tp80
1104221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$tp28,$tp88
1105221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shr	\$32,$tp80
1106221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shr	\$32,$tp88
1107221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	rol	\$24,`&LO("$tp20")`	# ROTATE(tp2^tp1^tp8,24)
1108221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	rol	\$24,`&LO("$tp28")`	# ROTATE(tp2^tp1^tp8,24)
1109221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	rol	\$24,`&LO("$tp80")`	# ROTATE(tp2^tp1^tp8,24)
1110221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	rol	\$24,`&LO("$tp88")`	# ROTATE(tp2^tp1^tp8,24)
1111221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	`&LO("$tp20")`,`&LO("$tp10")`
1112221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	`&LO("$tp28")`,`&LO("$tp18")`
1113221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$tp40,$tp20
1114221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$tp48,$tp28
1115221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	`&LO("$tp80")`,`&LO("$acc0")`
1116221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	`&LO("$tp88")`,`&LO("$acc8")`
1117221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1118221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	`"mov	0($sbox),$mask80"	if ($prefetch)`
1119221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shr	\$32,$tp20
1120221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shr	\$32,$tp28
1121221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	`"mov	64($sbox),$maskfe"	if ($prefetch)`
1122221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	rol	\$16,`&LO("$tp40")`	# ROTATE(tp4^tp1^tp8,16)
1123221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	rol	\$16,`&LO("$tp48")`	# ROTATE(tp4^tp1^tp8,16)
1124221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	`"mov	128($sbox),$mask1b"	if ($prefetch)`
1125221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	rol	\$16,`&LO("$tp20")`	# ROTATE(tp4^tp1^tp8,16)
1126221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	rol	\$16,`&LO("$tp28")`	# ROTATE(tp4^tp1^tp8,16)
1127221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	`"mov	192($sbox),$tp80"	if ($prefetch)`
1128221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	`&LO("$tp40")`,`&LO("$tp10")`
1129221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	`&LO("$tp48")`,`&LO("$tp18")`
1130221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	`"mov	256($sbox),$tp88"	if ($prefetch)`
1131221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	`&LO("$tp20")`,`&LO("$acc0")`
1132221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	`&LO("$tp28")`,`&LO("$acc8")`
1133221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___
1134221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom}
1135221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1136221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___;
1137221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.type	_x86_64_AES_decrypt_compact,\@abi-omnipotent
1138221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align	16
1139221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom_x86_64_AES_decrypt_compact:
1140221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	128($sbox),$inp			# size optimization
1141221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	0-128($inp),$acc1		# prefetch Td4
1142221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	32-128($inp),$acc2
1143221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	64-128($inp),$t0
1144221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	96-128($inp),$t1
1145221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	128-128($inp),$acc1
1146221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	160-128($inp),$acc2
1147221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	192-128($inp),$t0
1148221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	224-128($inp),$t1
1149221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	jmp	.Ldec_loop_compact
1150221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1151221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align	16
1152221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Ldec_loop_compact:
1153221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		xor	0($key),$s0		# xor with key
1154221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		xor	4($key),$s1
1155221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		xor	8($key),$s2
1156221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		xor	12($key),$s3
1157221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		lea	16($key),$key
1158221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___
1159221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		&deccompactvert();
1160221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___;
1161221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		cmp	16(%rsp),$key
1162221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		je	.Ldec_compact_done
1163221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1164221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	256+0($sbox),$mask80
1165221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		shl	\$32,%rbx
1166221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		shl	\$32,%rdx
1167221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	256+8($sbox),$maskfe
1168221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		or	%rbx,%rax
1169221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		or	%rdx,%rcx
1170221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	256+16($sbox),$mask1b
1171221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___
1172221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		&dectransform(1);
1173221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___;
1174221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	jmp	.Ldec_loop_compact
1175221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align	16
1176221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Ldec_compact_done:
1177221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	0($key),$s0
1178221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	4($key),$s1
1179221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	8($key),$s2
1180221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	12($key),$s3
1181221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	.byte	0xf3,0xc3			# rep ret
1182221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.size	_x86_64_AES_decrypt_compact,.-_x86_64_AES_decrypt_compact
1183221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___
1184221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# void AES_decrypt (const void *inp,void *out,const AES_KEY *key);
1186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
1187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.globl	AES_decrypt
1188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.type	AES_decrypt,\@function,3
1189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	16
1190392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.globl	asm_AES_decrypt
1191392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.hidden	asm_AES_decrypt
1192392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromasm_AES_decrypt:
1193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectAES_decrypt:
1194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	push	%rbx
1195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	push	%rbp
1196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	push	%r12
1197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	push	%r13
1198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	push	%r14
1199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	push	%r15
1200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1201221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	# allocate frame "above" key schedule
1202221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%rsp,%r10
1203221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	-63(%rdx),%rcx	# %rdx is key argument
1204221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and	\$-64,%rsp
1205221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sub	%rsp,%rcx
1206221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	neg	%rcx
1207221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and	\$0x3c0,%rcx
1208221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sub	%rcx,%rsp
1209221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sub	\$32,%rsp
1210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1211221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%rsi,16(%rsp)	# save out
1212221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%r10,24(%rsp)	# save real stack pointer
1213221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Ldec_prologue:
1214221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1215221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%rdx,$key
1216221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	240($key),$rnds	# load rounds
1217221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1218221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	0(%rdi),$s0	# load input vector
1219221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	4(%rdi),$s1
1220221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	8(%rdi),$s2
1221221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	12(%rdi),$s3
1222221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1223221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shl	\$4,$rnds
1224221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	($key,$rnds),%rbp
1225221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$key,(%rsp)	# key schedule
1226221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%rbp,8(%rsp)	# end of key schedule
1227221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1228221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	# pick Td4 copy which can't "overlap" with stack frame or key schedule
1229221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	.LAES_Td+2048(%rip),$sbox
1230221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	768(%rsp),%rbp
1231221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sub	$sbox,%rbp
1232221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and	\$0x300,%rbp
1233221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	($sbox,%rbp),$sbox
1234221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shr	\$3,%rbp	# recall "magic" constants!
1235221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	add	%rbp,$sbox
1236221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1237221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	call	_x86_64_AES_decrypt_compact
1238221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1239221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	16(%rsp),$out	# restore out
1240221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	24(%rsp),%rsi	# restore saved stack pointer
1241221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$s0,0($out)	# write output vector
1242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$s1,4($out)
1243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$s2,8($out)
1244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$s3,12($out)
1245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1246221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	(%rsi),%r15
1247221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	8(%rsi),%r14
1248221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	16(%rsi),%r13
1249221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	24(%rsi),%r12
1250221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	32(%rsi),%rbp
1251221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	40(%rsi),%rbx
1252221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	48(%rsi),%rsp
1253221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Ldec_epilogue:
1254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret
1255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.size	AES_decrypt,.-AES_decrypt
1256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
1257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#------------------------------------------------------------------#
1258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub enckey()
1260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
1261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
1262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movz	%dl,%esi		# rk[i]>>0
1263221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	-128(%rbp,%rsi),%ebx
1264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movz	%dh,%esi		# rk[i]>>8
1265221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shl	\$24,%ebx
1266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	%ebx,%eax
1267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1268221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	-128(%rbp,%rsi),%ebx
1269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	shr	\$16,%edx
1270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movz	%dl,%esi		# rk[i]>>16
1271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	%ebx,%eax
1272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1273221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	-128(%rbp,%rsi),%ebx
1274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movz	%dh,%esi		# rk[i]>>24
1275221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shl	\$8,%ebx
1276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	%ebx,%eax
1277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1278221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	movzb	-128(%rbp,%rsi),%ebx
1279221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shl	\$16,%ebx
1280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	%ebx,%eax
1281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1282221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	1024-128(%rbp,%rcx,4),%eax		# rcon
1283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
1284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
1285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1286392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# int private_AES_set_encrypt_key(const unsigned char *userKey, const int bits,
1287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#                        AES_KEY *key)
1288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
1289392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.globl	private_AES_set_encrypt_key
1290392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.type	private_AES_set_encrypt_key,\@function,3
1291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	16
1292392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromprivate_AES_set_encrypt_key:
1293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	push	%rbx
1294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	push	%rbp
1295221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	push	%r12			# redundant, but allows to share
1296221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	push	%r13			# exception handler...
1297221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	push	%r14
1298221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	push	%r15
1299221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sub	\$8,%rsp
1300221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lenc_key_prologue:
1301221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1302221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	call	_x86_64_AES_set_encrypt_key
1303221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1304221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	8(%rsp),%r15
1305221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	16(%rsp),%r14
1306221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	24(%rsp),%r13
1307221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	32(%rsp),%r12
1308221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	40(%rsp),%rbp
1309221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	48(%rsp),%rbx
1310221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	add	\$56,%rsp
1311221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lenc_key_epilogue:
1312221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ret
1313392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.size	private_AES_set_encrypt_key,.-private_AES_set_encrypt_key
1314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1315221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.type	_x86_64_AES_set_encrypt_key,\@abi-omnipotent
1316221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align	16
1317221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom_x86_64_AES_set_encrypt_key:
1318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%esi,%ecx			# %ecx=bits
1319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%rdi,%rsi			# %rsi=userKey
1320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%rdx,%rdi			# %rdi=key
1321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	test	\$-1,%rsi
1323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jz	.Lbadpointer
1324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	test	\$-1,%rdi
1325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jz	.Lbadpointer
1326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1327221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	.LAES_Te(%rip),%rbp
1328221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	2048+128(%rbp),%rbp
1329221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1330221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	# prefetch Te4
1331221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	0-128(%rbp),%eax
1332221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	32-128(%rbp),%ebx
1333221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	64-128(%rbp),%r8d
1334221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	96-128(%rbp),%edx
1335221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	128-128(%rbp),%eax
1336221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	160-128(%rbp),%ebx
1337221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	192-128(%rbp),%r8d
1338221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	224-128(%rbp),%edx
1339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	cmp	\$128,%ecx
1341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	je	.L10rounds
1342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	cmp	\$192,%ecx
1343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	je	.L12rounds
1344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	cmp	\$256,%ecx
1345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	je	.L14rounds
1346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	\$-2,%rax			# invalid number of bits
1347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jmp	.Lexit
1348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.L10rounds:
1350221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	0(%rsi),%rax			# copy first 4 dwords
1351221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	8(%rsi),%rdx
1352221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%rax,0(%rdi)
1353221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%rdx,8(%rdi)
1354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1355221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shr	\$32,%rdx
1356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	%ecx,%ecx
1357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jmp	.L10shortcut
1358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	4
1359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.L10loop:
1360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	0(%rdi),%eax			# rk[0]
1361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	12(%rdi),%edx			# rk[3]
1362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.L10shortcut:
1363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
1364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&enckey	();
1365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
1366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%eax,16(%rdi)			# rk[4]
1367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	4(%rdi),%eax
1368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%eax,20(%rdi)			# rk[5]
1369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	8(%rdi),%eax
1370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%eax,24(%rdi)			# rk[6]
1371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	12(%rdi),%eax
1372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%eax,28(%rdi)			# rk[7]
1373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		add	\$1,%ecx
1374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		lea	16(%rdi),%rdi
1375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		cmp	\$10,%ecx
1376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jl	.L10loop
1377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movl	\$10,80(%rdi)			# setup number of rounds
1379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	%rax,%rax
1380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jmp	.Lexit
1381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.L12rounds:
1383221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	0(%rsi),%rax			# copy first 6 dwords
1384221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	8(%rsi),%rbx
1385221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	16(%rsi),%rdx
1386221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%rax,0(%rdi)
1387221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%rbx,8(%rdi)
1388221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%rdx,16(%rdi)
1389221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1390221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shr	\$32,%rdx
1391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	%ecx,%ecx
1392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jmp	.L12shortcut
1393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	4
1394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.L12loop:
1395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	0(%rdi),%eax			# rk[0]
1396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	20(%rdi),%edx			# rk[5]
1397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.L12shortcut:
1398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
1399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&enckey	();
1400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
1401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%eax,24(%rdi)			# rk[6]
1402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	4(%rdi),%eax
1403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%eax,28(%rdi)			# rk[7]
1404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	8(%rdi),%eax
1405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%eax,32(%rdi)			# rk[8]
1406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	12(%rdi),%eax
1407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%eax,36(%rdi)			# rk[9]
1408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		cmp	\$7,%ecx
1410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		je	.L12break
1411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		add	\$1,%ecx
1412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	16(%rdi),%eax
1414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%eax,40(%rdi)			# rk[10]
1415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	20(%rdi),%eax
1416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%eax,44(%rdi)			# rk[11]
1417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		lea	24(%rdi),%rdi
1419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jmp	.L12loop
1420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.L12break:
1421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movl	\$12,72(%rdi)		# setup number of rounds
1422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	%rax,%rax
1423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jmp	.Lexit
1424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.L14rounds:
1426221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	0(%rsi),%rax			# copy first 8 dwords
1427221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	8(%rsi),%rbx
1428221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	16(%rsi),%rcx
1429221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	24(%rsi),%rdx
1430221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%rax,0(%rdi)
1431221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%rbx,8(%rdi)
1432221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%rcx,16(%rdi)
1433221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%rdx,24(%rdi)
1434221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1435221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shr	\$32,%rdx
1436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	%ecx,%ecx
1437656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jmp	.L14shortcut
1438656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	4
1439656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.L14loop:
1440221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	0(%rdi),%eax			# rk[0]
1441656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	28(%rdi),%edx			# rk[4]
1442656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.L14shortcut:
1443656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
1444656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&enckey	();
1445656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
1446656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%eax,32(%rdi)			# rk[8]
1447656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	4(%rdi),%eax
1448656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%eax,36(%rdi)			# rk[9]
1449656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	8(%rdi),%eax
1450656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%eax,40(%rdi)			# rk[10]
1451656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	12(%rdi),%eax
1452656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%eax,44(%rdi)			# rk[11]
1453656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1454656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		cmp	\$6,%ecx
1455656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		je	.L14break
1456656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		add	\$1,%ecx
1457656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1458656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%eax,%edx
1459656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	16(%rdi),%eax			# rk[4]
1460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		movz	%dl,%esi			# rk[11]>>0
1461221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		movzb	-128(%rbp,%rsi),%ebx
1462656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		movz	%dh,%esi			# rk[11]>>8
1463656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	%ebx,%eax
1464656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1465221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		movzb	-128(%rbp,%rsi),%ebx
1466656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		shr	\$16,%edx
1467221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		shl	\$8,%ebx
1468656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		movz	%dl,%esi			# rk[11]>>16
1469656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	%ebx,%eax
1470656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1471221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		movzb	-128(%rbp,%rsi),%ebx
1472656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		movz	%dh,%esi			# rk[11]>>24
1473221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		shl	\$16,%ebx
1474656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	%ebx,%eax
1475656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1476221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		movzb	-128(%rbp,%rsi),%ebx
1477221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		shl	\$24,%ebx
1478656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	%ebx,%eax
1479656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1480656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%eax,48(%rdi)			# rk[12]
1481656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	20(%rdi),%eax
1482656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%eax,52(%rdi)			# rk[13]
1483656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	24(%rdi),%eax
1484656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%eax,56(%rdi)			# rk[14]
1485656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	28(%rdi),%eax
1486656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%eax,60(%rdi)			# rk[15]
1487656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1488656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		lea	32(%rdi),%rdi
1489656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jmp	.L14loop
1490656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.L14break:
1491656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movl	\$14,48(%rdi)		# setup number of rounds
1492656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	%rax,%rax
1493656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jmp	.Lexit
1494656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1495656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lbadpointer:
1496656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	\$-1,%rax
1497656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lexit:
1498221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	.byte	0xf3,0xc3			# rep ret
1499221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.size	_x86_64_AES_set_encrypt_key,.-_x86_64_AES_set_encrypt_key
1500656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
1501656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1502221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromsub deckey_ref()
1503656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ my ($i,$ptr,$te,$td) = @_;
1504221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  my ($tp1,$tp2,$tp4,$tp8,$acc)=("%eax","%ebx","%edi","%edx","%r8d");
1505656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
1506221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$i($ptr),$tp1
1507221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$tp1,$acc
1508221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and	\$0x80808080,$acc
1509221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$acc,$tp4
1510221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shr	\$7,$tp4
1511221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	0($tp1,$tp1),$tp2
1512221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sub	$tp4,$acc
1513221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and	\$0xfefefefe,$tp2
1514221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and	\$0x1b1b1b1b,$acc
1515221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$tp2,$acc
1516221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$acc,$tp2
1517221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1518221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and	\$0x80808080,$acc
1519221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$acc,$tp8
1520221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shr	\$7,$tp8
1521221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	0($tp2,$tp2),$tp4
1522221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sub	$tp8,$acc
1523221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and	\$0xfefefefe,$tp4
1524221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and	\$0x1b1b1b1b,$acc
1525221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	 xor	$tp1,$tp2		# tp2^tp1
1526221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$tp4,$acc
1527221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$acc,$tp4
1528221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1529221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and	\$0x80808080,$acc
1530221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$acc,$tp8
1531221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shr	\$7,$tp8
1532221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sub	$tp8,$acc
1533221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	0($tp4,$tp4),$tp8
1534221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	 xor	$tp1,$tp4		# tp4^tp1
1535221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and	\$0xfefefefe,$tp8
1536221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and	\$0x1b1b1b1b,$acc
1537221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$acc,$tp8
1538221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1539221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$tp8,$tp1		# tp1^tp8
1540221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	rol	\$8,$tp1		# ROTATE(tp1^tp8,8)
1541221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$tp8,$tp2		# tp2^tp1^tp8
1542221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$tp8,$tp4		# tp4^tp1^tp8
1543221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$tp2,$tp8
1544221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$tp4,$tp8		# tp8^(tp8^tp4^tp1)^(tp8^tp2^tp1)=tp8^tp4^tp2
1545221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1546221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$tp8,$tp1
1547221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	rol	\$24,$tp2		# ROTATE(tp2^tp1^tp8,24)
1548221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$tp2,$tp1
1549221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	rol	\$16,$tp4		# ROTATE(tp4^tp1^tp8,16)
1550221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	$tp4,$tp1
1551221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1552221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$tp1,$i($ptr)
1553656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
1554656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
1555656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1556392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# int private_AES_set_decrypt_key(const unsigned char *userKey, const int bits,
1557656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#                        AES_KEY *key)
1558656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
1559392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.globl	private_AES_set_decrypt_key
1560392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.type	private_AES_set_decrypt_key,\@function,3
1561656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	16
1562392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromprivate_AES_set_decrypt_key:
1563221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	push	%rbx
1564221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	push	%rbp
1565221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	push	%r12
1566221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	push	%r13
1567221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	push	%r14
1568221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	push	%r15
1569221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	push	%rdx			# save key schedule
1570221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Ldec_key_prologue:
1571221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1572221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	call	_x86_64_AES_set_encrypt_key
1573656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	(%rsp),%r8		# restore key schedule
1574221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	cmp	\$0,%eax
1575221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	jne	.Labort
1576656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1577221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	240(%r8),%r14d		# pull number of rounds
1578656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	%rdi,%rdi
1579221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	(%rdi,%r14d,4),%rcx
1580656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%r8,%rsi
1581656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	lea	(%r8,%rcx,4),%rdi	# pointer to last chunk
1582656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	4
1583656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Linvert:
1584656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	0(%rsi),%rax
1585656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	8(%rsi),%rbx
1586656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	0(%rdi),%rcx
1587656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	8(%rdi),%rdx
1588656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%rax,0(%rdi)
1589656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%rbx,8(%rdi)
1590656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%rcx,0(%rsi)
1591656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%rdx,8(%rsi)
1592656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		lea	16(%rsi),%rsi
1593656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		lea	-16(%rdi),%rdi
1594656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		cmp	%rsi,%rdi
1595656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jne	.Linvert
1596656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1597221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	.LAES_Te+2048+1024(%rip),%rax	# rcon
1598656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1599221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	40(%rax),$mask80
1600221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	48(%rax),$maskfe
1601221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	56(%rax),$mask1b
1602221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1603221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%r8,$key
1604221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sub	\$1,%r14d
1605656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	4
1606656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lpermute:
1607221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		lea	16($key),$key
1608221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	0($key),%rax
1609221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	8($key),%rcx
1610656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
1611221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		&dectransform ();
1612656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
1613221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	%eax,0($key)
1614221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	%ebx,4($key)
1615221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	%ecx,8($key)
1616221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	%edx,12($key)
1617221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		sub	\$1,%r14d
1618656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jnz	.Lpermute
1619656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1620656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xor	%rax,%rax
1621221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Labort:
1622221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	8(%rsp),%r15
1623221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	16(%rsp),%r14
1624221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	24(%rsp),%r13
1625221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	32(%rsp),%r12
1626221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	40(%rsp),%rbp
1627221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	48(%rsp),%rbx
1628221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	add	\$56,%rsp
1629221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Ldec_key_epilogue:
1630656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret
1631392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.size	private_AES_set_decrypt_key,.-private_AES_set_decrypt_key
1632656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
1633656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1634656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# void AES_cbc_encrypt (const void char *inp, unsigned char *out,
1635656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#			size_t length, const AES_KEY *key,
1636656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#			unsigned char *ivp,const int enc);
1637656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
1638656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# stack frame layout
1639656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# -8(%rsp)		return address
1640221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrommy $keyp="0(%rsp)";		# one to pass as $key
1641221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrommy $keyend="8(%rsp)";		# &(keyp->rd_key[4*keyp->rounds])
1642221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrommy $_rsp="16(%rsp)";		# saved %rsp
1643221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrommy $_inp="24(%rsp)";		# copy of 1st parameter, inp
1644221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrommy $_out="32(%rsp)";		# copy of 2nd parameter, out
1645221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrommy $_len="40(%rsp)";		# copy of 3rd parameter, length
1646221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrommy $_key="48(%rsp)";		# copy of 4th parameter, key
1647221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrommy $_ivp="56(%rsp)";		# copy of 5th parameter, ivp
1648221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrommy $ivec="64(%rsp)";		# ivec[16]
1649221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrommy $aes_key="80(%rsp)";		# copy of aes_key
1650221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrommy $mark="80+240(%rsp)";	# copy of aes_key->rounds
1651656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1652656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
1653656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.globl	AES_cbc_encrypt
1654656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.type	AES_cbc_encrypt,\@function,6
1655656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	16
1656221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.extern	OPENSSL_ia32cap_P
1657392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.globl	asm_AES_cbc_encrypt
1658392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.hidden	asm_AES_cbc_encrypt
1659392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromasm_AES_cbc_encrypt:
1660656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectAES_cbc_encrypt:
1661656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	cmp	\$0,%rdx	# check length
1662221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	je	.Lcbc_epilogue
1663221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	pushfq
1664656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	push	%rbx
1665656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	push	%rbp
1666656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	push	%r12
1667656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	push	%r13
1668656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	push	%r14
1669656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	push	%r15
1670221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lcbc_prologue:
1671221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1672656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	cld
1673656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%r9d,%r9d	# clear upper half of enc
1674656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1675221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	.LAES_Te(%rip),$sbox
1676656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	cmp	\$0,%r9
1677221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	jne	.Lcbc_picked_te
1678221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	.LAES_Td(%rip),$sbox
1679221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lcbc_picked_te:
1680221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1681221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	OPENSSL_ia32cap_P(%rip),%r10d
1682221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	cmp	\$$speed_limit,%rdx
1683221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	jb	.Lcbc_slow_prologue
1684221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	test	\$15,%rdx
1685221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	jnz	.Lcbc_slow_prologue
1686221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	bt	\$28,%r10d
1687221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	jc	.Lcbc_slow_prologue
1688656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1689656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	# allocate aligned stack frame...
1690221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	-88-248(%rsp),$key
1691656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$-64,$key
1692656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1693221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	# ... and make sure it doesn't alias with AES_T[ed] modulo 4096
1694656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$sbox,%r10
1695221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	2304($sbox),%r11
1696656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$key,%r12
1697656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$0xFFF,%r10	# s = $sbox&0xfff
1698656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$0xFFF,%r11	# e = ($sbox+2048)&0xfff
1699656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$0xFFF,%r12	# p = %rsp&0xfff
1700656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1701656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	cmp	%r11,%r12	# if (p=>e) %rsp =- (p-e);
1702656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jb	.Lcbc_te_break_out
1703656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sub	%r11,%r12
1704656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sub	%r12,$key
1705656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jmp	.Lcbc_te_ok
1706656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_te_break_out:		# else %rsp -= (p-s)&0xfff + framesz
1707656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sub	%r10,%r12
1708656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$0xFFF,%r12
1709656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	add	\$320,%r12
1710656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sub	%r12,$key
1711656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	4
1712656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_te_ok:
1713656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1714656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	xchg	%rsp,$key
1715221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	#add	\$8,%rsp	# reserve for return address!
1716656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$key,$_rsp	# save %rsp
1717221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lcbc_fast_body:
1718221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%rdi,$_inp	# save copy of inp
1719221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%rsi,$_out	# save copy of out
1720656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%rdx,$_len	# save copy of len
1721656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%rcx,$_key	# save copy of key
1722656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%r8,$_ivp	# save copy of ivp
1723656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	movl	\$0,$mark	# copy of aes_key->rounds = 0;
1724656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%r8,%rbp	# rearrange input arguments
1725221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%r9,%rbx
1726656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%rsi,$out
1727656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%rdi,$inp
1728656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%rcx,$key
1729656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1730221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	240($key),%eax		# key->rounds
1731656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	# do we copy key schedule to stack?
1732656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$key,%r10
1733656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sub	$sbox,%r10
1734656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	and	\$0xfff,%r10
1735221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	cmp	\$2304,%r10
1736656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jb	.Lcbc_do_ecopy
1737656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	cmp	\$4096-248,%r10
1738656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jb	.Lcbc_skip_ecopy
1739656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	4
1740656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_do_ecopy:
1741656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	$key,%rsi
1742656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		lea	$aes_key,%rdi
1743656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		lea	$aes_key,$key
1744656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	\$240/8,%ecx
1745656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		.long	0x90A548F3	# rep movsq
1746221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	%eax,(%rdi)	# copy aes_key->rounds
1747656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_skip_ecopy:
1748656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$key,$keyp	# save key pointer
1749656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1750221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	\$18,%ecx
1751656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	4
1752656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_prefetch_te:
1753656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	0($sbox),%r10
1754656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	32($sbox),%r11
1755656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	64($sbox),%r12
1756656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	96($sbox),%r13
1757656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		lea	128($sbox),$sbox
1758656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sub	\$1,%ecx
1759656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	jnz	.Lcbc_prefetch_te
1760221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	-2304($sbox),$sbox
1761656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1762221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	cmp	\$0,%rbx
1763221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	je	.LFAST_DECRYPT
1764221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1765221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#----------------------------- ENCRYPT -----------------------------#
1766656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	0(%rbp),$s0		# load iv
1767656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	4(%rbp),$s1
1768656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	8(%rbp),$s2
1769656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	12(%rbp),$s3
1770656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1771656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	4
1772221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lcbc_fast_enc_loop:
1773656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	0($inp),$s0
1774656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	4($inp),$s1
1775656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	8($inp),$s2
1776656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	12($inp),$s3
1777656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	$keyp,$key	# restore key
1778221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	$inp,$_inp	# if ($verticalspin) save inp
1779221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1780656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		call	_x86_64_AES_encrypt
1781656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1782221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	$_inp,$inp	# if ($verticalspin) restore inp
1783221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	$_len,%r10
1784656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	$s0,0($out)
1785656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	$s1,4($out)
1786656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	$s2,8($out)
1787656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	$s3,12($out)
1788656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1789656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		lea	16($inp),$inp
1790656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		lea	16($out),$out
1791656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sub	\$16,%r10
1792656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		test	\$-16,%r10
1793656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%r10,$_len
1794221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	jnz	.Lcbc_fast_enc_loop
1795656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$_ivp,%rbp	# restore ivp
1796656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$s0,0(%rbp)	# save ivec
1797656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$s1,4(%rbp)
1798656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$s2,8(%rbp)
1799656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$s3,12(%rbp)
1800656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1801221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	jmp	.Lcbc_fast_cleanup
1802221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1803656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#----------------------------- DECRYPT -----------------------------#
1804656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	16
1805221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.LFAST_DECRYPT:
1806221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	cmp	$inp,$out
1807221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	je	.Lcbc_fast_dec_in_place
1808656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1809221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%rbp,$ivec
1810656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	4
1811221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lcbc_fast_dec_loop:
1812221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	0($inp),$s0	# read input
1813221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	4($inp),$s1
1814221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	8($inp),$s2
1815221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	12($inp),$s3
1816221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	$keyp,$key	# restore key
1817221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	$inp,$_inp	# if ($verticalspin) save inp
1818656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1819656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		call	_x86_64_AES_decrypt
1820656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1821656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	$ivec,%rbp	# load ivp
1822221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	$_inp,$inp	# if ($verticalspin) restore inp
1823221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	$_len,%r10	# load len
1824656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	0(%rbp),$s0	# xor iv
1825656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	4(%rbp),$s1
1826656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	8(%rbp),$s2
1827656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		xor	12(%rbp),$s3
1828656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	$inp,%rbp	# current input, next iv
1829656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1830656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sub	\$16,%r10
1831656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%r10,$_len	# update len
1832656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	%rbp,$ivec	# update ivp
1833656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1834656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	$s0,0($out)	# write output
1835656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	$s1,4($out)
1836656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	$s2,8($out)
1837656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	$s3,12($out)
1838656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1839656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		lea	16($inp),$inp
1840656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		lea	16($out),$out
1841221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	jnz	.Lcbc_fast_dec_loop
1842656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	$_ivp,%r12		# load user ivp
1843656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	0(%rbp),%r10		# load iv
1844656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	8(%rbp),%r11
1845656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%r10,0(%r12)		# copy back to user
1846656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mov	%r11,8(%r12)
1847221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	jmp	.Lcbc_fast_cleanup
1848656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1849656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	16
1850221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lcbc_fast_dec_in_place:
1851221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	0(%rbp),%r10		# copy iv to stack
1852221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	8(%rbp),%r11
1853221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%r10,0+$ivec
1854221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%r11,8+$ivec
1855221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align	4
1856221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lcbc_fast_dec_in_place_loop:
1857656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	0($inp),$s0	# load input
1858656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	4($inp),$s1
1859656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	8($inp),$s2
1860656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	12($inp),$s3
1861221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	$keyp,$key	# restore key
1862221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	$inp,$_inp	# if ($verticalspin) save inp
1863656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1864656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		call	_x86_64_AES_decrypt
1865656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1866221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	$_inp,$inp	# if ($verticalspin) restore inp
1867221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	$_len,%r10
1868221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		xor	0+$ivec,$s0
1869221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		xor	4+$ivec,$s1
1870221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		xor	8+$ivec,$s2
1871221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		xor	12+$ivec,$s3
1872656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1873221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	0($inp),%r11	# load input
1874221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	8($inp),%r12
1875221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		sub	\$16,%r10
1876221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		jz	.Lcbc_fast_dec_in_place_done
1877221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1878221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	%r11,0+$ivec	# copy input to iv
1879221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	%r12,8+$ivec
1880656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1881656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	$s0,0($out)	# save output [zaps input]
1882656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	$s1,4($out)
1883656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	$s2,8($out)
1884656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mov	$s3,12($out)
1885656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1886656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		lea	16($inp),$inp
1887656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		lea	16($out),$out
1888221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	%r10,$_len
1889221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	jmp	.Lcbc_fast_dec_in_place_loop
1890221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lcbc_fast_dec_in_place_done:
1891221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$_ivp,%rdi
1892221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%r11,0(%rdi)	# copy iv back to user
1893221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%r12,8(%rdi)
1894221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1895221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$s0,0($out)	# save output [zaps input]
1896221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$s1,4($out)
1897221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$s2,8($out)
1898221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$s3,12($out)
1899656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1900656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	4
1901221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lcbc_fast_cleanup:
1902221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	cmpl	\$0,$mark	# was the key schedule copied?
1903221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	$aes_key,%rdi
1904221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	je	.Lcbc_exit
1905221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	\$240/8,%ecx
1906221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		xor	%rax,%rax
1907221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		.long	0x90AB48F3	# rep stosq
1908221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1909221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	jmp	.Lcbc_exit
1910221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1911221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#--------------------------- SLOW ROUTINE ---------------------------#
1912221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align	16
1913221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lcbc_slow_prologue:
1914221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	# allocate aligned stack frame...
1915221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	-88(%rsp),%rbp
1916221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and	\$-64,%rbp
1917221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	# ... just "above" key schedule
1918221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	-88-63(%rcx),%r10
1919221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sub	%rbp,%r10
1920221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	neg	%r10
1921221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and	\$0x3c0,%r10
1922221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sub	%r10,%rbp
1923221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1924221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xchg	%rsp,%rbp
1925221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	#add	\$8,%rsp	# reserve for return address!
1926221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%rbp,$_rsp	# save %rsp
1927221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lcbc_slow_body:
1928221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	#mov	%rdi,$_inp	# save copy of inp
1929221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	#mov	%rsi,$_out	# save copy of out
1930221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	#mov	%rdx,$_len	# save copy of len
1931221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	#mov	%rcx,$_key	# save copy of key
1932221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%r8,$_ivp	# save copy of ivp
1933221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%r8,%rbp	# rearrange input arguments
1934221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%r9,%rbx
1935221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%rsi,$out
1936221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%rdi,$inp
1937221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%rcx,$key
1938221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%rdx,%r10
1939221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1940221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	240($key),%eax
1941221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$key,$keyp	# save key pointer
1942221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shl	\$4,%eax
1943221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	($key,%rax),%rax
1944221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%rax,$keyend
1945221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1946221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	# pick Te4 copy which can't "overlap" with stack frame or key scdedule
1947221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	2048($sbox),$sbox
1948221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	768-8(%rsp),%rax
1949221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sub	$sbox,%rax
1950221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	and	\$0x300,%rax
1951221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	($sbox,%rax),$sbox
1952221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1953221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	cmp	\$0,%rbx
1954221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	je	.LSLOW_DECRYPT
1955221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1956221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#--------------------------- SLOW ENCRYPT ---------------------------#
1957221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	test	\$-16,%r10		# check upon length
1958221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	0(%rbp),$s0		# load iv
1959221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	4(%rbp),$s1
1960221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	8(%rbp),$s2
1961221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	12(%rbp),$s3
1962221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	jz	.Lcbc_slow_enc_tail	# short input...
1963221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1964221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align	4
1965221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lcbc_slow_enc_loop:
1966221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		xor	0($inp),$s0
1967221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		xor	4($inp),$s1
1968221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		xor	8($inp),$s2
1969221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		xor	12($inp),$s3
1970221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	$keyp,$key	# restore key
1971221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	$inp,$_inp	# save inp
1972221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	$out,$_out	# save out
1973221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	%r10,$_len	# save len
1974221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1975221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		call	_x86_64_AES_encrypt_compact
1976221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1977221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	$_inp,$inp	# restore inp
1978221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	$_out,$out	# restore out
1979221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	$_len,%r10	# restore len
1980221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	$s0,0($out)
1981221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	$s1,4($out)
1982221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	$s2,8($out)
1983221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	$s3,12($out)
1984221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1985221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		lea	16($inp),$inp
1986221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		lea	16($out),$out
1987221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		sub	\$16,%r10
1988221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		test	\$-16,%r10
1989221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	jnz	.Lcbc_slow_enc_loop
1990221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	test	\$15,%r10
1991221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	jnz	.Lcbc_slow_enc_tail
1992221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$_ivp,%rbp	# restore ivp
1993221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$s0,0(%rbp)	# save ivec
1994221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$s1,4(%rbp)
1995221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$s2,8(%rbp)
1996221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$s3,12(%rbp)
1997221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1998221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	jmp	.Lcbc_exit
1999221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2000221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align	4
2001221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lcbc_slow_enc_tail:
2002221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%rax,%r11
2003221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%rcx,%r12
2004221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%r10,%rcx
2005221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$inp,%rsi
2006221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$out,%rdi
2007221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	.long	0x9066A4F3		# rep movsb
2008221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	\$16,%rcx		# zero tail
2009221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sub	%r10,%rcx
2010221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	%rax,%rax
2011221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	.long	0x9066AAF3		# rep stosb
2012221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$out,$inp		# this is not a mistake!
2013221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	\$16,%r10		# len=16
2014221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%r11,%rax
2015221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%r12,%rcx
2016221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	jmp	.Lcbc_slow_enc_loop	# one more spin...
2017221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#--------------------------- SLOW DECRYPT ---------------------------#
2018221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align	16
2019221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.LSLOW_DECRYPT:
2020221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	shr	\$3,%rax
2021221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	add	%rax,$sbox		# recall "magic" constants!
2022221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2023221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	0(%rbp),%r11		# copy iv to stack
2024221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	8(%rbp),%r12
2025221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%r11,0+$ivec
2026221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%r12,8+$ivec
2027221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2028221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align	4
2029221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lcbc_slow_dec_loop:
2030221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	0($inp),$s0	# load input
2031221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	4($inp),$s1
2032221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	8($inp),$s2
2033221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	12($inp),$s3
2034221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	$keyp,$key	# restore key
2035221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	$inp,$_inp	# save inp
2036221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	$out,$_out	# save out
2037221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	%r10,$_len	# save len
2038221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2039221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		call	_x86_64_AES_decrypt_compact
2040221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2041221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	$_inp,$inp	# restore inp
2042221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	$_out,$out	# restore out
2043221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	$_len,%r10
2044221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		xor	0+$ivec,$s0
2045221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		xor	4+$ivec,$s1
2046221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		xor	8+$ivec,$s2
2047221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		xor	12+$ivec,$s3
2048221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2049221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	0($inp),%r11	# load input
2050221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	8($inp),%r12
2051221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		sub	\$16,%r10
2052221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		jc	.Lcbc_slow_dec_partial
2053221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		jz	.Lcbc_slow_dec_done
2054221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2055221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	%r11,0+$ivec	# copy input to iv
2056221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	%r12,8+$ivec
2057221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2058221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	$s0,0($out)	# save output [can zap input]
2059221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	$s1,4($out)
2060221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	$s2,8($out)
2061221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		mov	$s3,12($out)
2062221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2063221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		lea	16($inp),$inp
2064221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		lea	16($out),$out
2065221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	jmp	.Lcbc_slow_dec_loop
2066221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lcbc_slow_dec_done:
2067221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$_ivp,%rdi
2068221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%r11,0(%rdi)		# copy iv back to user
2069221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%r12,8(%rdi)
2070221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2071221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$s0,0($out)		# save output [can zap input]
2072221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$s1,4($out)
2073221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$s2,8($out)
2074221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$s3,12($out)
2075221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2076221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	jmp	.Lcbc_exit
2077221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2078221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align	4
2079221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lcbc_slow_dec_partial:
2080221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$_ivp,%rdi
2081221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%r11,0(%rdi)		# copy iv back to user
2082221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%r12,8(%rdi)
2083221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2084221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$s0,0+$ivec		# save output to stack
2085221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$s1,4+$ivec
2086221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$s2,8+$ivec
2087221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$s3,12+$ivec
2088221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2089221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$out,%rdi
2090221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	$ivec,%rsi
2091221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	16(%r10),%rcx
2092221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	.long	0x9066A4F3	# rep movsb
2093221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	jmp	.Lcbc_exit
2094221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2095221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align	16
2096221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lcbc_exit:
2097221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$_rsp,%rsi
2098221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	(%rsi),%r15
2099221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	8(%rsi),%r14
2100221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	16(%rsi),%r13
2101221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	24(%rsi),%r12
2102221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	32(%rsi),%rbp
2103221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	40(%rsi),%rbx
2104221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	48(%rsi),%rsp
2105221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lcbc_popfq:
2106221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	popfq
2107221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lcbc_epilogue:
2108221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ret
2109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.size	AES_cbc_encrypt,.-AES_cbc_encrypt
2110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
2111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
2112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
2113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
2114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	64
2115221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.LAES_Te:
2116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
2117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xa56363c6, 0x847c7cf8, 0x997777ee, 0x8d7b7bf6);
2118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x0df2f2ff, 0xbd6b6bd6, 0xb16f6fde, 0x54c5c591);
2119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x50303060, 0x03010102, 0xa96767ce, 0x7d2b2b56);
2120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x19fefee7, 0x62d7d7b5, 0xe6abab4d, 0x9a7676ec);
2121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x45caca8f, 0x9d82821f, 0x40c9c989, 0x877d7dfa);
2122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x15fafaef, 0xeb5959b2, 0xc947478e, 0x0bf0f0fb);
2123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xecadad41, 0x67d4d4b3, 0xfda2a25f, 0xeaafaf45);
2124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xbf9c9c23, 0xf7a4a453, 0x967272e4, 0x5bc0c09b);
2125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xc2b7b775, 0x1cfdfde1, 0xae93933d, 0x6a26264c);
2126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x5a36366c, 0x413f3f7e, 0x02f7f7f5, 0x4fcccc83);
2127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x5c343468, 0xf4a5a551, 0x34e5e5d1, 0x08f1f1f9);
2128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x937171e2, 0x73d8d8ab, 0x53313162, 0x3f15152a);
2129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x0c040408, 0x52c7c795, 0x65232346, 0x5ec3c39d);
2130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x28181830, 0xa1969637, 0x0f05050a, 0xb59a9a2f);
2131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x0907070e, 0x36121224, 0x9b80801b, 0x3de2e2df);
2132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x26ebebcd, 0x6927274e, 0xcdb2b27f, 0x9f7575ea);
2133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x1b090912, 0x9e83831d, 0x742c2c58, 0x2e1a1a34);
2134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x2d1b1b36, 0xb26e6edc, 0xee5a5ab4, 0xfba0a05b);
2135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xf65252a4, 0x4d3b3b76, 0x61d6d6b7, 0xceb3b37d);
2136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x7b292952, 0x3ee3e3dd, 0x712f2f5e, 0x97848413);
2137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xf55353a6, 0x68d1d1b9, 0x00000000, 0x2cededc1);
2138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x60202040, 0x1ffcfce3, 0xc8b1b179, 0xed5b5bb6);
2139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xbe6a6ad4, 0x46cbcb8d, 0xd9bebe67, 0x4b393972);
2140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xde4a4a94, 0xd44c4c98, 0xe85858b0, 0x4acfcf85);
2141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x6bd0d0bb, 0x2aefefc5, 0xe5aaaa4f, 0x16fbfbed);
2142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xc5434386, 0xd74d4d9a, 0x55333366, 0x94858511);
2143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xcf45458a, 0x10f9f9e9, 0x06020204, 0x817f7ffe);
2144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xf05050a0, 0x443c3c78, 0xba9f9f25, 0xe3a8a84b);
2145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xf35151a2, 0xfea3a35d, 0xc0404080, 0x8a8f8f05);
2146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xad92923f, 0xbc9d9d21, 0x48383870, 0x04f5f5f1);
2147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xdfbcbc63, 0xc1b6b677, 0x75dadaaf, 0x63212142);
2148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x30101020, 0x1affffe5, 0x0ef3f3fd, 0x6dd2d2bf);
2149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x4ccdcd81, 0x140c0c18, 0x35131326, 0x2fececc3);
2150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xe15f5fbe, 0xa2979735, 0xcc444488, 0x3917172e);
2151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x57c4c493, 0xf2a7a755, 0x827e7efc, 0x473d3d7a);
2152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xac6464c8, 0xe75d5dba, 0x2b191932, 0x957373e6);
2153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xa06060c0, 0x98818119, 0xd14f4f9e, 0x7fdcdca3);
2154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x66222244, 0x7e2a2a54, 0xab90903b, 0x8388880b);
2155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xca46468c, 0x29eeeec7, 0xd3b8b86b, 0x3c141428);
2156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x79dedea7, 0xe25e5ebc, 0x1d0b0b16, 0x76dbdbad);
2157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x3be0e0db, 0x56323264, 0x4e3a3a74, 0x1e0a0a14);
2158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xdb494992, 0x0a06060c, 0x6c242448, 0xe45c5cb8);
2159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x5dc2c29f, 0x6ed3d3bd, 0xefacac43, 0xa66262c4);
2160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xa8919139, 0xa4959531, 0x37e4e4d3, 0x8b7979f2);
2161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x32e7e7d5, 0x43c8c88b, 0x5937376e, 0xb76d6dda);
2162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x8c8d8d01, 0x64d5d5b1, 0xd24e4e9c, 0xe0a9a949);
2163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xb46c6cd8, 0xfa5656ac, 0x07f4f4f3, 0x25eaeacf);
2164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xaf6565ca, 0x8e7a7af4, 0xe9aeae47, 0x18080810);
2165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xd5baba6f, 0x887878f0, 0x6f25254a, 0x722e2e5c);
2166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x241c1c38, 0xf1a6a657, 0xc7b4b473, 0x51c6c697);
2167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x23e8e8cb, 0x7cdddda1, 0x9c7474e8, 0x211f1f3e);
2168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xdd4b4b96, 0xdcbdbd61, 0x868b8b0d, 0x858a8a0f);
2169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x907070e0, 0x423e3e7c, 0xc4b5b571, 0xaa6666cc);
2170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xd8484890, 0x05030306, 0x01f6f6f7, 0x120e0e1c);
2171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xa36161c2, 0x5f35356a, 0xf95757ae, 0xd0b9b969);
2172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x91868617, 0x58c1c199, 0x271d1d3a, 0xb99e9e27);
2173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x38e1e1d9, 0x13f8f8eb, 0xb398982b, 0x33111122);
2174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xbb6969d2, 0x70d9d9a9, 0x898e8e07, 0xa7949433);
2175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xb69b9b2d, 0x221e1e3c, 0x92878715, 0x20e9e9c9);
2176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x49cece87, 0xff5555aa, 0x78282850, 0x7adfdfa5);
2177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x8f8c8c03, 0xf8a1a159, 0x80898909, 0x170d0d1a);
2178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xdabfbf65, 0x31e6e6d7, 0xc6424284, 0xb86868d0);
2179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xc3414182, 0xb0999929, 0x772d2d5a, 0x110f0f1e);
2180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xcbb0b07b, 0xfc5454a8, 0xd6bbbb6d, 0x3a16162c);
2181221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2182221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#Te4	# four copies of Te4 to choose from to avoid L1 aliasing
2183221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5);
2184221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76);
2185221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0);
2186221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0);
2187221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc);
2188221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15);
2189221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a);
2190221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75);
2191221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0);
2192221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84);
2193221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b);
2194221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf);
2195221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85);
2196221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8);
2197221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5);
2198221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2);
2199221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17);
2200221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73);
2201221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88);
2202221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb);
2203221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c);
2204221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79);
2205221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9);
2206221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08);
2207221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6);
2208221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a);
2209221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e);
2210221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e);
2211221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94);
2212221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf);
2213221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68);
2214221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16);
2215221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2216221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5);
2217221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76);
2218221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0);
2219221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0);
2220221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc);
2221221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15);
2222221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a);
2223221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75);
2224221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0);
2225221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84);
2226221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b);
2227221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf);
2228221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85);
2229221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8);
2230221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5);
2231221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2);
2232221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17);
2233221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73);
2234221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88);
2235221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb);
2236221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c);
2237221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79);
2238221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9);
2239221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08);
2240221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6);
2241221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a);
2242221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e);
2243221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e);
2244221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94);
2245221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf);
2246221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68);
2247221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16);
2248221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2249221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5);
2250221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76);
2251221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0);
2252221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0);
2253221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc);
2254221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15);
2255221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a);
2256221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75);
2257221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0);
2258221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84);
2259221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b);
2260221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf);
2261221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85);
2262221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8);
2263221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5);
2264221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2);
2265221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17);
2266221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73);
2267221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88);
2268221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb);
2269221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c);
2270221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79);
2271221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9);
2272221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08);
2273221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6);
2274221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a);
2275221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e);
2276221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e);
2277221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94);
2278221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf);
2279221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68);
2280221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16);
2281221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2282221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5);
2283221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76);
2284221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0);
2285221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0);
2286221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc);
2287221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15);
2288221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a);
2289221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75);
2290221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0);
2291221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84);
2292221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b);
2293221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf);
2294221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85);
2295221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8);
2296221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5);
2297221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2);
2298221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17);
2299221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73);
2300221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88);
2301221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb);
2302221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c);
2303221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79);
2304221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9);
2305221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08);
2306221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6);
2307221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a);
2308221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e);
2309221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e);
2310221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94);
2311221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf);
2312221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68);
2313221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16);
2314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#rcon:
2315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
2316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	.long	0x00000001, 0x00000002, 0x00000004, 0x00000008
2317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	.long	0x00000010, 0x00000020, 0x00000040, 0x00000080
2318221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	.long	0x0000001b, 0x00000036, 0x80808080, 0x80808080
2319221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	.long	0xfefefefe, 0xfefefefe, 0x1b1b1b1b, 0x1b1b1b1b
2320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
2321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___;
2322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align	64
2323221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.LAES_Td:
2324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___
2325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x50a7f451, 0x5365417e, 0xc3a4171a, 0x965e273a);
2326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xcb6bab3b, 0xf1459d1f, 0xab58faac, 0x9303e34b);
2327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x55fa3020, 0xf66d76ad, 0x9176cc88, 0x254c02f5);
2328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xfcd7e54f, 0xd7cb2ac5, 0x80443526, 0x8fa362b5);
2329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x495ab1de, 0x671bba25, 0x980eea45, 0xe1c0fe5d);
2330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x02752fc3, 0x12f04c81, 0xa397468d, 0xc6f9d36b);
2331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xe75f8f03, 0x959c9215, 0xeb7a6dbf, 0xda595295);
2332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x2d83bed4, 0xd3217458, 0x2969e049, 0x44c8c98e);
2333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x6a89c275, 0x78798ef4, 0x6b3e5899, 0xdd71b927);
2334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xb64fe1be, 0x17ad88f0, 0x66ac20c9, 0xb43ace7d);
2335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x184adf63, 0x82311ae5, 0x60335197, 0x457f5362);
2336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xe07764b1, 0x84ae6bbb, 0x1ca081fe, 0x942b08f9);
2337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x58684870, 0x19fd458f, 0x876cde94, 0xb7f87b52);
2338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x23d373ab, 0xe2024b72, 0x578f1fe3, 0x2aab5566);
2339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x0728ebb2, 0x03c2b52f, 0x9a7bc586, 0xa50837d3);
2340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xf2872830, 0xb2a5bf23, 0xba6a0302, 0x5c8216ed);
2341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x2b1ccf8a, 0x92b479a7, 0xf0f207f3, 0xa1e2694e);
2342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xcdf4da65, 0xd5be0506, 0x1f6234d1, 0x8afea6c4);
2343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x9d532e34, 0xa055f3a2, 0x32e18a05, 0x75ebf6a4);
2344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x39ec830b, 0xaaef6040, 0x069f715e, 0x51106ebd);
2345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xf98a213e, 0x3d06dd96, 0xae053edd, 0x46bde64d);
2346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xb58d5491, 0x055dc471, 0x6fd40604, 0xff155060);
2347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x24fb9819, 0x97e9bdd6, 0xcc434089, 0x779ed967);
2348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xbd42e8b0, 0x888b8907, 0x385b19e7, 0xdbeec879);
2349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x470a7ca1, 0xe90f427c, 0xc91e84f8, 0x00000000);
2350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x83868009, 0x48ed2b32, 0xac70111e, 0x4e725a6c);
2351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xfbff0efd, 0x5638850f, 0x1ed5ae3d, 0x27392d36);
2352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x64d90f0a, 0x21a65c68, 0xd1545b9b, 0x3a2e3624);
2353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xb1670a0c, 0x0fe75793, 0xd296eeb4, 0x9e919b1b);
2354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x4fc5c080, 0xa220dc61, 0x694b775a, 0x161a121c);
2355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x0aba93e2, 0xe52aa0c0, 0x43e0223c, 0x1d171b12);
2356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x0b0d090e, 0xadc78bf2, 0xb9a8b62d, 0xc8a91e14);
2357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x8519f157, 0x4c0775af, 0xbbdd99ee, 0xfd607fa3);
2358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x9f2601f7, 0xbcf5725c, 0xc53b6644, 0x347efb5b);
2359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x7629438b, 0xdcc623cb, 0x68fcedb6, 0x63f1e4b8);
2360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xcadc31d7, 0x10856342, 0x40229713, 0x2011c684);
2361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x7d244a85, 0xf83dbbd2, 0x1132f9ae, 0x6da129c7);
2362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x4b2f9e1d, 0xf330b2dc, 0xec52860d, 0xd0e3c177);
2363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x6c16b32b, 0x99b970a9, 0xfa489411, 0x2264e947);
2364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xc48cfca8, 0x1a3ff0a0, 0xd82c7d56, 0xef903322);
2365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xc74e4987, 0xc1d138d9, 0xfea2ca8c, 0x360bd498);
2366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xcf81f5a6, 0x28de7aa5, 0x268eb7da, 0xa4bfad3f);
2367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xe49d3a2c, 0x0d927850, 0x9bcc5f6a, 0x62467e54);
2368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xc2138df6, 0xe8b8d890, 0x5ef7392e, 0xf5afc382);
2369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xbe805d9f, 0x7c93d069, 0xa92dd56f, 0xb31225cf);
2370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x3b99acc8, 0xa77d1810, 0x6e639ce8, 0x7bbb3bdb);
2371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x097826cd, 0xf418596e, 0x01b79aec, 0xa89a4f83);
2372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x656e95e6, 0x7ee6ffaa, 0x08cfbc21, 0xe6e815ef);
2373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xd99be7ba, 0xce366f4a, 0xd4099fea, 0xd67cb029);
2374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xafb2a431, 0x31233f2a, 0x3094a5c6, 0xc066a235);
2375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x37bc4e74, 0xa6ca82fc, 0xb0d090e0, 0x15d8a733);
2376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x4a9804f1, 0xf7daec41, 0x0e50cd7f, 0x2ff69117);
2377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x8dd64d76, 0x4db0ef43, 0x544daacc, 0xdf0496e4);
2378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xe3b5d19e, 0x1b886a4c, 0xb81f2cc1, 0x7f516546);
2379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x04ea5e9d, 0x5d358c01, 0x737487fa, 0x2e410bfb);
2380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x5a1d67b3, 0x52d2db92, 0x335610e9, 0x1347d66d);
2381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x8c61d79a, 0x7a0ca137, 0x8e14f859, 0x893c13eb);
2382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xee27a9ce, 0x35c961b7, 0xede51ce1, 0x3cb1477a);
2383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x59dfd29c, 0x3f73f255, 0x79ce1418, 0xbf37c773);
2384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0xeacdf753, 0x5baafd5f, 0x146f3ddf, 0x86db4478);
2385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x81f3afca, 0x3ec468b9, 0x2c342438, 0x5f40a3c2);
2386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x72c31d16, 0x0c25e2bc, 0x8b493c28, 0x41950dff);
2387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x7101a839, 0xdeb30c08, 0x9ce4b4d8, 0x90c15664);
2388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&_data_word(0x6184cb7b, 0x70b632d5, 0x745c6c48, 0x4257b8d0);
2389221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2390221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#Td4:	# four copies of Td4 to choose from to avoid L1 aliasing
2391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38);
2392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb);
2393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87);
2394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb);
2395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d);
2396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e);
2397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2);
2398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25);
2399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16);
2400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92);
2401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda);
2402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84);
2403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a);
2404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06);
2405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02);
2406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b);
2407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea);
2408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73);
2409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85);
2410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e);
2411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89);
2412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b);
2413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20);
2414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4);
2415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31);
2416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f);
2417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d);
2418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef);
2419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0);
2420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61);
2421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26);
2422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_byte(0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d);
2423221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___;
2424221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	.long	0x80808080, 0x80808080, 0xfefefefe, 0xfefefefe
2425221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	.long	0x1b1b1b1b, 0x1b1b1b1b, 0, 0
2426221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___
2427221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38);
2428221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb);
2429221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87);
2430221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb);
2431221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d);
2432221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e);
2433221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2);
2434221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25);
2435221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16);
2436221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92);
2437221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda);
2438221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84);
2439221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a);
2440221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06);
2441221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02);
2442221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b);
2443221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea);
2444221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73);
2445221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85);
2446221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e);
2447221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89);
2448221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b);
2449221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20);
2450221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4);
2451221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31);
2452221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f);
2453221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d);
2454221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef);
2455221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0);
2456221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61);
2457221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26);
2458221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d);
2459221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___;
2460221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	.long	0x80808080, 0x80808080, 0xfefefefe, 0xfefefefe
2461221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	.long	0x1b1b1b1b, 0x1b1b1b1b, 0, 0
2462221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___
2463221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38);
2464221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb);
2465221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87);
2466221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb);
2467221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d);
2468221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e);
2469221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2);
2470221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25);
2471221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16);
2472221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92);
2473221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda);
2474221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84);
2475221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a);
2476221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06);
2477221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02);
2478221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b);
2479221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea);
2480221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73);
2481221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85);
2482221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e);
2483221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89);
2484221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b);
2485221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20);
2486221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4);
2487221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31);
2488221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f);
2489221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d);
2490221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef);
2491221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0);
2492221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61);
2493221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26);
2494221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d);
2495221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___;
2496221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	.long	0x80808080, 0x80808080, 0xfefefefe, 0xfefefefe
2497221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	.long	0x1b1b1b1b, 0x1b1b1b1b, 0, 0
2498221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___
2499221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38);
2500221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb);
2501221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87);
2502221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb);
2503221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d);
2504221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e);
2505221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2);
2506221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25);
2507221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16);
2508221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92);
2509221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda);
2510221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84);
2511221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a);
2512221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06);
2513221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02);
2514221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b);
2515221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea);
2516221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73);
2517221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85);
2518221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e);
2519221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89);
2520221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b);
2521221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20);
2522221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4);
2523221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31);
2524221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f);
2525221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d);
2526221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef);
2527221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0);
2528221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61);
2529221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26);
2530221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&data_byte(0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d);
2531221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___;
2532221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	.long	0x80808080, 0x80808080, 0xfefefefe, 0xfefefefe
2533221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	.long	0x1b1b1b1b, 0x1b1b1b1b, 0, 0
2534221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.asciz  "AES for x86_64, CRYPTOGAMS by <appro\@openssl.org>"
2535221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align	64
2536221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___
2537221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2538221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# EXCEPTION_DISPOSITION handler (EXCEPTION_RECORD *rec,ULONG64 frame,
2539221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#		CONTEXT *context,DISPATCHER_CONTEXT *disp)
2540221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromif ($win64) {
2541221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$rec="%rcx";
2542221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$frame="%rdx";
2543221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$context="%r8";
2544221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$disp="%r9";
2545221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2546221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___;
2547221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.extern	__imp_RtlVirtualUnwind
2548221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.type	block_se_handler,\@abi-omnipotent
2549221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align	16
2550221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromblock_se_handler:
2551221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	push	%rsi
2552221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	push	%rdi
2553221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	push	%rbx
2554221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	push	%rbp
2555221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	push	%r12
2556221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	push	%r13
2557221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	push	%r14
2558221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	push	%r15
2559221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	pushfq
2560221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sub	\$64,%rsp
2561221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2562221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	120($context),%rax	# pull context->Rax
2563221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	248($context),%rbx	# pull context->Rip
2564221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2565221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	8($disp),%rsi		# disp->ImageBase
2566221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	56($disp),%r11		# disp->HandlerData
2567221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2568221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	0(%r11),%r10d		# HandlerData[0]
2569221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	(%rsi,%r10),%r10	# prologue label
2570221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	cmp	%r10,%rbx		# context->Rip<prologue label
2571221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	jb	.Lin_block_prologue
2572221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2573221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	152($context),%rax	# pull context->Rsp
2574221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2575221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	4(%r11),%r10d		# HandlerData[1]
2576221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	(%rsi,%r10),%r10	# epilogue label
2577221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	cmp	%r10,%rbx		# context->Rip>=epilogue label
2578221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	jae	.Lin_block_prologue
2579221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2580221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	24(%rax),%rax		# pull saved real stack pointer
2581221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	48(%rax),%rax		# adjust...
2582221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2583221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	-8(%rax),%rbx
2584221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	-16(%rax),%rbp
2585221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	-24(%rax),%r12
2586221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	-32(%rax),%r13
2587221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	-40(%rax),%r14
2588221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	-48(%rax),%r15
2589221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%rbx,144($context)	# restore context->Rbx
2590221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%rbp,160($context)	# restore context->Rbp
2591221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%r12,216($context)	# restore context->R12
2592221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%r13,224($context)	# restore context->R13
2593221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%r14,232($context)	# restore context->R14
2594221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%r15,240($context)	# restore context->R15
2595221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2596221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lin_block_prologue:
2597221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	8(%rax),%rdi
2598221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	16(%rax),%rsi
2599221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%rax,152($context)	# restore context->Rsp
2600221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%rsi,168($context)	# restore context->Rsi
2601221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%rdi,176($context)	# restore context->Rdi
2602221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2603221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	jmp	.Lcommon_seh_exit
2604221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.size	block_se_handler,.-block_se_handler
2605221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2606221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.type	key_se_handler,\@abi-omnipotent
2607221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align	16
2608221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromkey_se_handler:
2609221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	push	%rsi
2610221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	push	%rdi
2611221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	push	%rbx
2612221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	push	%rbp
2613221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	push	%r12
2614221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	push	%r13
2615221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	push	%r14
2616221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	push	%r15
2617221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	pushfq
2618221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sub	\$64,%rsp
2619221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2620221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	120($context),%rax	# pull context->Rax
2621221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	248($context),%rbx	# pull context->Rip
2622221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2623221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	8($disp),%rsi		# disp->ImageBase
2624221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	56($disp),%r11		# disp->HandlerData
2625221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2626221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	0(%r11),%r10d		# HandlerData[0]
2627221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	(%rsi,%r10),%r10	# prologue label
2628221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	cmp	%r10,%rbx		# context->Rip<prologue label
2629221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	jb	.Lin_key_prologue
2630221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2631221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	152($context),%rax	# pull context->Rsp
2632221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2633221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	4(%r11),%r10d		# HandlerData[1]
2634221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	(%rsi,%r10),%r10	# epilogue label
2635221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	cmp	%r10,%rbx		# context->Rip>=epilogue label
2636221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	jae	.Lin_key_prologue
2637221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2638221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	56(%rax),%rax
2639221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2640221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	-8(%rax),%rbx
2641221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	-16(%rax),%rbp
2642221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	-24(%rax),%r12
2643221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	-32(%rax),%r13
2644221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	-40(%rax),%r14
2645221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	-48(%rax),%r15
2646221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%rbx,144($context)	# restore context->Rbx
2647221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%rbp,160($context)	# restore context->Rbp
2648221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%r12,216($context)	# restore context->R12
2649221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%r13,224($context)	# restore context->R13
2650221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%r14,232($context)	# restore context->R14
2651221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%r15,240($context)	# restore context->R15
2652221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2653221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lin_key_prologue:
2654221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	8(%rax),%rdi
2655221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	16(%rax),%rsi
2656221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%rax,152($context)	# restore context->Rsp
2657221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%rsi,168($context)	# restore context->Rsi
2658221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%rdi,176($context)	# restore context->Rdi
2659221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2660221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	jmp	.Lcommon_seh_exit
2661221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.size	key_se_handler,.-key_se_handler
2662221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2663221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.type	cbc_se_handler,\@abi-omnipotent
2664221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align	16
2665221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromcbc_se_handler:
2666221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	push	%rsi
2667221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	push	%rdi
2668221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	push	%rbx
2669221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	push	%rbp
2670221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	push	%r12
2671221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	push	%r13
2672221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	push	%r14
2673221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	push	%r15
2674221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	pushfq
2675221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sub	\$64,%rsp
2676221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2677221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	120($context),%rax	# pull context->Rax
2678221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	248($context),%rbx	# pull context->Rip
2679221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2680221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	.Lcbc_prologue(%rip),%r10
2681221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	cmp	%r10,%rbx		# context->Rip<.Lcbc_prologue
2682221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	jb	.Lin_cbc_prologue
2683221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2684221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	.Lcbc_fast_body(%rip),%r10
2685221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	cmp	%r10,%rbx		# context->Rip<.Lcbc_fast_body
2686221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	jb	.Lin_cbc_frame_setup
2687221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2688221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	.Lcbc_slow_prologue(%rip),%r10
2689221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	cmp	%r10,%rbx		# context->Rip<.Lcbc_slow_prologue
2690221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	jb	.Lin_cbc_body
2691221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2692221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	.Lcbc_slow_body(%rip),%r10
2693221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	cmp	%r10,%rbx		# context->Rip<.Lcbc_slow_body
2694221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	jb	.Lin_cbc_frame_setup
2695221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2696221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lin_cbc_body:
2697221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	152($context),%rax	# pull context->Rsp
2698221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2699221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	.Lcbc_epilogue(%rip),%r10
2700221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	cmp	%r10,%rbx		# context->Rip>=.Lcbc_epilogue
2701221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	jae	.Lin_cbc_prologue
2702221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2703221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	8(%rax),%rax
2704221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2705221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	.Lcbc_popfq(%rip),%r10
2706221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	cmp	%r10,%rbx		# context->Rip>=.Lcbc_popfq
2707221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	jae	.Lin_cbc_prologue
2708221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2709221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	`16-8`(%rax),%rax	# biased $_rsp
2710221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	56(%rax),%rax
2711221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2712221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lin_cbc_frame_setup:
2713221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	-16(%rax),%rbx
2714221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	-24(%rax),%rbp
2715221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	-32(%rax),%r12
2716221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	-40(%rax),%r13
2717221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	-48(%rax),%r14
2718221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	-56(%rax),%r15
2719221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%rbx,144($context)	# restore context->Rbx
2720221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%rbp,160($context)	# restore context->Rbp
2721221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%r12,216($context)	# restore context->R12
2722221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%r13,224($context)	# restore context->R13
2723221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%r14,232($context)	# restore context->R14
2724221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%r15,240($context)	# restore context->R15
2725221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2726221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lin_cbc_prologue:
2727221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	8(%rax),%rdi
2728221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	16(%rax),%rsi
2729221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%rax,152($context)	# restore context->Rsp
2730221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%rsi,168($context)	# restore context->Rsi
2731221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%rdi,176($context)	# restore context->Rdi
2732221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2733221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lcommon_seh_exit:
2734221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2735221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	40($disp),%rdi		# disp->ContextRecord
2736221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$context,%rsi		# context
2737221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	\$`1232/8`,%ecx		# sizeof(CONTEXT)
2738221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	.long	0xa548f3fc		# cld; rep movsq
2739221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2740221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	$disp,%rsi
2741221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xor	%rcx,%rcx		# arg1, UNW_FLAG_NHANDLER
2742221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	8(%rsi),%rdx		# arg2, disp->ImageBase
2743221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	0(%rsi),%r8		# arg3, disp->ControlPc
2744221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	16(%rsi),%r9		# arg4, disp->FunctionEntry
2745221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	40(%rsi),%r10		# disp->ContextRecord
2746221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	56(%rsi),%r11		# &disp->HandlerData
2747221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lea	24(%rsi),%r12		# &disp->EstablisherFrame
2748221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%r10,32(%rsp)		# arg5
2749221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%r11,40(%rsp)		# arg6
2750221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%r12,48(%rsp)		# arg7
2751221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	%rcx,56(%rsp)		# arg8, (NULL)
2752221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	call	*__imp_RtlVirtualUnwind(%rip)
2753221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2754221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mov	\$1,%eax		# ExceptionContinueSearch
2755221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	add	\$64,%rsp
2756221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	popfq
2757221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	pop	%r15
2758221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	pop	%r14
2759221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	pop	%r13
2760221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	pop	%r12
2761221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	pop	%rbp
2762221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	pop	%rbx
2763221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	pop	%rdi
2764221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	pop	%rsi
2765221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ret
2766221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.size	cbc_se_handler,.-cbc_se_handler
2767221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2768221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.section	.pdata
2769221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align	4
2770221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	.rva	.LSEH_begin_AES_encrypt
2771221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	.rva	.LSEH_end_AES_encrypt
2772221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	.rva	.LSEH_info_AES_encrypt
2773221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2774221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	.rva	.LSEH_begin_AES_decrypt
2775221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	.rva	.LSEH_end_AES_decrypt
2776221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	.rva	.LSEH_info_AES_decrypt
2777221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2778392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	.rva	.LSEH_begin_private_AES_set_encrypt_key
2779392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	.rva	.LSEH_end_private_AES_set_encrypt_key
2780392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	.rva	.LSEH_info_private_AES_set_encrypt_key
2781221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2782392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	.rva	.LSEH_begin_private_AES_set_decrypt_key
2783392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	.rva	.LSEH_end_private_AES_set_decrypt_key
2784392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	.rva	.LSEH_info_private_AES_set_decrypt_key
2785221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2786221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	.rva	.LSEH_begin_AES_cbc_encrypt
2787221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	.rva	.LSEH_end_AES_cbc_encrypt
2788221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	.rva	.LSEH_info_AES_cbc_encrypt
2789221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2790221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.section	.xdata
2791221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align	8
2792221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.LSEH_info_AES_encrypt:
2793221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	.byte	9,0,0,0
2794221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	.rva	block_se_handler
2795221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	.rva	.Lenc_prologue,.Lenc_epilogue	# HandlerData[]
2796221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.LSEH_info_AES_decrypt:
2797221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	.byte	9,0,0,0
2798221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	.rva	block_se_handler
2799221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	.rva	.Ldec_prologue,.Ldec_epilogue	# HandlerData[]
2800392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.LSEH_info_private_AES_set_encrypt_key:
2801221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	.byte	9,0,0,0
2802221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	.rva	key_se_handler
2803221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	.rva	.Lenc_key_prologue,.Lenc_key_epilogue	# HandlerData[]
2804392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.LSEH_info_private_AES_set_decrypt_key:
2805221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	.byte	9,0,0,0
2806221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	.rva	key_se_handler
2807221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	.rva	.Ldec_key_prologue,.Ldec_key_epilogue	# HandlerData[]
2808221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.LSEH_info_AES_cbc_encrypt:
2809221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	.byte	9,0,0,0
2810221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	.rva	cbc_se_handler
2811221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___
2812221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom}
2813656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
2814656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code =~ s/\`([^\`]*)\`/eval($1)/gem;
2815656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
2816656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectprint $code;
2817656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
2818656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectclose STDOUT;
2819