1dnl SPARC v9 64-bit mpn_sqr_diagonal. 2 3dnl Copyright 2001, 2002 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 23C UltraSPARC 1&2: 22 24C UltraSPARC 3: 36 25 26C This was generated by the Sun C compiler. It runs at 22 cycles/limb on the 27C UltraSPARC-1/2, three cycles slower than theoretically possible for optimal 28C code using the same algorithm. For 1-3 limbs, a special loop was generated, 29C which causes performance problems in particular for 2 and 3 limbs. 30C Ultimately, this should be replaced by hand-written code in the same software 31C pipeline style as e.g., addmul_1.asm. 32 33ASM_START() 34 REGISTER(%g2,#scratch) 35 REGISTER(%g3,#scratch) 36PROLOGUE(mpn_sqr_diagonal) 37 save %sp, -240, %sp 38 39 sethi %hi(0x1ffc00), %o0 40 sethi %hi(0x3ffc00), %o1 41 add %o0, 1023, %o7 42 cmp %i2, 4 43 add %o1, 1023, %o4 44 or %g0, %i1, %g1 45 or %g0, %i0, %o0 46 bl,pn %xcc, .Lsmall 47 or %g0, 0, %g2 48 49 ldx [%i1], %o1 50 add %i1, 24, %g1 51 or %g0, 3, %g2 52 srlx %o1, 42, %g3 53 stx %g3, [%sp+2279] 54 and %o1, %o7, %o2 55 stx %o2, [%sp+2263] 56 srlx %o1, 21, %o1 57 ldd [%sp+2279], %f0 58 and %o1, %o7, %o1 59 stx %o1, [%sp+2271] 60 ldx [%i1+8], %o2 61 fxtod %f0, %f12 62 srlx %o2, 21, %o1 63 and %o2, %o7, %g3 64 ldd [%sp+2263], %f2 65 fmuld %f12, %f12, %f10 66 srlx %o2, 42, %o2 67 ldd [%sp+2271], %f0 68 and %o1, %o7, %o1 69 fxtod %f2, %f8 70 stx %o2, [%sp+2279] 71 stx %o1, [%sp+2271] 72 fxtod %f0, %f0 73 stx %g3, [%sp+2263] 74 fdtox %f10, %f14 75 fmuld %f12, %f8, %f6 76 ldx [%i1+16], %o2 77 std %f14, [%sp+2255] 78 fmuld %f0, %f0, %f2 79 fmuld %f8, %f8, %f10 80 srlx %o2, 42, %o1 81 faddd %f6, %f6, %f6 82 fmuld %f12, %f0, %f12 83 fmuld %f0, %f8, %f8 84 ldd [%sp+2279], %f0 85 ldd [%sp+2263], %f4 86 fdtox %f10, %f10 87 std %f10, [%sp+2239] 88 faddd %f2, %f6, %f6 89 ldd [%sp+2271], %f2 90 fdtox %f12, %f12 91 std %f12, [%sp+2247] 92 fdtox %f8, %f8 93 std %f8, [%sp+2231] 94 fdtox %f6, %f6 95 std %f6, [%sp+2223] 96 97.Loop: srlx %o2, 21, %g3 98 stx %o1, [%sp+2279] 99 add %g2, 1, %g2 100 and %g3, %o7, %o1 101 ldx [%sp+2255], %g4 102 cmp %g2, %i2 103 stx %o1, [%sp+2271] 104 add %g1, 8, %g1 105 add %o0, 16, %o0 106 ldx [%sp+2239], %o1 107 fxtod %f0, %f10 108 fxtod %f4, %f14 109 ldx [%sp+2231], %i0 110 ldx [%sp+2223], %g5 111 ldx [%sp+2247], %g3 112 and %o2, %o7, %o2 113 fxtod %f2, %f8 114 fmuld %f10, %f10, %f0 115 stx %o2, [%sp+2263] 116 fmuld %f10, %f14, %f6 117 ldx [%g1-8], %o2 118 fmuld %f10, %f8, %f12 119 fdtox %f0, %f2 120 ldd [%sp+2279], %f0 121 fmuld %f8, %f8, %f4 122 faddd %f6, %f6, %f6 123 fmuld %f14, %f14, %f10 124 std %f2, [%sp+2255] 125 sllx %g4, 20, %g4 126 ldd [%sp+2271], %f2 127 fmuld %f8, %f14, %f8 128 sllx %i0, 22, %i1 129 fdtox %f12, %f12 130 std %f12, [%sp+2247] 131 sllx %g5, 42, %i0 132 add %o1, %i1, %o1 133 faddd %f4, %f6, %f6 134 ldd [%sp+2263], %f4 135 add %o1, %i0, %o1 136 add %g3, %g4, %g3 137 fdtox %f10, %f10 138 std %f10, [%sp+2239] 139 srlx %o1, 42, %g4 140 and %g5, %o4, %i0 141 fdtox %f8, %f8 142 std %f8, [%sp+2231] 143 srlx %g5, 22, %g5 144 sub %g4, %i0, %g4 145 fdtox %f6, %f6 146 std %f6, [%sp+2223] 147 srlx %g4, 63, %g4 148 add %g3, %g5, %g3 149 add %g3, %g4, %g3 150 stx %o1, [%o0-16] 151 srlx %o2, 42, %o1 152 bl,pt %xcc, .Loop 153 stx %g3, [%o0-8] 154 155 stx %o1, [%sp+2279] 156 srlx %o2, 21, %o1 157 fxtod %f0, %f16 158 ldx [%sp+2223], %g3 159 fxtod %f4, %f6 160 and %o2, %o7, %o3 161 stx %o3, [%sp+2263] 162 fxtod %f2, %f4 163 and %o1, %o7, %o1 164 ldx [%sp+2231], %o2 165 sllx %g3, 42, %g4 166 fmuld %f16, %f16, %f14 167 stx %o1, [%sp+2271] 168 fmuld %f16, %f6, %f8 169 add %o0, 48, %o0 170 ldx [%sp+2239], %o1 171 sllx %o2, 22, %o2 172 fmuld %f4, %f4, %f10 173 ldx [%sp+2255], %o3 174 fdtox %f14, %f14 175 fmuld %f4, %f6, %f2 176 std %f14, [%sp+2255] 177 faddd %f8, %f8, %f12 178 add %o1, %o2, %o2 179 fmuld %f16, %f4, %f4 180 ldd [%sp+2279], %f0 181 sllx %o3, 20, %g5 182 add %o2, %g4, %o2 183 fmuld %f6, %f6, %f6 184 srlx %o2, 42, %o3 185 and %g3, %o4, %g4 186 srlx %g3, 22, %g3 187 faddd %f10, %f12, %f16 188 ldd [%sp+2271], %f12 189 ldd [%sp+2263], %f8 190 fxtod %f0, %f0 191 sub %o3, %g4, %o3 192 ldx [%sp+2247], %o1 193 srlx %o3, 63, %o3 194 fdtox %f2, %f10 195 fxtod %f8, %f8 196 std %f10, [%sp+2231] 197 fdtox %f6, %f6 198 std %f6, [%sp+2239] 199 add %o1, %g5, %o1 200 fmuld %f0, %f0, %f2 201 fdtox %f16, %f16 202 std %f16, [%sp+2223] 203 add %o1, %g3, %o1 204 fdtox %f4, %f4 205 std %f4, [%sp+2247] 206 fmuld %f0, %f8, %f10 207 fxtod %f12, %f12 208 add %o1, %o3, %o1 209 stx %o2, [%o0-48] 210 fmuld %f8, %f8, %f6 211 stx %o1, [%o0-40] 212 fdtox %f2, %f2 213 ldx [%sp+2231], %o2 214 faddd %f10, %f10, %f10 215 ldx [%sp+2223], %g3 216 fmuld %f12, %f12, %f4 217 fdtox %f6, %f6 218 ldx [%sp+2239], %o1 219 sllx %o2, 22, %o2 220 fmuld %f12, %f8, %f8 221 sllx %g3, 42, %g5 222 ldx [%sp+2255], %o3 223 fmuld %f0, %f12, %f0 224 add %o1, %o2, %o2 225 faddd %f4, %f10, %f4 226 ldx [%sp+2247], %o1 227 add %o2, %g5, %o2 228 and %g3, %o4, %g4 229 fdtox %f8, %f8 230 sllx %o3, 20, %g5 231 std %f8, [%sp+2231] 232 fdtox %f0, %f0 233 srlx %o2, 42, %o3 234 add %o1, %g5, %o1 235 fdtox %f4, %f4 236 srlx %g3, 22, %g3 237 sub %o3, %g4, %o3 238 std %f6, [%sp+2239] 239 std %f4, [%sp+2223] 240 srlx %o3, 63, %o3 241 add %o1, %g3, %o1 242 std %f2, [%sp+2255] 243 add %o1, %o3, %o1 244 std %f0, [%sp+2247] 245 stx %o2, [%o0-32] 246 stx %o1, [%o0-24] 247 ldx [%sp+2231], %o2 248 ldx [%sp+2223], %o3 249 ldx [%sp+2239], %o1 250 sllx %o2, 22, %o2 251 sllx %o3, 42, %g5 252 ldx [%sp+2255], %g4 253 and %o3, %o4, %g3 254 add %o1, %o2, %o2 255 ldx [%sp+2247], %o1 256 add %o2, %g5, %o2 257 stx %o2, [%o0-16] 258 sllx %g4, 20, %g4 259 srlx %o2, 42, %o2 260 add %o1, %g4, %o1 261 srlx %o3, 22, %o3 262 sub %o2, %g3, %o2 263 srlx %o2, 63, %o2 264 add %o1, %o3, %o1 265 add %o1, %o2, %o1 266 stx %o1, [%o0-8] 267 ret 268 restore %g0, %g0, %g0 269.Lsmall: 270 ldx [%g1], %o2 271.Loop0: 272 and %o2, %o7, %o1 273 stx %o1, [%sp+2263] 274 add %g2, 1, %g2 275 srlx %o2, 21, %o1 276 add %g1, 8, %g1 277 srlx %o2, 42, %o2 278 stx %o2, [%sp+2279] 279 and %o1, %o7, %o1 280 ldd [%sp+2263], %f0 281 cmp %g2, %i2 282 stx %o1, [%sp+2271] 283 fxtod %f0, %f6 284 ldd [%sp+2279], %f0 285 ldd [%sp+2271], %f4 286 fxtod %f0, %f2 287 fmuld %f6, %f6, %f0 288 fxtod %f4, %f10 289 fmuld %f2, %f6, %f4 290 fdtox %f0, %f0 291 std %f0, [%sp+2239] 292 fmuld %f10, %f6, %f8 293 fmuld %f10, %f10, %f0 294 faddd %f4, %f4, %f6 295 fmuld %f2, %f2, %f4 296 fdtox %f8, %f8 297 std %f8, [%sp+2231] 298 fmuld %f2, %f10, %f2 299 faddd %f0, %f6, %f0 300 fdtox %f4, %f4 301 std %f4, [%sp+2255] 302 fdtox %f2, %f2 303 std %f2, [%sp+2247] 304 fdtox %f0, %f0 305 std %f0, [%sp+2223] 306 ldx [%sp+2239], %o1 307 ldx [%sp+2255], %g4 308 ldx [%sp+2231], %o2 309 sllx %g4, 20, %g4 310 ldx [%sp+2223], %o3 311 sllx %o2, 22, %o2 312 sllx %o3, 42, %g5 313 add %o1, %o2, %o2 314 ldx [%sp+2247], %o1 315 add %o2, %g5, %o2 316 stx %o2, [%o0] 317 and %o3, %o4, %g3 318 srlx %o2, 42, %o2 319 add %o1, %g4, %o1 320 srlx %o3, 22, %o3 321 sub %o2, %g3, %o2 322 srlx %o2, 63, %o2 323 add %o1, %o3, %o1 324 add %o1, %o2, %o1 325 stx %o1, [%o0+8] 326 add %o0, 16, %o0 327 bl,a,pt %xcc, .Loop0 328 ldx [%g1], %o2 329 ret 330 restore %g0, %g0, %g0 331EPILOGUE(mpn_sqr_diagonal) 332