Home | History | Annotate | Line # | Download | only in powerpc64
rshift.asm revision 1.1
      1 dnl  PowerPC-64 mpn_rshift -- rp[] = up[] >> cnt
      2 
      3 dnl  Copyright 2003, 2005 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 POWER3/PPC630:     1.5
     24 C POWER4/PPC970:     3.0
     25 
     26 C INPUT PARAMETERS
     27 define(`rp',`r3')
     28 define(`up',`r4')
     29 define(`n',`r5')
     30 define(`cnt',`r6')
     31 
     32 define(`tnc',`r5')
     33 define(`v0',`r0')
     34 define(`v1',`r7')
     35 define(`u0',`r8')
     36 define(`u1',`r9')
     37 define(`h0',`r10')
     38 define(`h1',`r11')
     39 
     40 
     41 ASM_START()
     42 PROLOGUE(mpn_rshift)
     43 ifdef(`HAVE_ABI_mode32',
     44 `	rldicl	n, n, 0, 32')	C zero extend n
     45 	mtctr	n		C copy n to count register
     46 	addi	rp, rp, -16
     47 	subfic	tnc, cnt, 64	C reverse shift count
     48 
     49 	ld	u0, 0(up)
     50 	srd	h0, u0, cnt
     51 	sld	r12, u0, tnc	C return value
     52 	bdz	L(1)		C jump for n = 1
     53 
     54 	ld	u1, 8(up)
     55 	bdz	L(2)		C jump for n = 2
     56 
     57 	ldu	u0, 16(up)
     58 	bdz	L(end)		C jump for n = 3
     59 
     60 L(oop):	sld	v1, u1, tnc
     61 	srd	h1, u1, cnt
     62 	ld	u1, 8(up)
     63 	or	h0, v1, h0
     64 	stdu	h0, 16(rp)
     65 
     66 	bdz	L(exit)
     67 
     68 	sld	v0, u0, tnc
     69 	srd	h0, u0, cnt
     70 	ldu	u0, 16(up)
     71 	or	h1, v0, h1
     72 	std	h1, 8(rp)
     73 
     74 	bdnz	L(oop)
     75 
     76 L(end):	sld	v1, u1, tnc
     77 	srd	h1, u1, cnt
     78 	or	h0, v1, h0
     79 	stdu	h0, 16(rp)
     80 	sld	v0, u0, tnc
     81 	srd	h0, u0, cnt
     82 	or	h1, v0, h1
     83 	std	h1, 8(rp)
     84 L(1):	std	h0, 16(rp)
     85 ifdef(`HAVE_ABI_mode32',
     86 `	srdi	r3, r12, 32
     87 	mr	r4, r12
     88 ',`	mr	r3, r12
     89 ')
     90 	blr
     91 
     92 L(exit):	sld	v0, u0, tnc
     93 	srd	h0, u0, cnt
     94 	or	h1, v0, h1
     95 	std	h1, 8(rp)
     96 L(2):	sld	v1, u1, tnc
     97 	srd	h1, u1, cnt
     98 	or	h0, v1, h0
     99 	stdu	h0, 16(rp)
    100 	std	h1, 8(rp)
    101 ifdef(`HAVE_ABI_mode32',
    102 `	srdi	r3, r12, 32
    103 	mr	r4, r12
    104 ',`	mr	r3, r12
    105 ')
    106 	blr
    107 EPILOGUE()
    108