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