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