github.com/aergoio/aergo@v1.3.1/libtool/src/gmp-6.1.2/mpn/sparc64/ultrasparct3/mod_1_4.asm (about)

     1  dnl  SPARC T3/T4/T5 mpn_mod_1s_4p.
     2  
     3  dnl  Contributed to the GNU project by Torbjörn Granlund.
     4  
     5  dnl  Copyright 2013 Free Software Foundation, Inc.
     6  
     7  dnl  This file is part of the GNU MP Library.
     8  dnl
     9  dnl  The GNU MP Library is free software; you can redistribute it and/or modify
    10  dnl  it under the terms of either:
    11  dnl
    12  dnl    * the GNU Lesser General Public License as published by the Free
    13  dnl      Software Foundation; either version 3 of the License, or (at your
    14  dnl      option) any later version.
    15  dnl
    16  dnl  or
    17  dnl
    18  dnl    * the GNU General Public License as published by the Free Software
    19  dnl      Foundation; either version 2 of the License, or (at your option) any
    20  dnl      later version.
    21  dnl
    22  dnl  or both in parallel, as here.
    23  dnl
    24  dnl  The GNU MP Library is distributed in the hope that it will be useful, but
    25  dnl  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
    26  dnl  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    27  dnl  for more details.
    28  dnl
    29  dnl  You should have received copies of the GNU General Public License and the
    30  dnl  GNU Lesser General Public License along with the GNU MP Library.  If not,
    31  dnl  see https://www.gnu.org/licenses/.
    32  
    33  include(`../config.m4')
    34  
    35  C                  cycles/limb
    36  C UltraSPARC T3:	30
    37  C UltraSPARC T4/T5:	 4
    38  
    39  C INPUT PARAMETERS
    40  define(`ap',  `%o0')
    41  define(`n',   `%o1')
    42  define(`d',   `%o2')
    43  define(`cps', `%o3')
    44  
    45  
    46  ASM_START()
    47  	REGISTER(%g2,#scratch)
    48  	REGISTER(%g3,#scratch)
    49  PROLOGUE(mpn_mod_1s_4p)
    50  	save	%sp, -176, %sp
    51  	ldx	[%i3+16], %o4
    52  	ldx	[%i3+24], %o3
    53  	ldx	[%i3+32], %o2
    54  	ldx	[%i3+40], %o1
    55  	ldx	[%i3+48], %o0
    56  
    57  	and	%i1, 3, %g3
    58  	sllx	%i1, 3, %g1
    59  	add	%i0, %g1, %i0
    60  	brz	%g3, L(b00)
    61  	 cmp	%g3, 2
    62  	bcs	%xcc, L(b01)
    63  	 nop
    64  	be	%xcc, L(b10)
    65  	 nop
    66  
    67  L(b11):	ldx	[%i0-16], %g2
    68  	mulx	%g2, %o4, %g5
    69  	umulxhi(%g2, %o4, %g3)
    70  	ldx	[%i0-24], %g4
    71  	addcc	%g5, %g4, %g5
    72  	addxc(	%g3, %g0, %g4)
    73  	ldx	[%i0-8], %g2
    74  	mulx	%g2, %o3, %g1
    75  	umulxhi(%g2, %o3, %g3)
    76  	addcc	%g1, %g5, %g1
    77  	addxc(	%g3, %g4, %g2)
    78  	ba,pt	%xcc, .L8
    79  	 add	%i0, -32, %i0
    80  
    81  L(b00):	ldx	[%i0-24], %g3
    82  	mulx	%g3, %o4, %g2
    83  	umulxhi(%g3, %o4, %g5)
    84  	ldx	[%i0-32], %g4
    85  	addcc	%g2, %g4, %g2
    86  	addxc(	%g5, %g0, %g3)
    87  	ldx	[%i0-16], %g4
    88  	mulx	%g4, %o3, %g5
    89  	umulxhi(%g4, %o3, %i5)
    90  	addcc	%g2, %g5, %g5
    91  	addxc(	%g3, %i5, %g4)
    92  	ldx	[%i0-8], %g2
    93  	mulx	%g2, %o2, %g1
    94  	umulxhi(%g2, %o2, %g3)
    95  	addcc	%g1, %g5, %g1
    96  	addxc(	%g3, %g4, %g2)
    97  	ba,pt	%xcc, .L8
    98  	 add	%i0, -40, %i0
    99  
   100  L(b01):	ldx	[%i0-8], %g1
   101  	mov	0, %g2
   102  	ba,pt	%xcc, .L8
   103  	 add	%i0, -16, %i0
   104  
   105  L(b10):	ldx	[%i0-8], %g2
   106  	ldx	[%i0-16], %g1
   107  	add	%i0, -24, %i0
   108  
   109  .L8:	add	%i1, -5, %g3
   110  	brlz,pn	%g3, L(end)
   111  	 nop
   112  
   113  L(top):	ldx	[%i0-16], %i4
   114  	mulx	%i4, %o4, %o5
   115  	umulxhi(%i4, %o4, %i1)
   116  	ldx	[%i0-24], %i5
   117  	addcc	%o5, %i5, %o5
   118  	addxc(	%i1, %g0, %i4)
   119  	ldx	[%i0-8], %i5
   120  	mulx	%i5, %o3, %o7
   121  	umulxhi(%i5, %o3, %i1)
   122  	addcc	%o5, %o7, %o7
   123  	addxc(	%i4, %i1, %i5)
   124  	ldx	[%i0+0], %g4
   125  	mulx	%g4, %o2, %i1
   126  	umulxhi(%g4, %o2, %i4)
   127  	addcc	%o7, %i1, %i1
   128  	addxc(	%i5, %i4, %g4)
   129  	mulx	%g1, %o1, %i5
   130  	umulxhi(%g1, %o1, %i4)
   131  	addcc	%i1, %i5, %i5
   132  	addxc(	%g4, %i4, %g5)
   133  	mulx	%g2, %o0, %g1
   134  	umulxhi(%g2, %o0, %g4)
   135  	addcc	%g1, %i5, %g1
   136  	addxc(	%g4, %g5, %g2)
   137  	add	%g3, -4, %g3
   138  	brgez,pt %g3, L(top)
   139  	 add	%i0, -32, %i0
   140  
   141  L(end):	mulx	%g2, %o4, %g5
   142  	umulxhi(%g2, %o4, %g3)
   143  	addcc	%g1, %g5, %g5
   144  	addxc(	%g3, %g0, %g2)
   145  	ldx	[%i3+8], %i0
   146  	ldx	[%i3], %g4
   147  	sub	%g0, %i0, %i5
   148  	srlx	%g5, %i5, %i5
   149  	sllx	%g2, %i0, %g2
   150  	or	%i5, %g2, %g1
   151  	mulx	%g1, %g4, %l7
   152  	umulxhi(%g1, %g4, %g3)
   153  	sllx	%g5, %i0, %g2
   154  	add	%g1, 1, %g1
   155  	addcc	%l7, %g2, %g5
   156  	addxc(	%g3, %g1, %g1)
   157  	mulx	%g1, %i2, %g1
   158  	sub	%g2, %g1, %g2
   159  	cmp	%g2, %g5
   160  	add	%i2, %g2, %g1
   161  	movlu	%xcc, %g2, %g1
   162  	subcc	%g1, %i2, %g2
   163  	movgeu	%xcc, %g2, %g1
   164  	return	%i7+8
   165  	 srlx	%g1, %o0, %o0
   166  EPILOGUE()
   167  
   168  PROLOGUE(mpn_mod_1s_4p_cps)
   169  	save	%sp, -176, %sp
   170  	lzcnt(	%i1, %i5)
   171  	sllx	%i1, %i5, %i1
   172  	call	mpn_invert_limb, 0
   173  	 mov	%i1, %o0
   174  	stx	%o0, [%i0]
   175  	sra	%i5, 0, %g1
   176  	stx	%g1, [%i0+8]
   177  	sub	%g0, %i5, %g2
   178  	srlx	%o0, %g2, %g2
   179  	mov	1, %g1
   180  	sllx	%g1, %i5, %g1
   181  	or	%g2, %g1, %g2
   182  	sub	%g0, %i1, %g1
   183  	mulx	%g2, %g1, %g2
   184  	srlx	%g2, %i5, %g1
   185  	stx	%g1, [%i0+16]
   186  
   187  	umulxhi(%o0, %g2, %g3)
   188  	add	%g2, %g3, %g3
   189  	xnor	%g0, %g3, %g3
   190  	mulx	%g3, %i1, %g3
   191  	mulx	%g2, %o0, %g2
   192  	cmp	%g2, %g3
   193  	add	%i1, %g3, %g1
   194  	movgeu	%xcc, %g3, %g1
   195  	srlx	%g1, %i5, %g2
   196  	stx	%g2, [%i0+24]
   197  
   198  	umulxhi(%o0, %g1, %g3)
   199  	add	%g1, %g3, %g3
   200  	xnor	%g0, %g3, %g3
   201  	mulx	%g3, %i1, %g3
   202  	mulx	%g1, %o0, %g1
   203  	cmp	%g1, %g3
   204  	add	%i1, %g3, %g2
   205  	movgeu	%xcc, %g3, %g2
   206  	srlx	%g2, %i5, %g1
   207  	stx	%g1, [%i0+32]
   208  
   209  	umulxhi(%o0, %g2, %g3)
   210  	add	%g2, %g3, %g3
   211  	xnor	%g0, %g3, %g3
   212  	mulx	%g3, %i1, %g3
   213  	mulx	%g2, %o0, %g2
   214  	cmp	%g2, %g3
   215  	add	%i1, %g3, %g1
   216  	movgeu	%xcc, %g3, %g1
   217  	srlx	%g1, %i5, %g2
   218  	stx	%g2, [%i0+40]
   219  
   220  	umulxhi(%o0, %g1, %g2)
   221  	add	%g1, %g2, %g2
   222  	xnor	%g0, %g2, %g2
   223  	mulx	%g2, %i1, %g2
   224  	mulx	%g1, %o0, %o0
   225  	cmp	%o0, %g2
   226  	add	%i1, %g2, %g3
   227  	movgeu	%xcc, %g2, %g3
   228  	srlx	%g3, %i5, %i5
   229  	stx	%i5, [%i0+48]
   230  
   231  	return	%i7+8
   232  	 nop
   233  EPILOGUE()