Tizen 2.1 base
[external/gmp.git] / mpn / powerpc64 / rshift.asm
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()