Home | History | Annotate | Line # | Download | only in ultrasparc1234
sqr_diagonal.asm revision 1.1
      1 dnl  SPARC v9 64-bit mpn_sqr_diagonal.
      2 
      3 dnl  Copyright 2001, 2002 Free Software Foundation, Inc.
      4 
      5 dnl  This file is part of the GNU MP Library.
      6 
      7 dnl  The GNU MP Library is free software; you can redistribute it and/or modify
      8 dnl  it under the terms of the GNU Lesser General Public License as published
      9 dnl  by the Free Software Foundation; either version 3 of the License, or (at
     10 dnl  your option) any later version.
     11 
     12 dnl  The GNU MP Library is distributed in the hope that it will be useful, but
     13 dnl  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
     14 dnl  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
     15 dnl  License for more details.
     16 
     17 dnl  You should have received a copy of the GNU Lesser General Public License
     18 dnl  along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.
     19 
     20 include(`../config.m4')
     21 
     22 C		   cycles/limb
     23 C UltraSPARC 1&2:     22
     24 C UltraSPARC 3:	      36
     25 
     26 C This was generated by the Sun C compiler.  It runs at 22 cycles/limb on the
     27 C UltraSPARC-1/2, three cycles slower than theoretically possible for optimal
     28 C code using the same algorithm.  For 1-3 limbs, a special loop was generated,
     29 C which causes performance problems in particular for 2 and 3 limbs.
     30 C Ultimately, this should be replaced by hand-written code in the same software
     31 C pipeline style as e.g., addmul_1.asm.
     32 
     33 ASM_START()
     34 	REGISTER(%g2,#scratch)
     35 	REGISTER(%g3,#scratch)
     36 PROLOGUE(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
    331 EPILOGUE(mpn_sqr_diagonal)
    332