Tizen 2.1 base
[external/gmp.git] / mpn / powerpc64 / lshift.asm
1 dnl  PowerPC-64 mpn_lshift -- 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_lshift)
43 ifdef(`HAVE_ABI_mode32',
44 `       rldicl  r7, r5, 0, 32   C zero extend n
45         mtctr   r7',            C copy n to count register
46 `       mtctr   n')             C copy n to count register
47
48 ifdef(`HAVE_ABI_mode32',
49 `       rldic   r0, n, 3, 32',  C byte count corresponding to n
50 `       rldicr  r0, n, 3, 60')  C byte count corresponding to n
51
52         add     rp, rp, r0      C rp = rp + n
53         add     up, up, r0      C up = up + n
54         addi    rp, rp, 8       C rp now points 16 beyond end
55         addi    up, up, -8      C up now points to last limb
56         subfic  tnc, cnt, 64    C reverse shift count
57
58         ld      u0, 0(up)
59         sld     h0, u0, cnt
60         srd     r12, u0, tnc    C return value
61         bdz     L(1)            C jump for n = 1
62
63         ld      u1, -8(up)
64         bdz     L(2)            C jump for n = 2
65
66         ldu     u0, -16(up)
67         bdz     L(end)          C jump for n = 3
68
69 L(oop): srd     v1, u1, tnc
70         sld     h1, u1, cnt
71         ld      u1, -8(up)
72         or      h0, v1, h0
73         stdu    h0, -16(rp)
74
75         bdz     L(exit)
76
77         srd     v0, u0, tnc
78         sld     h0, u0, cnt
79         ldu     u0, -16(up)
80         or      h1, v0, h1
81         std     h1, -8(rp)
82
83         bdnz    L(oop)
84
85 L(end): srd     v1, u1, tnc
86         sld     h1, u1, cnt
87         or      h0, v1, h0
88         stdu    h0, -16(rp)
89         srd     v0, u0, tnc
90         sld     h0, u0, cnt
91         or      h1, v0, h1
92         std     h1, -8(rp)
93 L(1):   std     h0, -16(rp)
94 ifdef(`HAVE_ABI_mode32',
95 `       srdi    r3, r12, 32
96         mr      r4, r12
97 ',`     mr      r3, r12
98 ')
99         blr
100
101 L(exit):        srd     v0, u0, tnc
102         sld     h0, u0, cnt
103         or      h1, v0, h1
104         std     h1, -8(rp)
105 L(2):   srd     v1, u1, tnc
106         sld     h1, u1, cnt
107         or      h0, v1, h0
108         stdu    h0, -16(rp)
109         std     h1, -8(rp)
110 ifdef(`HAVE_ABI_mode32',
111 `       srdi    r3, r12, 32
112         mr      r4, r12
113 ',`     mr      r3, r12
114 ')
115         blr
116 EPILOGUE()