1238384Sjkim#!/usr/bin/env perl
2238384Sjkim#
3238384Sjkim# ====================================================================
4238384Sjkim# Written by Andy Polyakov <appro@fy.chalmers.se> for the OpenSSL
5238384Sjkim# project. Rights for redistribution and usage in source and binary
6238384Sjkim# forms are granted according to the OpenSSL license.
7238384Sjkim# ====================================================================
8238384Sjkim#
9238384Sjkim# Version 1.1
10238384Sjkim#
11238384Sjkim# The major reason for undertaken effort was to mitigate the hazard of
12238384Sjkim# cache-timing attack. This is [currently and initially!] addressed in
13238384Sjkim# two ways. 1. S-boxes are compressed from 5KB to 2KB+256B size each.
14238384Sjkim# 2. References to them are scheduled for L2 cache latency, meaning
15238384Sjkim# that the tables don't have to reside in L1 cache. Once again, this
16238384Sjkim# is an initial draft and one should expect more countermeasures to
17238384Sjkim# be implemented...
18238384Sjkim#
19238384Sjkim# Version 1.1 prefetches T[ed]4 in order to mitigate attack on last
20238384Sjkim# round.
21238384Sjkim#
22238384Sjkim# Even though performance was not the primary goal [on the contrary,
23238384Sjkim# extra shifts "induced" by compressed S-box and longer loop epilogue
24238384Sjkim# "induced" by scheduling for L2 have negative effect on performance],
25238384Sjkim# the code turned out to run in ~23 cycles per processed byte en-/
26238384Sjkim# decrypted with 128-bit key. This is pretty good result for code
27238384Sjkim# with mentioned qualities and UltraSPARC core. Compared to Sun C
28238384Sjkim# generated code my encrypt procedure runs just few percents faster,
29238384Sjkim# while decrypt one - whole 50% faster [yes, Sun C failed to generate
30238384Sjkim# optimal decrypt procedure]. Compared to GNU C generated code both
31238384Sjkim# procedures are more than 60% faster:-)
32238384Sjkim
33238384Sjkim$bits=32;
34238384Sjkimfor (@ARGV)	{ $bits=64 if (/\-m64/ || /\-xarch\=v9/); }
35238384Sjkimif ($bits==64)	{ $bias=2047; $frame=192; }
36238384Sjkimelse		{ $bias=0;    $frame=112; }
37238384Sjkim$locals=16;
38238384Sjkim
39238384Sjkim$acc0="%l0";
40238384Sjkim$acc1="%o0";
41238384Sjkim$acc2="%o1";
42238384Sjkim$acc3="%o2";
43238384Sjkim
44238384Sjkim$acc4="%l1";
45238384Sjkim$acc5="%o3";
46238384Sjkim$acc6="%o4";
47238384Sjkim$acc7="%o5";
48238384Sjkim
49238384Sjkim$acc8="%l2";
50238384Sjkim$acc9="%o7";
51238384Sjkim$acc10="%g1";
52238384Sjkim$acc11="%g2";
53238384Sjkim
54238384Sjkim$acc12="%l3";
55238384Sjkim$acc13="%g3";
56238384Sjkim$acc14="%g4";
57238384Sjkim$acc15="%g5";
58238384Sjkim
59238384Sjkim$t0="%l4";
60238384Sjkim$t1="%l5";
61238384Sjkim$t2="%l6";
62238384Sjkim$t3="%l7";
63238384Sjkim
64238384Sjkim$s0="%i0";
65238384Sjkim$s1="%i1";
66238384Sjkim$s2="%i2";
67238384Sjkim$s3="%i3";
68238384Sjkim$tbl="%i4";
69238384Sjkim$key="%i5";
70238384Sjkim$rounds="%i7";	# aliases with return address, which is off-loaded to stack
71238384Sjkim
72238384Sjkimsub _data_word()
73238384Sjkim{ my $i;
74238384Sjkim    while(defined($i=shift)) { $code.=sprintf"\t.long\t0x%08x,0x%08x\n",$i,$i; }
75238384Sjkim}
76238384Sjkim
77238384Sjkim$code.=<<___ if ($bits==64);
78238384Sjkim.register	%g2,#scratch
79238384Sjkim.register	%g3,#scratch
80238384Sjkim___
81238384Sjkim$code.=<<___;
82238384Sjkim.section	".text",#alloc,#execinstr
83238384Sjkim
84238384Sjkim.align	256
85238384SjkimAES_Te:
86238384Sjkim___
87238384Sjkim&_data_word(
88238384Sjkim	0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d,
89238384Sjkim	0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554,
90238384Sjkim	0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d,
91238384Sjkim	0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a,
92238384Sjkim	0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87,
93238384Sjkim	0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b,
94238384Sjkim	0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea,
95238384Sjkim	0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b,
96238384Sjkim	0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a,
97238384Sjkim	0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f,
98238384Sjkim	0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108,
99238384Sjkim	0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f,
100238384Sjkim	0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e,
101238384Sjkim	0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5,
102238384Sjkim	0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d,
103238384Sjkim	0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f,
104238384Sjkim	0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e,
105238384Sjkim	0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb,
106238384Sjkim	0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce,
107238384Sjkim	0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497,
108238384Sjkim	0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c,
109238384Sjkim	0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed,
110238384Sjkim	0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b,
111238384Sjkim	0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a,
112238384Sjkim	0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16,
113238384Sjkim	0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594,
114238384Sjkim	0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81,
115238384Sjkim	0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3,
116238384Sjkim	0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a,
117238384Sjkim	0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504,
118238384Sjkim	0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163,
119238384Sjkim	0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d,
120238384Sjkim	0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f,
121238384Sjkim	0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739,
122238384Sjkim	0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47,
123238384Sjkim	0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395,
124238384Sjkim	0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f,
125238384Sjkim	0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883,
126238384Sjkim	0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c,
127238384Sjkim	0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76,
128238384Sjkim	0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e,
129238384Sjkim	0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4,
130238384Sjkim	0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6,
131238384Sjkim	0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b,
132238384Sjkim	0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7,
133238384Sjkim	0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0,
134238384Sjkim	0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25,
135238384Sjkim	0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818,
136238384Sjkim	0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72,
137238384Sjkim	0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651,
138238384Sjkim	0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21,
139238384Sjkim	0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85,
140238384Sjkim	0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa,
141238384Sjkim	0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12,
142238384Sjkim	0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0,
143238384Sjkim	0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9,
144238384Sjkim	0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133,
145238384Sjkim	0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7,
146238384Sjkim	0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920,
147238384Sjkim	0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a,
148238384Sjkim	0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17,
149238384Sjkim	0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8,
150238384Sjkim	0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11,
151238384Sjkim	0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a);
152238384Sjkim$code.=<<___;
153238384Sjkim	.byte	0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5
154238384Sjkim	.byte	0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76
155238384Sjkim	.byte	0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0
156238384Sjkim	.byte	0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0
157238384Sjkim	.byte	0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc
158238384Sjkim	.byte	0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15
159238384Sjkim	.byte	0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a
160238384Sjkim	.byte	0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75
161238384Sjkim	.byte	0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0
162238384Sjkim	.byte	0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84
163238384Sjkim	.byte	0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b
164238384Sjkim	.byte	0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf
165238384Sjkim	.byte	0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85
166238384Sjkim	.byte	0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8
167238384Sjkim	.byte	0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5
168238384Sjkim	.byte	0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2
169238384Sjkim	.byte	0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17
170238384Sjkim	.byte	0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73
171238384Sjkim	.byte	0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88
172238384Sjkim	.byte	0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb
173238384Sjkim	.byte	0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c
174238384Sjkim	.byte	0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79
175238384Sjkim	.byte	0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9
176238384Sjkim	.byte	0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08
177238384Sjkim	.byte	0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6
178238384Sjkim	.byte	0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a
179238384Sjkim	.byte	0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e
180238384Sjkim	.byte	0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e
181238384Sjkim	.byte	0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94
182238384Sjkim	.byte	0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf
183238384Sjkim	.byte	0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68
184238384Sjkim	.byte	0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
185238384Sjkim.type	AES_Te,#object
186238384Sjkim.size	AES_Te,(.-AES_Te)
187238384Sjkim
188238384Sjkim.align	64
189238384Sjkim.skip	16
190238384Sjkim_sparcv9_AES_encrypt:
191238384Sjkim	save	%sp,-$frame-$locals,%sp
192238384Sjkim	stx	%i7,[%sp+$bias+$frame+0]	! off-load return address
193238384Sjkim	ld	[$key+240],$rounds
194238384Sjkim	ld	[$key+0],$t0
195238384Sjkim	ld	[$key+4],$t1			!
196238384Sjkim	ld	[$key+8],$t2
197238384Sjkim	srl	$rounds,1,$rounds
198238384Sjkim	xor	$t0,$s0,$s0
199238384Sjkim	ld	[$key+12],$t3
200238384Sjkim	srl	$s0,21,$acc0
201238384Sjkim	xor	$t1,$s1,$s1
202238384Sjkim	ld	[$key+16],$t0
203238384Sjkim	srl	$s1,13,$acc1			!
204238384Sjkim	xor	$t2,$s2,$s2
205238384Sjkim	ld	[$key+20],$t1
206238384Sjkim	xor	$t3,$s3,$s3
207238384Sjkim	ld	[$key+24],$t2
208238384Sjkim	and	$acc0,2040,$acc0
209238384Sjkim	ld	[$key+28],$t3
210238384Sjkim	nop
211238384Sjkim.Lenc_loop:
212238384Sjkim	srl	$s2,5,$acc2			!
213238384Sjkim	and	$acc1,2040,$acc1
214238384Sjkim	ldx	[$tbl+$acc0],$acc0
215238384Sjkim	sll	$s3,3,$acc3
216238384Sjkim	and	$acc2,2040,$acc2
217238384Sjkim	ldx	[$tbl+$acc1],$acc1
218238384Sjkim	srl	$s1,21,$acc4
219238384Sjkim	and	$acc3,2040,$acc3
220238384Sjkim	ldx	[$tbl+$acc2],$acc2		!
221238384Sjkim	srl	$s2,13,$acc5
222238384Sjkim	and	$acc4,2040,$acc4
223238384Sjkim	ldx	[$tbl+$acc3],$acc3
224238384Sjkim	srl	$s3,5,$acc6
225238384Sjkim	and	$acc5,2040,$acc5
226238384Sjkim	ldx	[$tbl+$acc4],$acc4
227238384Sjkim	fmovs	%f0,%f0
228238384Sjkim	sll	$s0,3,$acc7			!
229238384Sjkim	and	$acc6,2040,$acc6
230238384Sjkim	ldx	[$tbl+$acc5],$acc5
231238384Sjkim	srl	$s2,21,$acc8
232238384Sjkim	and	$acc7,2040,$acc7
233238384Sjkim	ldx	[$tbl+$acc6],$acc6
234238384Sjkim	srl	$s3,13,$acc9
235238384Sjkim	and	$acc8,2040,$acc8
236238384Sjkim	ldx	[$tbl+$acc7],$acc7		!
237238384Sjkim	srl	$s0,5,$acc10
238238384Sjkim	and	$acc9,2040,$acc9
239238384Sjkim	ldx	[$tbl+$acc8],$acc8
240238384Sjkim	sll	$s1,3,$acc11
241238384Sjkim	and	$acc10,2040,$acc10
242238384Sjkim	ldx	[$tbl+$acc9],$acc9
243238384Sjkim	fmovs	%f0,%f0
244238384Sjkim	srl	$s3,21,$acc12			!
245238384Sjkim	and	$acc11,2040,$acc11
246238384Sjkim	ldx	[$tbl+$acc10],$acc10
247238384Sjkim	srl	$s0,13,$acc13
248238384Sjkim	and	$acc12,2040,$acc12
249238384Sjkim	ldx	[$tbl+$acc11],$acc11
250238384Sjkim	srl	$s1,5,$acc14
251238384Sjkim	and	$acc13,2040,$acc13
252238384Sjkim	ldx	[$tbl+$acc12],$acc12		!
253238384Sjkim	sll	$s2,3,$acc15
254238384Sjkim	and	$acc14,2040,$acc14
255238384Sjkim	ldx	[$tbl+$acc13],$acc13
256238384Sjkim	and	$acc15,2040,$acc15
257238384Sjkim	add	$key,32,$key
258238384Sjkim	ldx	[$tbl+$acc14],$acc14
259238384Sjkim	fmovs	%f0,%f0
260238384Sjkim	subcc	$rounds,1,$rounds		!
261238384Sjkim	ldx	[$tbl+$acc15],$acc15
262238384Sjkim	bz,a,pn	%icc,.Lenc_last
263238384Sjkim	add	$tbl,2048,$rounds
264238384Sjkim
265238384Sjkim		srlx	$acc1,8,$acc1
266238384Sjkim		xor	$acc0,$t0,$t0
267238384Sjkim	ld	[$key+0],$s0
268238384Sjkim	fmovs	%f0,%f0
269238384Sjkim		srlx	$acc2,16,$acc2		!
270238384Sjkim		xor	$acc1,$t0,$t0
271238384Sjkim	ld	[$key+4],$s1
272238384Sjkim		srlx	$acc3,24,$acc3
273238384Sjkim		xor	$acc2,$t0,$t0
274238384Sjkim	ld	[$key+8],$s2
275238384Sjkim		srlx	$acc5,8,$acc5
276238384Sjkim		xor	$acc3,$t0,$t0
277238384Sjkim	ld	[$key+12],$s3			!
278238384Sjkim		srlx	$acc6,16,$acc6
279238384Sjkim		xor	$acc4,$t1,$t1
280238384Sjkim	fmovs	%f0,%f0
281238384Sjkim		srlx	$acc7,24,$acc7
282238384Sjkim		xor	$acc5,$t1,$t1
283238384Sjkim		srlx	$acc9,8,$acc9
284238384Sjkim		xor	$acc6,$t1,$t1
285238384Sjkim		srlx	$acc10,16,$acc10	!
286238384Sjkim		xor	$acc7,$t1,$t1
287238384Sjkim		srlx	$acc11,24,$acc11
288238384Sjkim		xor	$acc8,$t2,$t2
289238384Sjkim		srlx	$acc13,8,$acc13
290238384Sjkim		xor	$acc9,$t2,$t2
291238384Sjkim		srlx	$acc14,16,$acc14
292238384Sjkim		xor	$acc10,$t2,$t2
293238384Sjkim		srlx	$acc15,24,$acc15	!
294238384Sjkim		xor	$acc11,$t2,$t2
295238384Sjkim		xor	$acc12,$acc14,$acc14
296238384Sjkim		xor	$acc13,$t3,$t3
297238384Sjkim	srl	$t0,21,$acc0
298238384Sjkim		xor	$acc14,$t3,$t3
299238384Sjkim	srl	$t1,13,$acc1
300238384Sjkim		xor	$acc15,$t3,$t3
301238384Sjkim
302238384Sjkim	and	$acc0,2040,$acc0		!
303238384Sjkim	srl	$t2,5,$acc2
304238384Sjkim	and	$acc1,2040,$acc1
305238384Sjkim	ldx	[$tbl+$acc0],$acc0
306238384Sjkim	sll	$t3,3,$acc3
307238384Sjkim	and	$acc2,2040,$acc2
308238384Sjkim	ldx	[$tbl+$acc1],$acc1
309238384Sjkim	fmovs	%f0,%f0
310238384Sjkim	srl	$t1,21,$acc4			!
311238384Sjkim	and	$acc3,2040,$acc3
312238384Sjkim	ldx	[$tbl+$acc2],$acc2
313238384Sjkim	srl	$t2,13,$acc5
314238384Sjkim	and	$acc4,2040,$acc4
315238384Sjkim	ldx	[$tbl+$acc3],$acc3
316238384Sjkim	srl	$t3,5,$acc6
317238384Sjkim	and	$acc5,2040,$acc5
318238384Sjkim	ldx	[$tbl+$acc4],$acc4		!
319238384Sjkim	sll	$t0,3,$acc7
320238384Sjkim	and	$acc6,2040,$acc6
321238384Sjkim	ldx	[$tbl+$acc5],$acc5
322238384Sjkim	srl	$t2,21,$acc8
323238384Sjkim	and	$acc7,2040,$acc7
324238384Sjkim	ldx	[$tbl+$acc6],$acc6
325238384Sjkim	fmovs	%f0,%f0
326238384Sjkim	srl	$t3,13,$acc9			!
327238384Sjkim	and	$acc8,2040,$acc8
328238384Sjkim	ldx	[$tbl+$acc7],$acc7
329238384Sjkim	srl	$t0,5,$acc10
330238384Sjkim	and	$acc9,2040,$acc9
331238384Sjkim	ldx	[$tbl+$acc8],$acc8
332238384Sjkim	sll	$t1,3,$acc11
333238384Sjkim	and	$acc10,2040,$acc10
334238384Sjkim	ldx	[$tbl+$acc9],$acc9		!
335238384Sjkim	srl	$t3,21,$acc12
336238384Sjkim	and	$acc11,2040,$acc11
337238384Sjkim	ldx	[$tbl+$acc10],$acc10
338238384Sjkim	srl	$t0,13,$acc13
339238384Sjkim	and	$acc12,2040,$acc12
340238384Sjkim	ldx	[$tbl+$acc11],$acc11
341238384Sjkim	fmovs	%f0,%f0
342238384Sjkim	srl	$t1,5,$acc14			!
343238384Sjkim	and	$acc13,2040,$acc13
344238384Sjkim	ldx	[$tbl+$acc12],$acc12
345238384Sjkim	sll	$t2,3,$acc15
346238384Sjkim	and	$acc14,2040,$acc14
347238384Sjkim	ldx	[$tbl+$acc13],$acc13
348238384Sjkim		srlx	$acc1,8,$acc1
349238384Sjkim	and	$acc15,2040,$acc15
350238384Sjkim	ldx	[$tbl+$acc14],$acc14		!
351238384Sjkim
352238384Sjkim		srlx	$acc2,16,$acc2
353238384Sjkim		xor	$acc0,$s0,$s0
354238384Sjkim	ldx	[$tbl+$acc15],$acc15
355238384Sjkim		srlx	$acc3,24,$acc3
356238384Sjkim		xor	$acc1,$s0,$s0
357238384Sjkim	ld	[$key+16],$t0
358238384Sjkim	fmovs	%f0,%f0
359238384Sjkim		srlx	$acc5,8,$acc5		!
360238384Sjkim		xor	$acc2,$s0,$s0
361238384Sjkim	ld	[$key+20],$t1
362238384Sjkim		srlx	$acc6,16,$acc6
363238384Sjkim		xor	$acc3,$s0,$s0
364238384Sjkim	ld	[$key+24],$t2
365238384Sjkim		srlx	$acc7,24,$acc7
366238384Sjkim		xor	$acc4,$s1,$s1
367238384Sjkim	ld	[$key+28],$t3			!
368238384Sjkim		srlx	$acc9,8,$acc9
369238384Sjkim		xor	$acc5,$s1,$s1
370238384Sjkim	ldx	[$tbl+2048+0],%g0		! prefetch te4
371238384Sjkim		srlx	$acc10,16,$acc10
372238384Sjkim		xor	$acc6,$s1,$s1
373238384Sjkim	ldx	[$tbl+2048+32],%g0		! prefetch te4
374238384Sjkim		srlx	$acc11,24,$acc11
375238384Sjkim		xor	$acc7,$s1,$s1
376238384Sjkim	ldx	[$tbl+2048+64],%g0		! prefetch te4
377238384Sjkim		srlx	$acc13,8,$acc13
378238384Sjkim		xor	$acc8,$s2,$s2
379238384Sjkim	ldx	[$tbl+2048+96],%g0		! prefetch te4
380238384Sjkim		srlx	$acc14,16,$acc14	!
381238384Sjkim		xor	$acc9,$s2,$s2
382238384Sjkim	ldx	[$tbl+2048+128],%g0		! prefetch te4
383238384Sjkim		srlx	$acc15,24,$acc15
384238384Sjkim		xor	$acc10,$s2,$s2
385238384Sjkim	ldx	[$tbl+2048+160],%g0		! prefetch te4
386238384Sjkim	srl	$s0,21,$acc0
387238384Sjkim		xor	$acc11,$s2,$s2
388238384Sjkim	ldx	[$tbl+2048+192],%g0		! prefetch te4
389238384Sjkim		xor	$acc12,$acc14,$acc14
390238384Sjkim		xor	$acc13,$s3,$s3
391238384Sjkim	ldx	[$tbl+2048+224],%g0		! prefetch te4
392238384Sjkim	srl	$s1,13,$acc1			!
393238384Sjkim		xor	$acc14,$s3,$s3
394238384Sjkim		xor	$acc15,$s3,$s3
395238384Sjkim	ba	.Lenc_loop
396238384Sjkim	and	$acc0,2040,$acc0
397238384Sjkim
398238384Sjkim.align	32
399238384Sjkim.Lenc_last:
400238384Sjkim		srlx	$acc1,8,$acc1		!
401238384Sjkim		xor	$acc0,$t0,$t0
402238384Sjkim	ld	[$key+0],$s0
403238384Sjkim		srlx	$acc2,16,$acc2
404238384Sjkim		xor	$acc1,$t0,$t0
405238384Sjkim	ld	[$key+4],$s1
406238384Sjkim		srlx	$acc3,24,$acc3
407238384Sjkim		xor	$acc2,$t0,$t0
408238384Sjkim	ld	[$key+8],$s2			!
409238384Sjkim		srlx	$acc5,8,$acc5
410238384Sjkim		xor	$acc3,$t0,$t0
411238384Sjkim	ld	[$key+12],$s3
412238384Sjkim		srlx	$acc6,16,$acc6
413238384Sjkim		xor	$acc4,$t1,$t1
414238384Sjkim		srlx	$acc7,24,$acc7
415238384Sjkim		xor	$acc5,$t1,$t1
416238384Sjkim		srlx	$acc9,8,$acc9		!
417238384Sjkim		xor	$acc6,$t1,$t1
418238384Sjkim		srlx	$acc10,16,$acc10
419238384Sjkim		xor	$acc7,$t1,$t1
420238384Sjkim		srlx	$acc11,24,$acc11
421238384Sjkim		xor	$acc8,$t2,$t2
422238384Sjkim		srlx	$acc13,8,$acc13
423238384Sjkim		xor	$acc9,$t2,$t2
424238384Sjkim		srlx	$acc14,16,$acc14	!
425238384Sjkim		xor	$acc10,$t2,$t2
426238384Sjkim		srlx	$acc15,24,$acc15
427238384Sjkim		xor	$acc11,$t2,$t2
428238384Sjkim		xor	$acc12,$acc14,$acc14
429238384Sjkim		xor	$acc13,$t3,$t3
430238384Sjkim	srl	$t0,24,$acc0
431238384Sjkim		xor	$acc14,$t3,$t3
432238384Sjkim	srl	$t1,16,$acc1			!
433238384Sjkim		xor	$acc15,$t3,$t3
434238384Sjkim
435238384Sjkim	srl	$t2,8,$acc2
436238384Sjkim	and	$acc1,255,$acc1
437238384Sjkim	ldub	[$rounds+$acc0],$acc0
438238384Sjkim	srl	$t1,24,$acc4
439238384Sjkim	and	$acc2,255,$acc2
440238384Sjkim	ldub	[$rounds+$acc1],$acc1
441238384Sjkim	srl	$t2,16,$acc5			!
442238384Sjkim	and	$t3,255,$acc3
443238384Sjkim	ldub	[$rounds+$acc2],$acc2
444238384Sjkim	ldub	[$rounds+$acc3],$acc3
445238384Sjkim	srl	$t3,8,$acc6
446238384Sjkim	and	$acc5,255,$acc5
447238384Sjkim	ldub	[$rounds+$acc4],$acc4
448238384Sjkim	fmovs	%f0,%f0
449238384Sjkim	srl	$t2,24,$acc8			!
450238384Sjkim	and	$acc6,255,$acc6
451238384Sjkim	ldub	[$rounds+$acc5],$acc5
452238384Sjkim	srl	$t3,16,$acc9
453238384Sjkim	and	$t0,255,$acc7
454238384Sjkim	ldub	[$rounds+$acc6],$acc6
455238384Sjkim	ldub	[$rounds+$acc7],$acc7
456238384Sjkim	fmovs	%f0,%f0
457238384Sjkim	srl	$t0,8,$acc10			!
458238384Sjkim	and	$acc9,255,$acc9
459238384Sjkim	ldub	[$rounds+$acc8],$acc8
460238384Sjkim	srl	$t3,24,$acc12
461238384Sjkim	and	$acc10,255,$acc10
462238384Sjkim	ldub	[$rounds+$acc9],$acc9
463238384Sjkim	srl	$t0,16,$acc13
464238384Sjkim	and	$t1,255,$acc11
465238384Sjkim	ldub	[$rounds+$acc10],$acc10		!
466238384Sjkim	srl	$t1,8,$acc14
467238384Sjkim	and	$acc13,255,$acc13
468238384Sjkim	ldub	[$rounds+$acc11],$acc11
469238384Sjkim	ldub	[$rounds+$acc12],$acc12
470238384Sjkim	and	$acc14,255,$acc14
471238384Sjkim	ldub	[$rounds+$acc13],$acc13
472238384Sjkim	and	$t2,255,$acc15
473238384Sjkim	ldub	[$rounds+$acc14],$acc14		!
474238384Sjkim
475238384Sjkim		sll	$acc0,24,$acc0
476238384Sjkim		xor	$acc3,$s0,$s0
477238384Sjkim	ldub	[$rounds+$acc15],$acc15
478238384Sjkim		sll	$acc1,16,$acc1
479238384Sjkim		xor	$acc0,$s0,$s0
480238384Sjkim	ldx	[%sp+$bias+$frame+0],%i7	! restore return address
481238384Sjkim	fmovs	%f0,%f0
482238384Sjkim		sll	$acc2,8,$acc2		!
483238384Sjkim		xor	$acc1,$s0,$s0
484238384Sjkim		sll	$acc4,24,$acc4
485238384Sjkim		xor	$acc2,$s0,$s0
486238384Sjkim		sll	$acc5,16,$acc5
487238384Sjkim		xor	$acc7,$s1,$s1
488238384Sjkim		sll	$acc6,8,$acc6
489238384Sjkim		xor	$acc4,$s1,$s1
490238384Sjkim		sll	$acc8,24,$acc8		!
491238384Sjkim		xor	$acc5,$s1,$s1
492238384Sjkim		sll	$acc9,16,$acc9
493238384Sjkim		xor	$acc11,$s2,$s2
494238384Sjkim		sll	$acc10,8,$acc10
495238384Sjkim		xor	$acc6,$s1,$s1
496238384Sjkim		sll	$acc12,24,$acc12
497238384Sjkim		xor	$acc8,$s2,$s2
498238384Sjkim		sll	$acc13,16,$acc13	!
499238384Sjkim		xor	$acc9,$s2,$s2
500238384Sjkim		sll	$acc14,8,$acc14
501238384Sjkim		xor	$acc10,$s2,$s2
502238384Sjkim		xor	$acc12,$acc14,$acc14
503238384Sjkim		xor	$acc13,$s3,$s3
504238384Sjkim		xor	$acc14,$s3,$s3
505238384Sjkim		xor	$acc15,$s3,$s3
506238384Sjkim
507238384Sjkim	ret
508238384Sjkim	restore
509238384Sjkim.type	_sparcv9_AES_encrypt,#function
510238384Sjkim.size	_sparcv9_AES_encrypt,(.-_sparcv9_AES_encrypt)
511238384Sjkim
512238384Sjkim.align	32
513238384Sjkim.globl	AES_encrypt
514238384SjkimAES_encrypt:
515238384Sjkim	or	%o0,%o1,%g1
516238384Sjkim	andcc	%g1,3,%g0
517238384Sjkim	bnz,pn	%xcc,.Lunaligned_enc
518238384Sjkim	save	%sp,-$frame,%sp
519238384Sjkim
520238384Sjkim	ld	[%i0+0],%o0
521238384Sjkim	ld	[%i0+4],%o1
522238384Sjkim	ld	[%i0+8],%o2
523238384Sjkim	ld	[%i0+12],%o3
524238384Sjkim
525238384Sjkim1:	call	.+8
526238384Sjkim	add	%o7,AES_Te-1b,%o4
527238384Sjkim	call	_sparcv9_AES_encrypt
528238384Sjkim	mov	%i2,%o5
529238384Sjkim
530238384Sjkim	st	%o0,[%i1+0]
531238384Sjkim	st	%o1,[%i1+4]
532238384Sjkim	st	%o2,[%i1+8]
533238384Sjkim	st	%o3,[%i1+12]
534238384Sjkim
535238384Sjkim	ret
536238384Sjkim	restore
537238384Sjkim
538238384Sjkim.align	32
539238384Sjkim.Lunaligned_enc:
540238384Sjkim	ldub	[%i0+0],%l0
541238384Sjkim	ldub	[%i0+1],%l1
542238384Sjkim	ldub	[%i0+2],%l2
543238384Sjkim
544238384Sjkim	sll	%l0,24,%l0
545238384Sjkim	ldub	[%i0+3],%l3
546238384Sjkim	sll	%l1,16,%l1
547238384Sjkim	ldub	[%i0+4],%l4
548238384Sjkim	sll	%l2,8,%l2
549238384Sjkim	or	%l1,%l0,%l0
550238384Sjkim	ldub	[%i0+5],%l5
551238384Sjkim	sll	%l4,24,%l4
552238384Sjkim	or	%l3,%l2,%l2
553238384Sjkim	ldub	[%i0+6],%l6
554238384Sjkim	sll	%l5,16,%l5
555238384Sjkim	or	%l0,%l2,%o0
556238384Sjkim	ldub	[%i0+7],%l7
557238384Sjkim
558238384Sjkim	sll	%l6,8,%l6
559238384Sjkim	or	%l5,%l4,%l4
560238384Sjkim	ldub	[%i0+8],%l0
561238384Sjkim	or	%l7,%l6,%l6
562238384Sjkim	ldub	[%i0+9],%l1
563238384Sjkim	or	%l4,%l6,%o1
564238384Sjkim	ldub	[%i0+10],%l2
565238384Sjkim
566238384Sjkim	sll	%l0,24,%l0
567238384Sjkim	ldub	[%i0+11],%l3
568238384Sjkim	sll	%l1,16,%l1
569238384Sjkim	ldub	[%i0+12],%l4
570238384Sjkim	sll	%l2,8,%l2
571238384Sjkim	or	%l1,%l0,%l0
572238384Sjkim	ldub	[%i0+13],%l5
573238384Sjkim	sll	%l4,24,%l4
574238384Sjkim	or	%l3,%l2,%l2
575238384Sjkim	ldub	[%i0+14],%l6
576238384Sjkim	sll	%l5,16,%l5
577238384Sjkim	or	%l0,%l2,%o2
578238384Sjkim	ldub	[%i0+15],%l7
579238384Sjkim
580238384Sjkim	sll	%l6,8,%l6
581238384Sjkim	or	%l5,%l4,%l4
582238384Sjkim	or	%l7,%l6,%l6
583238384Sjkim	or	%l4,%l6,%o3
584238384Sjkim
585238384Sjkim1:	call	.+8
586238384Sjkim	add	%o7,AES_Te-1b,%o4
587238384Sjkim	call	_sparcv9_AES_encrypt
588238384Sjkim	mov	%i2,%o5
589238384Sjkim
590238384Sjkim	srl	%o0,24,%l0
591238384Sjkim	srl	%o0,16,%l1
592238384Sjkim	stb	%l0,[%i1+0]
593238384Sjkim	srl	%o0,8,%l2
594238384Sjkim	stb	%l1,[%i1+1]
595238384Sjkim	stb	%l2,[%i1+2]
596238384Sjkim	srl	%o1,24,%l4
597238384Sjkim	stb	%o0,[%i1+3]
598238384Sjkim
599238384Sjkim	srl	%o1,16,%l5
600238384Sjkim	stb	%l4,[%i1+4]
601238384Sjkim	srl	%o1,8,%l6
602238384Sjkim	stb	%l5,[%i1+5]
603238384Sjkim	stb	%l6,[%i1+6]
604238384Sjkim	srl	%o2,24,%l0
605238384Sjkim	stb	%o1,[%i1+7]
606238384Sjkim
607238384Sjkim	srl	%o2,16,%l1
608238384Sjkim	stb	%l0,[%i1+8]
609238384Sjkim	srl	%o2,8,%l2
610238384Sjkim	stb	%l1,[%i1+9]
611238384Sjkim	stb	%l2,[%i1+10]
612238384Sjkim	srl	%o3,24,%l4
613238384Sjkim	stb	%o2,[%i1+11]
614238384Sjkim
615238384Sjkim	srl	%o3,16,%l5
616238384Sjkim	stb	%l4,[%i1+12]
617238384Sjkim	srl	%o3,8,%l6
618238384Sjkim	stb	%l5,[%i1+13]
619238384Sjkim	stb	%l6,[%i1+14]
620238384Sjkim	stb	%o3,[%i1+15]
621238384Sjkim
622238384Sjkim	ret
623238384Sjkim	restore
624238384Sjkim.type	AES_encrypt,#function
625238384Sjkim.size	AES_encrypt,(.-AES_encrypt)
626238384Sjkim
627238384Sjkim___
628238384Sjkim
629238384Sjkim$code.=<<___;
630238384Sjkim.align	256
631238384SjkimAES_Td:
632238384Sjkim___
633238384Sjkim&_data_word(
634238384Sjkim	0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96,
635238384Sjkim	0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393,
636238384Sjkim	0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25,
637238384Sjkim	0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f,
638238384Sjkim	0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1,
639238384Sjkim	0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6,
640238384Sjkim	0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da,
641238384Sjkim	0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844,
642238384Sjkim	0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd,
643238384Sjkim	0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4,
644238384Sjkim	0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45,
645238384Sjkim	0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94,
646238384Sjkim	0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7,
647238384Sjkim	0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a,
648238384Sjkim	0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5,
649238384Sjkim	0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c,
650238384Sjkim	0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1,
651238384Sjkim	0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a,
652238384Sjkim	0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75,
653238384Sjkim	0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051,
654238384Sjkim	0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46,
655238384Sjkim	0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff,
656238384Sjkim	0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77,
657238384Sjkim	0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb,
658238384Sjkim	0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000,
659238384Sjkim	0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e,
660238384Sjkim	0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927,
661238384Sjkim	0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a,
662238384Sjkim	0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e,
663238384Sjkim	0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16,
664238384Sjkim	0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d,
665238384Sjkim	0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8,
666238384Sjkim	0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd,
667238384Sjkim	0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34,
668238384Sjkim	0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163,
669238384Sjkim	0xd731dcca, 0x42638510, 0x13972240, 0x84c61120,
670238384Sjkim	0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d,
671238384Sjkim	0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0,
672238384Sjkim	0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422,
673238384Sjkim	0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef,
674238384Sjkim	0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36,
675238384Sjkim	0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4,
676238384Sjkim	0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662,
677238384Sjkim	0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5,
678238384Sjkim	0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3,
679238384Sjkim	0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b,
680238384Sjkim	0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8,
681238384Sjkim	0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6,
682238384Sjkim	0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6,
683238384Sjkim	0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0,
684238384Sjkim	0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815,
685238384Sjkim	0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f,
686238384Sjkim	0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df,
687238384Sjkim	0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f,
688238384Sjkim	0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e,
689238384Sjkim	0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713,
690238384Sjkim	0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89,
691238384Sjkim	0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c,
692238384Sjkim	0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf,
693238384Sjkim	0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86,
694238384Sjkim	0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f,
695238384Sjkim	0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541,
696238384Sjkim	0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190,
697238384Sjkim	0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742);
698238384Sjkim$code.=<<___;
699238384Sjkim	.byte	0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38
700238384Sjkim	.byte	0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb
701238384Sjkim	.byte	0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87
702238384Sjkim	.byte	0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb
703238384Sjkim	.byte	0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d
704238384Sjkim	.byte	0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e
705238384Sjkim	.byte	0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2
706238384Sjkim	.byte	0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25
707238384Sjkim	.byte	0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16
708238384Sjkim	.byte	0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92
709238384Sjkim	.byte	0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda
710238384Sjkim	.byte	0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84
711238384Sjkim	.byte	0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a
712238384Sjkim	.byte	0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06
713238384Sjkim	.byte	0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02
714238384Sjkim	.byte	0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b
715238384Sjkim	.byte	0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea
716238384Sjkim	.byte	0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73
717238384Sjkim	.byte	0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85
718238384Sjkim	.byte	0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e
719238384Sjkim	.byte	0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89
720238384Sjkim	.byte	0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b
721238384Sjkim	.byte	0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20
722238384Sjkim	.byte	0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4
723238384Sjkim	.byte	0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31
724238384Sjkim	.byte	0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f
725238384Sjkim	.byte	0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d
726238384Sjkim	.byte	0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef
727238384Sjkim	.byte	0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0
728238384Sjkim	.byte	0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61
729238384Sjkim	.byte	0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26
730238384Sjkim	.byte	0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d
731238384Sjkim.type	AES_Td,#object
732238384Sjkim.size	AES_Td,(.-AES_Td)
733238384Sjkim
734238384Sjkim.align	64
735238384Sjkim.skip	16
736238384Sjkim_sparcv9_AES_decrypt:
737238384Sjkim	save	%sp,-$frame-$locals,%sp
738238384Sjkim	stx	%i7,[%sp+$bias+$frame+0]	! off-load return address
739238384Sjkim	ld	[$key+240],$rounds
740238384Sjkim	ld	[$key+0],$t0
741238384Sjkim	ld	[$key+4],$t1			!
742238384Sjkim	ld	[$key+8],$t2
743238384Sjkim	ld	[$key+12],$t3
744238384Sjkim	srl	$rounds,1,$rounds
745238384Sjkim	xor	$t0,$s0,$s0
746238384Sjkim	ld	[$key+16],$t0
747238384Sjkim	xor	$t1,$s1,$s1
748238384Sjkim	ld	[$key+20],$t1
749238384Sjkim	srl	$s0,21,$acc0			!
750238384Sjkim	xor	$t2,$s2,$s2
751238384Sjkim	ld	[$key+24],$t2
752238384Sjkim	xor	$t3,$s3,$s3
753238384Sjkim	and	$acc0,2040,$acc0
754238384Sjkim	ld	[$key+28],$t3
755238384Sjkim	srl	$s3,13,$acc1
756238384Sjkim	nop
757238384Sjkim.Ldec_loop:
758238384Sjkim	srl	$s2,5,$acc2			!
759238384Sjkim	and	$acc1,2040,$acc1
760238384Sjkim	ldx	[$tbl+$acc0],$acc0
761238384Sjkim	sll	$s1,3,$acc3
762238384Sjkim	and	$acc2,2040,$acc2
763238384Sjkim	ldx	[$tbl+$acc1],$acc1
764238384Sjkim	srl	$s1,21,$acc4
765238384Sjkim	and	$acc3,2040,$acc3
766238384Sjkim	ldx	[$tbl+$acc2],$acc2		!
767238384Sjkim	srl	$s0,13,$acc5
768238384Sjkim	and	$acc4,2040,$acc4
769238384Sjkim	ldx	[$tbl+$acc3],$acc3
770238384Sjkim	srl	$s3,5,$acc6
771238384Sjkim	and	$acc5,2040,$acc5
772238384Sjkim	ldx	[$tbl+$acc4],$acc4
773238384Sjkim	fmovs	%f0,%f0
774238384Sjkim	sll	$s2,3,$acc7			!
775238384Sjkim	and	$acc6,2040,$acc6
776238384Sjkim	ldx	[$tbl+$acc5],$acc5
777238384Sjkim	srl	$s2,21,$acc8
778238384Sjkim	and	$acc7,2040,$acc7
779238384Sjkim	ldx	[$tbl+$acc6],$acc6
780238384Sjkim	srl	$s1,13,$acc9
781238384Sjkim	and	$acc8,2040,$acc8
782238384Sjkim	ldx	[$tbl+$acc7],$acc7		!
783238384Sjkim	srl	$s0,5,$acc10
784238384Sjkim	and	$acc9,2040,$acc9
785238384Sjkim	ldx	[$tbl+$acc8],$acc8
786238384Sjkim	sll	$s3,3,$acc11
787238384Sjkim	and	$acc10,2040,$acc10
788238384Sjkim	ldx	[$tbl+$acc9],$acc9
789238384Sjkim	fmovs	%f0,%f0
790238384Sjkim	srl	$s3,21,$acc12			!
791238384Sjkim	and	$acc11,2040,$acc11
792238384Sjkim	ldx	[$tbl+$acc10],$acc10
793238384Sjkim	srl	$s2,13,$acc13
794238384Sjkim	and	$acc12,2040,$acc12
795238384Sjkim	ldx	[$tbl+$acc11],$acc11
796238384Sjkim	srl	$s1,5,$acc14
797238384Sjkim	and	$acc13,2040,$acc13
798238384Sjkim	ldx	[$tbl+$acc12],$acc12		!
799238384Sjkim	sll	$s0,3,$acc15
800238384Sjkim	and	$acc14,2040,$acc14
801238384Sjkim	ldx	[$tbl+$acc13],$acc13
802238384Sjkim	and	$acc15,2040,$acc15
803238384Sjkim	add	$key,32,$key
804238384Sjkim	ldx	[$tbl+$acc14],$acc14
805238384Sjkim	fmovs	%f0,%f0
806238384Sjkim	subcc	$rounds,1,$rounds		!
807238384Sjkim	ldx	[$tbl+$acc15],$acc15
808238384Sjkim	bz,a,pn	%icc,.Ldec_last
809238384Sjkim	add	$tbl,2048,$rounds
810238384Sjkim
811238384Sjkim		srlx	$acc1,8,$acc1
812238384Sjkim		xor	$acc0,$t0,$t0
813238384Sjkim	ld	[$key+0],$s0
814238384Sjkim	fmovs	%f0,%f0
815238384Sjkim		srlx	$acc2,16,$acc2		!
816238384Sjkim		xor	$acc1,$t0,$t0
817238384Sjkim	ld	[$key+4],$s1
818238384Sjkim		srlx	$acc3,24,$acc3
819238384Sjkim		xor	$acc2,$t0,$t0
820238384Sjkim	ld	[$key+8],$s2
821238384Sjkim		srlx	$acc5,8,$acc5
822238384Sjkim		xor	$acc3,$t0,$t0
823238384Sjkim	ld	[$key+12],$s3			!
824238384Sjkim		srlx	$acc6,16,$acc6
825238384Sjkim		xor	$acc4,$t1,$t1
826238384Sjkim	fmovs	%f0,%f0
827238384Sjkim		srlx	$acc7,24,$acc7
828238384Sjkim		xor	$acc5,$t1,$t1
829238384Sjkim		srlx	$acc9,8,$acc9
830238384Sjkim		xor	$acc6,$t1,$t1
831238384Sjkim		srlx	$acc10,16,$acc10	!
832238384Sjkim		xor	$acc7,$t1,$t1
833238384Sjkim		srlx	$acc11,24,$acc11
834238384Sjkim		xor	$acc8,$t2,$t2
835238384Sjkim		srlx	$acc13,8,$acc13
836238384Sjkim		xor	$acc9,$t2,$t2
837238384Sjkim		srlx	$acc14,16,$acc14
838238384Sjkim		xor	$acc10,$t2,$t2
839238384Sjkim		srlx	$acc15,24,$acc15	!
840238384Sjkim		xor	$acc11,$t2,$t2
841238384Sjkim		xor	$acc12,$acc14,$acc14
842238384Sjkim		xor	$acc13,$t3,$t3
843238384Sjkim	srl	$t0,21,$acc0
844238384Sjkim		xor	$acc14,$t3,$t3
845238384Sjkim		xor	$acc15,$t3,$t3
846238384Sjkim	srl	$t3,13,$acc1
847238384Sjkim
848238384Sjkim	and	$acc0,2040,$acc0		!
849238384Sjkim	srl	$t2,5,$acc2
850238384Sjkim	and	$acc1,2040,$acc1
851238384Sjkim	ldx	[$tbl+$acc0],$acc0
852238384Sjkim	sll	$t1,3,$acc3
853238384Sjkim	and	$acc2,2040,$acc2
854238384Sjkim	ldx	[$tbl+$acc1],$acc1
855238384Sjkim	fmovs	%f0,%f0
856238384Sjkim	srl	$t1,21,$acc4			!
857238384Sjkim	and	$acc3,2040,$acc3
858238384Sjkim	ldx	[$tbl+$acc2],$acc2
859238384Sjkim	srl	$t0,13,$acc5
860238384Sjkim	and	$acc4,2040,$acc4
861238384Sjkim	ldx	[$tbl+$acc3],$acc3
862238384Sjkim	srl	$t3,5,$acc6
863238384Sjkim	and	$acc5,2040,$acc5
864238384Sjkim	ldx	[$tbl+$acc4],$acc4		!
865238384Sjkim	sll	$t2,3,$acc7
866238384Sjkim	and	$acc6,2040,$acc6
867238384Sjkim	ldx	[$tbl+$acc5],$acc5
868238384Sjkim	srl	$t2,21,$acc8
869238384Sjkim	and	$acc7,2040,$acc7
870238384Sjkim	ldx	[$tbl+$acc6],$acc6
871238384Sjkim	fmovs	%f0,%f0
872238384Sjkim	srl	$t1,13,$acc9			!
873238384Sjkim	and	$acc8,2040,$acc8
874238384Sjkim	ldx	[$tbl+$acc7],$acc7
875238384Sjkim	srl	$t0,5,$acc10
876238384Sjkim	and	$acc9,2040,$acc9
877238384Sjkim	ldx	[$tbl+$acc8],$acc8
878238384Sjkim	sll	$t3,3,$acc11
879238384Sjkim	and	$acc10,2040,$acc10
880238384Sjkim	ldx	[$tbl+$acc9],$acc9		!
881238384Sjkim	srl	$t3,21,$acc12
882238384Sjkim	and	$acc11,2040,$acc11
883238384Sjkim	ldx	[$tbl+$acc10],$acc10
884238384Sjkim	srl	$t2,13,$acc13
885238384Sjkim	and	$acc12,2040,$acc12
886238384Sjkim	ldx	[$tbl+$acc11],$acc11
887238384Sjkim	fmovs	%f0,%f0
888238384Sjkim	srl	$t1,5,$acc14			!
889238384Sjkim	and	$acc13,2040,$acc13
890238384Sjkim	ldx	[$tbl+$acc12],$acc12
891238384Sjkim	sll	$t0,3,$acc15
892238384Sjkim	and	$acc14,2040,$acc14
893238384Sjkim	ldx	[$tbl+$acc13],$acc13
894238384Sjkim		srlx	$acc1,8,$acc1
895238384Sjkim	and	$acc15,2040,$acc15
896238384Sjkim	ldx	[$tbl+$acc14],$acc14		!
897238384Sjkim
898238384Sjkim		srlx	$acc2,16,$acc2
899238384Sjkim		xor	$acc0,$s0,$s0
900238384Sjkim	ldx	[$tbl+$acc15],$acc15
901238384Sjkim		srlx	$acc3,24,$acc3
902238384Sjkim		xor	$acc1,$s0,$s0
903238384Sjkim	ld	[$key+16],$t0
904238384Sjkim	fmovs	%f0,%f0
905238384Sjkim		srlx	$acc5,8,$acc5		!
906238384Sjkim		xor	$acc2,$s0,$s0
907238384Sjkim	ld	[$key+20],$t1
908238384Sjkim		srlx	$acc6,16,$acc6
909238384Sjkim		xor	$acc3,$s0,$s0
910238384Sjkim	ld	[$key+24],$t2
911238384Sjkim		srlx	$acc7,24,$acc7
912238384Sjkim		xor	$acc4,$s1,$s1
913238384Sjkim	ld	[$key+28],$t3			!
914238384Sjkim		srlx	$acc9,8,$acc9
915238384Sjkim		xor	$acc5,$s1,$s1
916238384Sjkim	ldx	[$tbl+2048+0],%g0		! prefetch td4
917238384Sjkim		srlx	$acc10,16,$acc10
918238384Sjkim		xor	$acc6,$s1,$s1
919238384Sjkim	ldx	[$tbl+2048+32],%g0		! prefetch td4
920238384Sjkim		srlx	$acc11,24,$acc11
921238384Sjkim		xor	$acc7,$s1,$s1
922238384Sjkim	ldx	[$tbl+2048+64],%g0		! prefetch td4
923238384Sjkim		srlx	$acc13,8,$acc13
924238384Sjkim		xor	$acc8,$s2,$s2
925238384Sjkim	ldx	[$tbl+2048+96],%g0		! prefetch td4
926238384Sjkim		srlx	$acc14,16,$acc14	!
927238384Sjkim		xor	$acc9,$s2,$s2
928238384Sjkim	ldx	[$tbl+2048+128],%g0		! prefetch td4
929238384Sjkim		srlx	$acc15,24,$acc15
930238384Sjkim		xor	$acc10,$s2,$s2
931238384Sjkim	ldx	[$tbl+2048+160],%g0		! prefetch td4
932238384Sjkim	srl	$s0,21,$acc0
933238384Sjkim		xor	$acc11,$s2,$s2
934238384Sjkim	ldx	[$tbl+2048+192],%g0		! prefetch td4
935238384Sjkim		xor	$acc12,$acc14,$acc14
936238384Sjkim		xor	$acc13,$s3,$s3
937238384Sjkim	ldx	[$tbl+2048+224],%g0		! prefetch td4
938238384Sjkim	and	$acc0,2040,$acc0		!
939238384Sjkim		xor	$acc14,$s3,$s3
940238384Sjkim		xor	$acc15,$s3,$s3
941238384Sjkim	ba	.Ldec_loop
942238384Sjkim	srl	$s3,13,$acc1
943238384Sjkim
944238384Sjkim.align	32
945238384Sjkim.Ldec_last:
946238384Sjkim		srlx	$acc1,8,$acc1		!
947238384Sjkim		xor	$acc0,$t0,$t0
948238384Sjkim	ld	[$key+0],$s0
949238384Sjkim		srlx	$acc2,16,$acc2
950238384Sjkim		xor	$acc1,$t0,$t0
951238384Sjkim	ld	[$key+4],$s1
952238384Sjkim		srlx	$acc3,24,$acc3
953238384Sjkim		xor	$acc2,$t0,$t0
954238384Sjkim	ld	[$key+8],$s2			!
955238384Sjkim		srlx	$acc5,8,$acc5
956238384Sjkim		xor	$acc3,$t0,$t0
957238384Sjkim	ld	[$key+12],$s3
958238384Sjkim		srlx	$acc6,16,$acc6
959238384Sjkim		xor	$acc4,$t1,$t1
960238384Sjkim		srlx	$acc7,24,$acc7
961238384Sjkim		xor	$acc5,$t1,$t1
962238384Sjkim		srlx	$acc9,8,$acc9		!
963238384Sjkim		xor	$acc6,$t1,$t1
964238384Sjkim		srlx	$acc10,16,$acc10
965238384Sjkim		xor	$acc7,$t1,$t1
966238384Sjkim		srlx	$acc11,24,$acc11
967238384Sjkim		xor	$acc8,$t2,$t2
968238384Sjkim		srlx	$acc13,8,$acc13
969238384Sjkim		xor	$acc9,$t2,$t2
970238384Sjkim		srlx	$acc14,16,$acc14	!
971238384Sjkim		xor	$acc10,$t2,$t2
972238384Sjkim		srlx	$acc15,24,$acc15
973238384Sjkim		xor	$acc11,$t2,$t2
974238384Sjkim		xor	$acc12,$acc14,$acc14
975238384Sjkim		xor	$acc13,$t3,$t3
976238384Sjkim	srl	$t0,24,$acc0
977238384Sjkim		xor	$acc14,$t3,$t3
978238384Sjkim		xor	$acc15,$t3,$t3		!
979238384Sjkim	srl	$t3,16,$acc1
980238384Sjkim
981238384Sjkim	srl	$t2,8,$acc2
982238384Sjkim	and	$acc1,255,$acc1
983238384Sjkim	ldub	[$rounds+$acc0],$acc0
984238384Sjkim	srl	$t1,24,$acc4
985238384Sjkim	and	$acc2,255,$acc2
986238384Sjkim	ldub	[$rounds+$acc1],$acc1
987238384Sjkim	srl	$t0,16,$acc5			!
988238384Sjkim	and	$t1,255,$acc3
989238384Sjkim	ldub	[$rounds+$acc2],$acc2
990238384Sjkim	ldub	[$rounds+$acc3],$acc3
991238384Sjkim	srl	$t3,8,$acc6
992238384Sjkim	and	$acc5,255,$acc5
993238384Sjkim	ldub	[$rounds+$acc4],$acc4
994238384Sjkim	fmovs	%f0,%f0
995238384Sjkim	srl	$t2,24,$acc8			!
996238384Sjkim	and	$acc6,255,$acc6
997238384Sjkim	ldub	[$rounds+$acc5],$acc5
998238384Sjkim	srl	$t1,16,$acc9
999238384Sjkim	and	$t2,255,$acc7
1000238384Sjkim	ldub	[$rounds+$acc6],$acc6
1001238384Sjkim	ldub	[$rounds+$acc7],$acc7
1002238384Sjkim	fmovs	%f0,%f0
1003238384Sjkim	srl	$t0,8,$acc10			!
1004238384Sjkim	and	$acc9,255,$acc9
1005238384Sjkim	ldub	[$rounds+$acc8],$acc8
1006238384Sjkim	srl	$t3,24,$acc12
1007238384Sjkim	and	$acc10,255,$acc10
1008238384Sjkim	ldub	[$rounds+$acc9],$acc9
1009238384Sjkim	srl	$t2,16,$acc13
1010238384Sjkim	and	$t3,255,$acc11
1011238384Sjkim	ldub	[$rounds+$acc10],$acc10		!
1012238384Sjkim	srl	$t1,8,$acc14
1013238384Sjkim	and	$acc13,255,$acc13
1014238384Sjkim	ldub	[$rounds+$acc11],$acc11
1015238384Sjkim	ldub	[$rounds+$acc12],$acc12
1016238384Sjkim	and	$acc14,255,$acc14
1017238384Sjkim	ldub	[$rounds+$acc13],$acc13
1018238384Sjkim	and	$t0,255,$acc15
1019238384Sjkim	ldub	[$rounds+$acc14],$acc14		!
1020238384Sjkim
1021238384Sjkim		sll	$acc0,24,$acc0
1022238384Sjkim		xor	$acc3,$s0,$s0
1023238384Sjkim	ldub	[$rounds+$acc15],$acc15
1024238384Sjkim		sll	$acc1,16,$acc1
1025238384Sjkim		xor	$acc0,$s0,$s0
1026238384Sjkim	ldx	[%sp+$bias+$frame+0],%i7	! restore return address
1027238384Sjkim	fmovs	%f0,%f0
1028238384Sjkim		sll	$acc2,8,$acc2		!
1029238384Sjkim		xor	$acc1,$s0,$s0
1030238384Sjkim		sll	$acc4,24,$acc4
1031238384Sjkim		xor	$acc2,$s0,$s0
1032238384Sjkim		sll	$acc5,16,$acc5
1033238384Sjkim		xor	$acc7,$s1,$s1
1034238384Sjkim		sll	$acc6,8,$acc6
1035238384Sjkim		xor	$acc4,$s1,$s1
1036238384Sjkim		sll	$acc8,24,$acc8		!
1037238384Sjkim		xor	$acc5,$s1,$s1
1038238384Sjkim		sll	$acc9,16,$acc9
1039238384Sjkim		xor	$acc11,$s2,$s2
1040238384Sjkim		sll	$acc10,8,$acc10
1041238384Sjkim		xor	$acc6,$s1,$s1
1042238384Sjkim		sll	$acc12,24,$acc12
1043238384Sjkim		xor	$acc8,$s2,$s2
1044238384Sjkim		sll	$acc13,16,$acc13	!
1045238384Sjkim		xor	$acc9,$s2,$s2
1046238384Sjkim		sll	$acc14,8,$acc14
1047238384Sjkim		xor	$acc10,$s2,$s2
1048238384Sjkim		xor	$acc12,$acc14,$acc14
1049238384Sjkim		xor	$acc13,$s3,$s3
1050238384Sjkim		xor	$acc14,$s3,$s3
1051238384Sjkim		xor	$acc15,$s3,$s3
1052238384Sjkim
1053238384Sjkim	ret
1054238384Sjkim	restore
1055238384Sjkim.type	_sparcv9_AES_decrypt,#function
1056238384Sjkim.size	_sparcv9_AES_decrypt,(.-_sparcv9_AES_decrypt)
1057238384Sjkim
1058238384Sjkim.align	32
1059238384Sjkim.globl	AES_decrypt
1060238384SjkimAES_decrypt:
1061238384Sjkim	or	%o0,%o1,%g1
1062238384Sjkim	andcc	%g1,3,%g0
1063238384Sjkim	bnz,pn	%xcc,.Lunaligned_dec
1064238384Sjkim	save	%sp,-$frame,%sp
1065238384Sjkim
1066238384Sjkim	ld	[%i0+0],%o0
1067238384Sjkim	ld	[%i0+4],%o1
1068238384Sjkim	ld	[%i0+8],%o2
1069238384Sjkim	ld	[%i0+12],%o3
1070238384Sjkim
1071238384Sjkim1:	call	.+8
1072238384Sjkim	add	%o7,AES_Td-1b,%o4
1073238384Sjkim	call	_sparcv9_AES_decrypt
1074238384Sjkim	mov	%i2,%o5
1075238384Sjkim
1076238384Sjkim	st	%o0,[%i1+0]
1077238384Sjkim	st	%o1,[%i1+4]
1078238384Sjkim	st	%o2,[%i1+8]
1079238384Sjkim	st	%o3,[%i1+12]
1080238384Sjkim
1081238384Sjkim	ret
1082238384Sjkim	restore
1083238384Sjkim
1084238384Sjkim.align	32
1085238384Sjkim.Lunaligned_dec:
1086238384Sjkim	ldub	[%i0+0],%l0
1087238384Sjkim	ldub	[%i0+1],%l1
1088238384Sjkim	ldub	[%i0+2],%l2
1089238384Sjkim
1090238384Sjkim	sll	%l0,24,%l0
1091238384Sjkim	ldub	[%i0+3],%l3
1092238384Sjkim	sll	%l1,16,%l1
1093238384Sjkim	ldub	[%i0+4],%l4
1094238384Sjkim	sll	%l2,8,%l2
1095238384Sjkim	or	%l1,%l0,%l0
1096238384Sjkim	ldub	[%i0+5],%l5
1097238384Sjkim	sll	%l4,24,%l4
1098238384Sjkim	or	%l3,%l2,%l2
1099238384Sjkim	ldub	[%i0+6],%l6
1100238384Sjkim	sll	%l5,16,%l5
1101238384Sjkim	or	%l0,%l2,%o0
1102238384Sjkim	ldub	[%i0+7],%l7
1103238384Sjkim
1104238384Sjkim	sll	%l6,8,%l6
1105238384Sjkim	or	%l5,%l4,%l4
1106238384Sjkim	ldub	[%i0+8],%l0
1107238384Sjkim	or	%l7,%l6,%l6
1108238384Sjkim	ldub	[%i0+9],%l1
1109238384Sjkim	or	%l4,%l6,%o1
1110238384Sjkim	ldub	[%i0+10],%l2
1111238384Sjkim
1112238384Sjkim	sll	%l0,24,%l0
1113238384Sjkim	ldub	[%i0+11],%l3
1114238384Sjkim	sll	%l1,16,%l1
1115238384Sjkim	ldub	[%i0+12],%l4
1116238384Sjkim	sll	%l2,8,%l2
1117238384Sjkim	or	%l1,%l0,%l0
1118238384Sjkim	ldub	[%i0+13],%l5
1119238384Sjkim	sll	%l4,24,%l4
1120238384Sjkim	or	%l3,%l2,%l2
1121238384Sjkim	ldub	[%i0+14],%l6
1122238384Sjkim	sll	%l5,16,%l5
1123238384Sjkim	or	%l0,%l2,%o2
1124238384Sjkim	ldub	[%i0+15],%l7
1125238384Sjkim
1126238384Sjkim	sll	%l6,8,%l6
1127238384Sjkim	or	%l5,%l4,%l4
1128238384Sjkim	or	%l7,%l6,%l6
1129238384Sjkim	or	%l4,%l6,%o3
1130238384Sjkim
1131238384Sjkim1:	call	.+8
1132238384Sjkim	add	%o7,AES_Td-1b,%o4
1133238384Sjkim	call	_sparcv9_AES_decrypt
1134238384Sjkim	mov	%i2,%o5
1135238384Sjkim
1136238384Sjkim	srl	%o0,24,%l0
1137238384Sjkim	srl	%o0,16,%l1
1138238384Sjkim	stb	%l0,[%i1+0]
1139238384Sjkim	srl	%o0,8,%l2
1140238384Sjkim	stb	%l1,[%i1+1]
1141238384Sjkim	stb	%l2,[%i1+2]
1142238384Sjkim	srl	%o1,24,%l4
1143238384Sjkim	stb	%o0,[%i1+3]
1144238384Sjkim
1145238384Sjkim	srl	%o1,16,%l5
1146238384Sjkim	stb	%l4,[%i1+4]
1147238384Sjkim	srl	%o1,8,%l6
1148238384Sjkim	stb	%l5,[%i1+5]
1149238384Sjkim	stb	%l6,[%i1+6]
1150238384Sjkim	srl	%o2,24,%l0
1151238384Sjkim	stb	%o1,[%i1+7]
1152238384Sjkim
1153238384Sjkim	srl	%o2,16,%l1
1154238384Sjkim	stb	%l0,[%i1+8]
1155238384Sjkim	srl	%o2,8,%l2
1156238384Sjkim	stb	%l1,[%i1+9]
1157238384Sjkim	stb	%l2,[%i1+10]
1158238384Sjkim	srl	%o3,24,%l4
1159238384Sjkim	stb	%o2,[%i1+11]
1160238384Sjkim
1161238384Sjkim	srl	%o3,16,%l5
1162238384Sjkim	stb	%l4,[%i1+12]
1163238384Sjkim	srl	%o3,8,%l6
1164238384Sjkim	stb	%l5,[%i1+13]
1165238384Sjkim	stb	%l6,[%i1+14]
1166238384Sjkim	stb	%o3,[%i1+15]
1167238384Sjkim
1168238384Sjkim	ret
1169238384Sjkim	restore
1170238384Sjkim.type	AES_decrypt,#function
1171238384Sjkim.size	AES_decrypt,(.-AES_decrypt)
1172238384Sjkim___
1173238384Sjkim
1174238384Sjkim# fmovs instructions substituting for FP nops were originally added
1175238384Sjkim# to meet specific instruction alignment requirements to maximize ILP.
1176238384Sjkim# As UltraSPARC T1, a.k.a. Niagara, has shared FPU, FP nops can have
1177238384Sjkim# undesired effect, so just omit them and sacrifice some portion of
1178238384Sjkim# percent in performance...
1179238384Sjkim$code =~ s/fmovs.*$//gm;
1180238384Sjkim
1181238384Sjkimprint $code;
1182238384Sjkimclose STDOUT;	# ensure flush
1183