beta-0.89.2
[luatex.git] / source / libs / gmp / gmp-src / mpn / s390_64 / logops_n.asm
blob914cfb6a41503e709bfd82b70ba86508b783451d
1 dnl S/390-64 logops.
3 dnl Copyright 2011 Free Software Foundation, Inc.
5 dnl This file is part of the GNU MP Library.
6 dnl
7 dnl The GNU MP Library is free software; you can redistribute it and/or modify
8 dnl it under the terms of either:
9 dnl
10 dnl * the GNU Lesser General Public License as published by the Free
11 dnl Software Foundation; either version 3 of the License, or (at your
12 dnl option) any later version.
13 dnl
14 dnl or
15 dnl
16 dnl * the GNU General Public License as published by the Free Software
17 dnl Foundation; either version 2 of the License, or (at your option) any
18 dnl later version.
19 dnl
20 dnl or both in parallel, as here.
21 dnl
22 dnl The GNU MP Library is distributed in the hope that it will be useful, but
23 dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
24 dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
25 dnl for more details.
26 dnl
27 dnl You should have received copies of the GNU General Public License and the
28 dnl GNU Lesser General Public License along with the GNU MP Library. If not,
29 dnl see https://www.gnu.org/licenses/.
31 include(`../config.m4')
33 C cycles/limb variant 1 variant 2 variant 3
34 C rp!=up rp=up
35 C z900 4.5 2.25 5.5 5.5
36 C z990 2.75 2 3.25 3.25
37 C z9 ? ? ?
38 C z10 3.25 3.75 3.75
39 C z196 ? ? ?
41 C INPUT PARAMETERS
42 define(`rp', `%r2')
43 define(`up', `%r3')
44 define(`vp', `%r4')
45 define(`n', `%r5')
47 ifdef(`OPERATION_and_n',`
48 define(`func',`mpn_and_n')
49 define(`VARIANT_1')
50 define(`LOGOPC',`nc')
51 define(`LOGOP',`ng')')
52 ifdef(`OPERATION_andn_n',`
53 define(`func',`mpn_andn_n')
54 define(`VARIANT_2')
55 define(`LOGOP',`ng')')
56 ifdef(`OPERATION_nand_n',`
57 define(`func',`mpn_nand_n')
58 define(`VARIANT_3')
59 define(`LOGOP',`ng')')
60 ifdef(`OPERATION_ior_n',`
61 define(`func',`mpn_ior_n')
62 define(`VARIANT_1')
63 define(`LOGOPC',`oc')
64 define(`LOGOP',`og')')
65 ifdef(`OPERATION_iorn_n',`
66 define(`func',`mpn_iorn_n')
67 define(`VARIANT_2')
68 define(`LOGOP',`og')')
69 ifdef(`OPERATION_nior_n',`
70 define(`func',`mpn_nior_n')
71 define(`VARIANT_3')
72 define(`LOGOP',`og')')
73 ifdef(`OPERATION_xor_n',`
74 define(`func',`mpn_xor_n')
75 define(`VARIANT_1')
76 define(`LOGOPC',`xc')
77 define(`LOGOP',`xg')')
78 ifdef(`OPERATION_xnor_n',`
79 define(`func',`mpn_xnor_n')
80 define(`VARIANT_2')
81 define(`LOGOP',`xg')')
83 MULFUNC_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)
85 ASM_START()
86 PROLOGUE(func)
87 ifdef(`VARIANT_1',`
88 cgr rp, up
89 jne L(normal)
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)
97 L(tp): LOGOPC 0(256, rp), 0(vp)
98 la rp, 256(rp)
99 la vp, 256(vp)
100 brctg %r1, L(tp)
102 L(1): bras %r1, L(2) C make r1 point to mvc insn
103 LOGOPC 0(1, rp), 0(vp)
104 L(2): ex n, 0(%r1) C execute mvc with length ((n-1) mod 256)+1
105 L(rtn): br %r14
108 L(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)
119 L(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)
129 L(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)
137 L(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)
146 L(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)
155 L(mid): brctg %r0, L(top)
157 lmg %r6, %r8, 48(%r15)
158 br %r14
161 ifdef(`VARIANT_2',`
162 stmg %r6, %r8, 48(%r15)
163 lghi %r1, -1
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)
174 L(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)
187 L(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)
196 L(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)
207 L(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)
220 L(mid): brctg %r0, L(top)
222 lmg %r6, %r8, 48(%r15)
223 br %r14
226 ifdef(`VARIANT_3',`
227 stmg %r6, %r8, 48(%r15)
228 lghi %r1, -1
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)
239 L(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)
252 L(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)
261 L(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)
272 L(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)
285 L(mid): brctg %r0, L(top)
287 lmg %r6, %r8, 48(%r15)
288 br %r14
291 EPILOGUE()