1 #include "s390x_arch.h"
2 
3 .text
4 
5 .globl	gcm_gmult_4bit
6 .align	32
7 gcm_gmult_4bit:
8 	stmg	%r6,%r14,6*8(%r15)
9 
10 	aghi	%r2,-1
11 	lghi	%r5,1
12 	lghi	%r13,120
13 	larl	%r14,rem_4bit
14 
15 	lg	%r1,8+1(%r2)		# Xi
16 	j	.Lgmult_shortcut
17 .type	gcm_gmult_4bit,@function
18 .size	gcm_gmult_4bit,(.-gcm_gmult_4bit)
19 
20 .globl	gcm_ghash_4bit
21 .align	32
22 gcm_ghash_4bit:
23 	larl	%r1,OPENSSL_s390xcap_P
24 	lg	%r0,S390X_KIMD+8(%r1)	# load second word of kimd capabilities
25 					#  vector
26 	tmhh	%r0,0x4000	# check for function 65
27 	jz	.Lsoft_ghash
28 	lghi	%r0,S390X_GHASH	# function 65
29 	la	%r1,0(%r2)	# H lies right after Xi in gcm128_context
30 	.long	0xb93e0004	# kimd %r0,%r4
31 	brc	1,.-4		# pay attention to "partial completion"
32 	br	%r14
33 .align	32
34 .Lsoft_ghash:
35 	stmg	%r6,%r14,6*8(%r15)
36 
37 	aghi	%r2,-1
38 	srlg	%r5,%r5,4
39 	lghi	%r13,120
40 	larl	%r14,rem_4bit
41 
42 	lg	%r1,8+1(%r2)		# Xi
43 	lg	%r0,0+1(%r2)
44 	lghi	%r12,0
45 .Louter:
46 	xg	%r0,0(%r4)		# Xi ^= inp
47 	xg	%r1,8(%r4)
48 	xgr	%r0,%r12
49 	stg	%r1,8+1(%r2)
50 	stg	%r0,0+1(%r2)
51 
52 .Lgmult_shortcut:
53 	lghi	%r12,0xf0
54 	sllg	%r8,%r1,4
55 	srlg	%r10,%r1,8		# extract second byte
56 	ngr	%r8,%r12
57 	lgr	%r9,%r1
58 	lghi	%r11,14
59 	ngr	%r9,%r12
60 
61 	lg	%r1,8(%r8,%r3)
62 	lg	%r0,0(%r8,%r3)
63 
64 	sllg	%r8,%r10,4
65 	sllg	%r6,%r1,3
66 	ngr	%r8,%r12
67 	ngr	%r6,%r13
68 	ngr	%r10,%r12
69 
70 	sllg	%r12,%r0,60
71 	srlg	%r1,%r1,4
72 	srlg	%r0,%r0,4
73 	xg	%r1,8(%r9,%r3)
74 	xg	%r0,0(%r9,%r3)
75 	lgr	%r9,%r10
76 	sllg	%r7,%r1,3
77 	xgr	%r1,%r12
78 	ngr	%r7,%r13
79 	sllg	%r12,%r0,60
80 	j	.Lghash_inner
81 .align	16
82 .Lghash_inner:
83 	srlg	%r1,%r1,4
84 	srlg	%r0,%r0,4
85 	xg	%r1,8(%r8,%r3)
86 	llgc	%r10,0(%r11,%r2)
87 	xg	%r0,0(%r8,%r3)
88 	sllg	%r8,%r10,4
89 	xg	%r0,0(%r6,%r14)
90 	nill	%r8,0xf0
91 	sllg	%r6,%r1,3
92 	xgr	%r1,%r12
93 	ngr	%r6,%r13
94 	nill	%r10,0xf0
95 
96 	sllg	%r12,%r0,60
97 	srlg	%r1,%r1,4
98 	srlg	%r0,%r0,4
99 	xg	%r1,8(%r9,%r3)
100 	xg	%r0,0(%r9,%r3)
101 	lgr	%r9,%r10
102 	xg	%r0,0(%r7,%r14)
103 	sllg	%r7,%r1,3
104 	xgr	%r1,%r12
105 	ngr	%r7,%r13
106 	sllg	%r12,%r0,60
107 	brct	%r11,.Lghash_inner
108 
109 	srlg	%r1,%r1,4
110 	srlg	%r0,%r0,4
111 	xg	%r1,8(%r8,%r3)
112 	xg	%r0,0(%r8,%r3)
113 	sllg	%r10,%r1,3
114 	xg	%r0,0(%r6,%r14)
115 	xgr	%r1,%r12
116 	ngr	%r10,%r13
117 
118 	sllg	%r12,%r0,60
119 	srlg	%r1,%r1,4
120 	srlg	%r0,%r0,4
121 	xg	%r1,8(%r9,%r3)
122 	xg	%r0,0(%r9,%r3)
123 	xgr	%r1,%r12
124 	xg	%r0,0(%r7,%r14)
125 
126 	lg	%r12,0(%r10,%r14)
127 	la	%r4,16(%r4)
128 	sllg	%r12,%r12,4		# correct last rem_4bit[rem]
129 	brctg	%r5,.Louter
130 
131 	xgr	%r0,%r12
132 	stg	%r1,8+1(%r2)
133 	stg	%r0,0+1(%r2)
134 	lmg	%r6,%r14,6*8(%r15)
135 	br	%r14
136 .type	gcm_ghash_4bit,@function
137 .size	gcm_ghash_4bit,(.-gcm_ghash_4bit)
138 
139 .align	64
140 rem_4bit:
141 	.long	0,0,29491200,0,58982400,0,38141952,0
142 	.long	117964800,0,113901568,0,76283904,0,88997888,0
143 	.long	235929600,0,265420800,0,227803136,0,206962688,0
144 	.long	152567808,0,148504576,0,177995776,0,190709760,0
145 .type	rem_4bit,@object
146 .size	rem_4bit,(.-rem_4bit)
147 .string	"GHASH for s390x, CRYPTOGAMS by <appro@openssl.org>"
148