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