xref: /netbsd-src/external/lgpl3/gmp/dist/mpn/s390_64/logops_n.asm (revision eceb233b9bd0dfebb902ed73b531ae6964fa3f9b)
1dnl  S/390-64 logops.
2
3dnl  Copyright 2011 Free Software Foundation, Inc.
4
5dnl  This file is part of the GNU MP Library.
6dnl
7dnl  The GNU MP Library is free software; you can redistribute it and/or modify
8dnl  it under the terms of either:
9dnl
10dnl    * the GNU Lesser General Public License as published by the Free
11dnl      Software Foundation; either version 3 of the License, or (at your
12dnl      option) any later version.
13dnl
14dnl  or
15dnl
16dnl    * the GNU General Public License as published by the Free Software
17dnl      Foundation; either version 2 of the License, or (at your option) any
18dnl      later version.
19dnl
20dnl  or both in parallel, as here.
21dnl
22dnl  The GNU MP Library is distributed in the hope that it will be useful, but
23dnl  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
24dnl  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
25dnl  for more details.
26dnl
27dnl  You should have received copies of the GNU General Public License and the
28dnl  GNU Lesser General Public License along with the GNU MP Library.  If not,
29dnl  see https://www.gnu.org/licenses/.
30
31include(`../config.m4')
32
33C cycles/limb     variant 1           variant 2       variant 3
34C	        rp!=up  rp=up
35C z900		 4.5	 2.25		 5.5		 5.5
36C z990		 2.75	 2		 3.25		 3.25
37C z9		 ?			 ?		 ?
38C z10		 3.25			 3.75		 3.75
39C z196		 ?			 ?		 ?
40
41C INPUT PARAMETERS
42define(`rp',	`%r2')
43define(`up',	`%r3')
44define(`vp',	`%r4')
45define(`n',	`%r5')
46
47ifdef(`OPERATION_and_n',`
48  define(`func',`mpn_and_n')
49  define(`VARIANT_1')
50  define(`LOGOPC',`nc')
51  define(`LOGOP',`ng')')
52ifdef(`OPERATION_andn_n',`
53  define(`func',`mpn_andn_n')
54  define(`VARIANT_2')
55  define(`LOGOP',`ng')')
56ifdef(`OPERATION_nand_n',`
57  define(`func',`mpn_nand_n')
58  define(`VARIANT_3')
59  define(`LOGOP',`ng')')
60ifdef(`OPERATION_ior_n',`
61  define(`func',`mpn_ior_n')
62  define(`VARIANT_1')
63  define(`LOGOPC',`oc')
64  define(`LOGOP',`og')')
65ifdef(`OPERATION_iorn_n',`
66  define(`func',`mpn_iorn_n')
67  define(`VARIANT_2')
68  define(`LOGOP',`og')')
69ifdef(`OPERATION_nior_n',`
70  define(`func',`mpn_nior_n')
71  define(`VARIANT_3')
72  define(`LOGOP',`og')')
73ifdef(`OPERATION_xor_n',`
74  define(`func',`mpn_xor_n')
75  define(`VARIANT_1')
76  define(`LOGOPC',`xc')
77  define(`LOGOP',`xg')')
78ifdef(`OPERATION_xnor_n',`
79  define(`func',`mpn_xnor_n')
80  define(`VARIANT_2')
81  define(`LOGOP',`xg')')
82
83MULFUNC_PROLOGUE(mpn_and_n mpn_andn_n mpn_nand_n mpn_ior_n mpn_iorn_n mpn_nior_n mpn_xor_n mpn_xnor_n)
84
85ASM_START()
86PROLOGUE(func)
87ifdef(`VARIANT_1',`
88	cgr	rp, up
89	jne	L(normal)
90
91	sllg	n, n, 3
92	aghi	n, -1
93	srlg	%r1, n, 8
94	ltgr	%r1, %r1		C < 256 bytes to copy?
95	je	L(1)
96
97L(tp):	LOGOPC	0(256, rp), 0(vp)
98	la	rp, 256(rp)
99	la	vp, 256(vp)
100	brctg	%r1, L(tp)
101
102L(1):	bras	%r1, L(2)		C make r1 point to mvc insn
103	LOGOPC	0(1, rp), 0(vp)
104L(2):	ex	n, 0(%r1)		C execute mvc with length ((n-1) mod 256)+1
105L(rtn):	br	%r14
106
107
108L(normal):
109	stmg	%r6, %r8, 48(%r15)
110	aghi	n, 3
111	lghi	%r7, 3
112	srlg	%r0, n, 2
113	ngr	%r7, n			C n mod 4
114	je	L(b1)
115	cghi	%r7, 2
116	jl	L(b2)
117	jne	L(top)
118
119L(b3):	lmg	%r5, %r7, 0(up)
120	la	up, 24(up)
121	LOGOP	%r5, 0(vp)
122	LOGOP	%r6, 8(vp)
123	LOGOP	%r7, 16(vp)
124	stmg	%r5, %r7, 0(rp)
125	la	rp, 24(rp)
126	la	vp, 24(vp)
127	j	L(mid)
128
129L(b1):	lg	%r5, 0(up)
130	la	up, 8(up)
131	LOGOP	%r5, 0(vp)
132	stg	%r5, 0(rp)
133	la	rp, 8(rp)
134	la	vp, 8(vp)
135	j	L(mid)
136
137L(b2):	lmg	%r5, %r6, 0(up)
138	la	up, 16(up)
139	LOGOP	%r5, 0(vp)
140	LOGOP	%r6, 8(vp)
141	stmg	%r5, %r6, 0(rp)
142	la	rp, 16(rp)
143	la	vp, 16(vp)
144	j	L(mid)
145
146L(top):	lmg	%r5, %r8, 0(up)
147	la	up, 32(up)
148	LOGOP	%r5, 0(vp)
149	LOGOP	%r6, 8(vp)
150	LOGOP	%r7, 16(vp)
151	LOGOP	%r8, 24(vp)
152	stmg	%r5, %r8, 0(rp)
153	la	rp, 32(rp)
154	la	vp, 32(vp)
155L(mid):	brctg	%r0, L(top)
156
157	lmg	%r6, %r8, 48(%r15)
158	br	%r14
159')
160
161ifdef(`VARIANT_2',`
162	stmg	%r6, %r8, 48(%r15)
163	lghi	%r1, -1
164
165	aghi	n, 3
166	lghi	%r7, 3
167	srlg	%r0, n, 2
168	ngr	%r7, n			C n mod 4
169	je	L(b1)
170	cghi	%r7, 2
171	jl	L(b2)
172	jne	L(top)
173
174L(b3):	lmg	%r5, %r7, 0(vp)
175	la	vp, 24(vp)
176	xgr	%r5, %r1
177	xgr	%r6, %r1
178	xgr	%r7, %r1
179	LOGOP	%r5, 0(up)
180	LOGOP	%r6, 8(up)
181	LOGOP	%r7, 16(up)
182	stmg	%r5, %r7, 0(rp)
183	la	rp, 24(rp)
184	la	up, 24(up)
185	j	L(mid)
186
187L(b1):	lg	%r5, 0(vp)
188	la	vp, 8(vp)
189	xgr	%r5, %r1
190	LOGOP	%r5, 0(up)
191	stg	%r5, 0(rp)
192	la	rp, 8(rp)
193	la	up, 8(up)
194	j	L(mid)
195
196L(b2):	lmg	%r5, %r6, 0(vp)
197	la	vp, 16(vp)
198	xgr	%r5, %r1
199	xgr	%r6, %r1
200	LOGOP	%r5, 0(up)
201	LOGOP	%r6, 8(up)
202	stmg	%r5, %r6, 0(rp)
203	la	rp, 16(rp)
204	la	up, 16(up)
205	j	L(mid)
206
207L(top):	lmg	%r5, %r8, 0(vp)
208	la	vp, 32(vp)
209	xgr	%r5, %r1
210	xgr	%r6, %r1
211	xgr	%r7, %r1
212	xgr	%r8, %r1
213	LOGOP	%r5, 0(up)
214	LOGOP	%r6, 8(up)
215	LOGOP	%r7, 16(up)
216	LOGOP	%r8, 24(up)
217	la	up, 32(up)
218	stmg	%r5, %r8, 0(rp)
219	la	rp, 32(rp)
220L(mid):	brctg	%r0, L(top)
221
222	lmg	%r6, %r8, 48(%r15)
223	br	%r14
224')
225
226ifdef(`VARIANT_3',`
227	stmg	%r6, %r8, 48(%r15)
228	lghi	%r1, -1
229
230	aghi	n, 3
231	lghi	%r7, 3
232	srlg	%r0, n, 2
233	ngr	%r7, n			C n mod 4
234	je	L(b1)
235	cghi	%r7, 2
236	jl	L(b2)
237	jne	L(top)
238
239L(b3):	lmg	%r5, %r7, 0(vp)
240	la	vp, 24(vp)
241	LOGOP	%r5, 0(up)
242	LOGOP	%r6, 8(up)
243	xgr	%r5, %r1
244	xgr	%r6, %r1
245	LOGOP	%r7, 16(up)
246	xgr	%r7, %r1
247	stmg	%r5, %r7, 0(rp)
248	la	rp, 24(rp)
249	la	up, 24(up)
250	j	L(mid)
251
252L(b1):	lg	%r5, 0(vp)
253	la	vp, 8(vp)
254	LOGOP	%r5, 0(up)
255	xgr	%r5, %r1
256	stg	%r5, 0(rp)
257	la	rp, 8(rp)
258	la	up, 8(up)
259	j	L(mid)
260
261L(b2):	lmg	%r5, %r6, 0(vp)
262	la	vp, 16(vp)
263	LOGOP	%r5, 0(up)
264	LOGOP	%r6, 8(up)
265	xgr	%r5, %r1
266	xgr	%r6, %r1
267	stmg	%r5, %r6, 0(rp)
268	la	rp, 16(rp)
269	la	up, 16(up)
270	j	L(mid)
271
272L(top):	lmg	%r5, %r8, 0(vp)
273	la	vp, 32(vp)
274	LOGOP	%r5, 0(up)
275	LOGOP	%r6, 8(up)
276	xgr	%r5, %r1
277	xgr	%r6, %r1
278	LOGOP	%r7, 16(up)
279	LOGOP	%r8, 24(up)
280	xgr	%r7, %r1
281	xgr	%r8, %r1
282	stmg	%r5, %r8, 0(rp)
283	la	up, 32(up)
284	la	rp, 32(rp)
285L(mid):	brctg	%r0, L(top)
286
287	lmg	%r6, %r8, 48(%r15)
288	br	%r14
289')
290
291EPILOGUE()
292