1dnl S/390-32 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 ? ? ? ? 36C z990 2.5 1 2.75 2.75 37C z9 ? ? ? 38C z10 ? ? ? 39C z196 ? ? ? 40 41C INPUT PARAMETERS 42define(`rp', `%r2') 43define(`up', `%r3') 44define(`vp', `%r4') 45define(`nn', `%r5') 46 47ifdef(`OPERATION_and_n',` 48 define(`func',`mpn_and_n') 49 define(`VARIANT_1') 50 define(`LOGOPC',`nc') 51 define(`LOGOP',`n')') 52ifdef(`OPERATION_andn_n',` 53 define(`func',`mpn_andn_n') 54 define(`VARIANT_2') 55 define(`LOGOP',`n')') 56ifdef(`OPERATION_nand_n',` 57 define(`func',`mpn_nand_n') 58 define(`VARIANT_3') 59 define(`LOGOP',`n')') 60ifdef(`OPERATION_ior_n',` 61 define(`func',`mpn_ior_n') 62 define(`VARIANT_1') 63 define(`LOGOPC',`oc') 64 define(`LOGOP',`o')') 65ifdef(`OPERATION_iorn_n',` 66 define(`func',`mpn_iorn_n') 67 define(`VARIANT_2') 68 define(`LOGOP',`o')') 69ifdef(`OPERATION_nior_n',` 70 define(`func',`mpn_nior_n') 71 define(`VARIANT_3') 72 define(`LOGOP',`o')') 73ifdef(`OPERATION_xor_n',` 74 define(`func',`mpn_xor_n') 75 define(`VARIANT_1') 76 define(`LOGOPC',`xc') 77 define(`LOGOP',`x')') 78ifdef(`OPERATION_xnor_n',` 79 define(`func',`mpn_xnor_n') 80 define(`VARIANT_2') 81 define(`LOGOP',`x')') 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 cr rp, up 89 jne L(normal) 90 91 sll nn, 2 92 ahi nn, -1 93 lr %r1, nn 94 srl %r1, 8 95 ltr %r1, %r1 C < 256 bytes to copy? 96 je L(1) 97 98L(tp): LOGOPC 0(256, rp), 0(vp) 99 la rp, 256(rp) 100 la vp, 256(vp) 101 brct %r1, L(tp) 102 103L(1): bras %r1, L(2) C make r1 point to mvc insn 104 LOGOPC 0(1, rp), 0(vp) 105L(2): ex nn, 0(%r1) C execute mvc with length ((nn-1) mod 256)+1 106L(rtn): br %r14 107 108 109L(normal): 110 stm %r6, %r8, 12(%r15) 111 ahi nn, 3 112 lhi %r7, 3 113 lr %r0, nn 114 srl %r0, 2 115 nr %r7, nn C nn mod 4 116 je L(b1) 117 chi %r7, 2 118 jl L(b2) 119 jne L(top) 120 121L(b3): lm %r5, %r7, 0(up) 122 la up, 12(up) 123 LOGOP %r5, 0(vp) 124 LOGOP %r6, 4(vp) 125 LOGOP %r7, 8(vp) 126 stm %r5, %r7, 0(rp) 127 la rp, 12(rp) 128 la vp, 12(vp) 129 j L(mid) 130 131L(b1): l %r5, 0(up) 132 la up, 4(up) 133 LOGOP %r5, 0(vp) 134 st %r5, 0(rp) 135 la rp, 4(rp) 136 la vp, 4(vp) 137 j L(mid) 138 139L(b2): lm %r5, %r6, 0(up) 140 la up, 8(up) 141 LOGOP %r5, 0(vp) 142 LOGOP %r6, 4(vp) 143 stm %r5, %r6, 0(rp) 144 la rp, 8(rp) 145 la vp, 8(vp) 146 j L(mid) 147 148L(top): lm %r5, %r8, 0(up) 149 la up, 16(up) 150 LOGOP %r5, 0(vp) 151 LOGOP %r6, 4(vp) 152 LOGOP %r7, 8(vp) 153 LOGOP %r8, 12(vp) 154 stm %r5, %r8, 0(rp) 155 la rp, 16(rp) 156 la vp, 16(vp) 157L(mid): brct %r0, L(top) 158 159 lm %r6, %r8, 12(%r15) 160 br %r14 161') 162 163ifdef(`VARIANT_2',` 164 stm %r6, %r8, 12(%r15) 165 lhi %r1, -1 166 167 ahi nn, 3 168 lhi %r7, 3 169 lr %r0, nn 170 srl %r0, 2 171 nr %r7, nn C nn mod 4 172 je L(b1) 173 chi %r7, 2 174 jl L(b2) 175 jne L(top) 176 177L(b3): lm %r5, %r7, 0(vp) 178 la vp, 12(vp) 179 xr %r5, %r1 180 xr %r6, %r1 181 xr %r7, %r1 182 LOGOP %r5, 0(up) 183 LOGOP %r6, 4(up) 184 LOGOP %r7, 8(up) 185 stm %r5, %r7, 0(rp) 186 la rp, 12(rp) 187 la up, 12(up) 188 j L(mid) 189 190L(b1): l %r5, 0(vp) 191 la vp, 4(vp) 192 xr %r5, %r1 193 LOGOP %r5, 0(up) 194 st %r5, 0(rp) 195 la rp, 4(rp) 196 la up, 4(up) 197 j L(mid) 198 199L(b2): lm %r5, %r6, 0(vp) 200 la vp, 8(vp) 201 xr %r5, %r1 202 xr %r6, %r1 203 LOGOP %r5, 0(up) 204 LOGOP %r6, 4(up) 205 stm %r5, %r6, 0(rp) 206 la rp, 8(rp) 207 la up, 8(up) 208 j L(mid) 209 210L(top): lm %r5, %r8, 0(vp) 211 la vp, 16(vp) 212 xr %r5, %r1 213 xr %r6, %r1 214 xr %r7, %r1 215 xr %r8, %r1 216 LOGOP %r5, 0(up) 217 LOGOP %r6, 4(up) 218 LOGOP %r7, 8(up) 219 LOGOP %r8, 12(up) 220 la up, 16(up) 221 stm %r5, %r8, 0(rp) 222 la rp, 16(rp) 223L(mid): brct %r0, L(top) 224 225 lm %r6, %r8, 12(%r15) 226 br %r14 227') 228 229ifdef(`VARIANT_3',` 230 stm %r6, %r8, 12(%r15) 231 lhi %r1, -1 232 233 ahi nn, 3 234 lhi %r7, 3 235 lr %r0, nn 236 srl %r0, 2 237 nr %r7, nn C nn mod 4 238 je L(b1) 239 chi %r7, 2 240 jl L(b2) 241 jne L(top) 242 243L(b3): lm %r5, %r7, 0(vp) 244 la vp, 12(vp) 245 LOGOP %r5, 0(up) 246 LOGOP %r6, 4(up) 247 xr %r5, %r1 248 xr %r6, %r1 249 LOGOP %r7, 8(up) 250 xr %r7, %r1 251 stm %r5, %r7, 0(rp) 252 la rp, 12(rp) 253 la up, 12(up) 254 j L(mid) 255 256L(b1): l %r5, 0(vp) 257 la vp, 4(vp) 258 LOGOP %r5, 0(up) 259 xr %r5, %r1 260 st %r5, 0(rp) 261 la rp, 4(rp) 262 la up, 4(up) 263 j L(mid) 264 265L(b2): lm %r5, %r6, 0(vp) 266 la vp, 8(vp) 267 LOGOP %r5, 0(up) 268 LOGOP %r6, 4(up) 269 xr %r5, %r1 270 xr %r6, %r1 271 stm %r5, %r6, 0(rp) 272 la rp, 8(rp) 273 la up, 8(up) 274 j L(mid) 275 276L(top): lm %r5, %r8, 0(vp) 277 la vp, 16(vp) 278 LOGOP %r5, 0(up) 279 LOGOP %r6, 4(up) 280 xr %r5, %r1 281 xr %r6, %r1 282 LOGOP %r7, 8(up) 283 LOGOP %r8, 12(up) 284 xr %r7, %r1 285 xr %r8, %r1 286 stm %r5, %r8, 0(rp) 287 la up, 16(up) 288 la rp, 16(rp) 289L(mid): brct %r0, L(top) 290 291 lm %r6, %r8, 12(%r15) 292 br %r14 293') 294 295EPILOGUE() 296