1221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#!/usr/bin/env perl
2221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
3221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# ====================================================================
4221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# 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/.
8221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# ====================================================================
9221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
10221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# SHA1 block procedure for s390x.
11221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
12221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# April 2007.
13221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#
14221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# Performance is >30% better than gcc 3.3 generated code. But the real
15221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# twist is that SHA1 hardware support is detected and utilized. In
16221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# which case performance can reach further >4.5x for larger chunks.
17221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
18221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# January 2009.
19221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#
20221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# Optimize Xupdate for amount of memory references and reschedule
21221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# instructions to favour dual-issue z10 pipeline. On z10 hardware is
22221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# "only" ~2.3x faster than software.
23221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
24221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$kimdfunc=1;	# magic function code for kimd instruction
25221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
26221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$output=shift;
27221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromopen STDOUT,">$output";
28221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
29221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$K_00_39="%r0"; $K=$K_00_39;
30221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$K_40_79="%r1";
31221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$ctx="%r2";	$prefetch="%r2";
32221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$inp="%r3";
33221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$len="%r4";
34221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
35221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$A="%r5";
36221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$B="%r6";
37221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$C="%r7";
38221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$D="%r8";
39221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$E="%r9";	@V=($A,$B,$C,$D,$E);
40221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$t0="%r10";
41221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$t1="%r11";
42221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom@X=("%r12","%r13","%r14");
43221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$sp="%r15";
44221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
45221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$frame=160+16*4;
46221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
47221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromsub Xupdate {
48221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrommy $i=shift;
49221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
50221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___ if ($i==15);
51221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lg	$prefetch,160($sp)	### Xupdate(16) warm-up
52221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lr	$X[0],$X[2]
53221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___
54221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromreturn if ($i&1);	# Xupdate is vectorized and executed every 2nd cycle
55221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___ if ($i<16);
56221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lg	$X[0],`$i*4`($inp)	### Xload($i)
57221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	rllg	$X[1],$X[0],32
58221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___
59221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___ if ($i>=16);
60221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xgr	$X[0],$prefetch		### Xupdate($i)
61221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lg	$prefetch,`160+4*(($i+2)%16)`($sp)
62221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xg	$X[0],`160+4*(($i+8)%16)`($sp)
63221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xgr	$X[0],$prefetch
64221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	rll	$X[0],$X[0],1
65221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	rllg	$X[1],$X[0],32
66221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	rll	$X[1],$X[1],1
67221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	rllg	$X[0],$X[1],32
68221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lr	$X[2],$X[1]		# feedback
69221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___
70221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___ if ($i<=70);
71221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	$X[0],`160+4*($i%16)`($sp)
72221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___
73221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromunshift(@X,pop(@X));
74221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom}
75221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
76221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromsub BODY_00_19 {
77221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrommy ($i,$a,$b,$c,$d,$e)=@_;
78221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrommy $xi=$X[1];
79221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
80221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&Xupdate($i);
81221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___;
82221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	alr	$e,$K		### $i
83221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	rll	$t1,$a,5
84221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lr	$t0,$d
85221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xr	$t0,$c
86221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	alr	$e,$t1
87221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	nr	$t0,$b
88221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	alr	$e,$xi
89221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xr	$t0,$d
90221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	rll	$b,$b,30
91221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	alr	$e,$t0
92221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___
93221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom}
94221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
95221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromsub BODY_20_39 {
96221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrommy ($i,$a,$b,$c,$d,$e)=@_;
97221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrommy $xi=$X[1];
98221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
99221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&Xupdate($i);
100221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___;
101221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	alr	$e,$K		### $i
102221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	rll	$t1,$a,5
103221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lr	$t0,$b
104221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	alr	$e,$t1
105221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xr	$t0,$c
106221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	alr	$e,$xi
107221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	xr	$t0,$d
108221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	rll	$b,$b,30
109221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	alr	$e,$t0
110221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___
111221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom}
112221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
113221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromsub BODY_40_59 {
114221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrommy ($i,$a,$b,$c,$d,$e)=@_;
115221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrommy $xi=$X[1];
116221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
117221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	&Xupdate($i);
118221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___;
119221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	alr	$e,$K		### $i
120221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	rll	$t1,$a,5
121221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lr	$t0,$b
122221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	alr	$e,$t1
123221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	or	$t0,$c
124221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lr	$t1,$b
125221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	nr	$t0,$d
126221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	nr	$t1,$c
127221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	alr	$e,$xi
128221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	or	$t0,$t1
129221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	rll	$b,$b,30
130221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	alr	$e,$t0
131221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___
132221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom}
133221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
134221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___;
135221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.text
136221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align	64
137221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.type	Ktable,\@object
138221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromKtable: .long	0x5a827999,0x6ed9eba1,0x8f1bbcdc,0xca62c1d6
139221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	.skip	48	#.long	0,0,0,0,0,0,0,0,0,0,0,0
140221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.size	Ktable,.-Ktable
141221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.globl	sha1_block_data_order
142221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.type	sha1_block_data_order,\@function
143221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromsha1_block_data_order:
144221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___
145221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___ if ($kimdfunc);
146221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	larl	%r1,OPENSSL_s390xcap_P
147221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lg	%r0,0(%r1)
148221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	tmhl	%r0,0x4000	# check for message-security assist
149221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	jz	.Lsoftware
150221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	%r0,0
151221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	la	%r1,16($sp)
152221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	.long	0xb93e0002	# kimd %r0,%r2
153221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lg	%r0,16($sp)
154221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	tmhh	%r0,`0x8000>>$kimdfunc`
155221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	jz	.Lsoftware
156221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	%r0,$kimdfunc
157221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lgr	%r1,$ctx
158221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lgr	%r2,$inp
159221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sllg	%r3,$len,6
160221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	.long	0xb93e0002	# kimd %r0,%r2
161221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	brc	1,.-4		# pay attention to "partial completion"
162221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	br	%r14
163221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align	16
164221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lsoftware:
165221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___
166221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___;
167221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	%r1,-$frame
168221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	$ctx,16($sp)
169221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stmg	%r6,%r15,48($sp)
170221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lgr	%r0,$sp
171221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	la	$sp,0(%r1,$sp)
172221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	%r0,0($sp)
173221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
174221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	larl	$t0,Ktable
175221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	llgf	$A,0($ctx)
176221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	llgf	$B,4($ctx)
177221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	llgf	$C,8($ctx)
178221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	llgf	$D,12($ctx)
179221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	llgf	$E,16($ctx)
180221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
181221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lg	$K_00_39,0($t0)
182221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lg	$K_40_79,8($t0)
183221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
184221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lloop:
185221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	rllg	$K_00_39,$K_00_39,32
186221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___
187221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromfor ($i=0;$i<20;$i++)	{ &BODY_00_19($i,@V); unshift(@V,pop(@V)); }
188221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___;
189221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	rllg	$K_00_39,$K_00_39,32
190221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___
191221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromfor (;$i<40;$i++)	{ &BODY_20_39($i,@V); unshift(@V,pop(@V)); }
192221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___;	$K=$K_40_79;
193221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	rllg	$K_40_79,$K_40_79,32
194221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___
195221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromfor (;$i<60;$i++)	{ &BODY_40_59($i,@V); unshift(@V,pop(@V)); }
196221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___;
197221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	rllg	$K_40_79,$K_40_79,32
198221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___
199221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromfor (;$i<80;$i++)	{ &BODY_20_39($i,@V); unshift(@V,pop(@V)); }
200221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___;
201221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
202221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lg	$ctx,`$frame+16`($sp)
203221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	la	$inp,64($inp)
204221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	al	$A,0($ctx)
205221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	al	$B,4($ctx)
206221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	al	$C,8($ctx)
207221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	al	$D,12($ctx)
208221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	al	$E,16($ctx)
209221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	st	$A,0($ctx)
210221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	st	$B,4($ctx)
211221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	st	$C,8($ctx)
212221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	st	$D,12($ctx)
213221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	st	$E,16($ctx)
214221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	brct	$len,.Lloop
215221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
216221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lmg	%r6,%r15,`$frame+48`($sp)
217221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	br	%r14
218221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.size	sha1_block_data_order,.-sha1_block_data_order
219221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.string	"SHA1 block transform for s390x, CRYPTOGAMS by <appro\@openssl.org>"
220221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.comm	OPENSSL_s390xcap_P,8,8
221221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___
222221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
223221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code =~ s/\`([^\`]*)\`/eval $1/gem;
224221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
225221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromprint $code;
226221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromclose STDOUT;
227