beta-0.89.2
[luatex.git] / source / libs / gmp / gmp-src / mpn / powerpc64 / mode64 / p7 / aorsorrlshC_n.asm
blob525120262fcf568957899072148bd8234d8973ba
1 dnl PowerPC-64 mpn_addlshC_n, mpn_sublshC_n, mpn_rsblshC_n.
3 dnl Copyright 2003, 2005, 2009, 2010, 2013 Free Software Foundation, Inc.
5 dnl This file is part of the GNU MP Library.
6 dnl
7 dnl The GNU MP Library is free software; you can redistribute it and/or modify
8 dnl it under the terms of either:
9 dnl
10 dnl * the GNU Lesser General Public License as published by the Free
11 dnl Software Foundation; either version 3 of the License, or (at your
12 dnl option) any later version.
13 dnl
14 dnl or
15 dnl
16 dnl * the GNU General Public License as published by the Free Software
17 dnl Foundation; either version 2 of the License, or (at your option) any
18 dnl later version.
19 dnl
20 dnl or both in parallel, as here.
21 dnl
22 dnl The GNU MP Library is distributed in the hope that it will be useful, but
23 dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
24 dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
25 dnl for more details.
26 dnl
27 dnl You should have received copies of the GNU General Public License and the
28 dnl GNU Lesser General Public License along with the GNU MP Library. If not,
29 dnl see https://www.gnu.org/licenses/.
31 C cycles/limb
32 C POWER3/PPC630 ?
33 C POWER4/PPC970 ?
34 C POWER5 ?
35 C POWER6 ?
36 C POWER7 2.5
38 C INPUT PARAMETERS
39 define(`rp', `r3')
40 define(`up', `r4')
41 define(`vp', `r5')
42 define(`n', `r6')
44 ifdef(`DO_add', `
45 define(`ADDSUBC', `addc $1, $2, $3')
46 define(`ADDSUBE', `adde $1, $2, $3')
47 define(INITCY, `addic $1, r1, 0')
48 define(RETVAL, `addze r3, $1')
49 define(`func', mpn_addlsh`'LSH`'_n)')
50 ifdef(`DO_sub', `
51 define(`ADDSUBC', `subfc $1, $2, $3')
52 define(`ADDSUBE', `subfe $1, $2, $3')
53 define(INITCY, `addic $1, r1, -1')
54 define(RETVAL, `subfze r3, $1
55 neg r3, r3')
56 define(`func', mpn_sublsh`'LSH`'_n)')
57 ifdef(`DO_rsb', `
58 define(`ADDSUBC', `subfc $1, $3, $2')
59 define(`ADDSUBE', `subfe $1, $3, $2')
60 define(INITCY, `addic $1, r1, -1')
61 define(RETVAL, `addme r3, $1')
62 define(`func', mpn_rsblsh`'LSH`'_n)')
64 define(`s0', `r0') define(`s1', `r9')
65 define(`u0', `r6') define(`u1', `r7')
66 define(`v0', `r10') define(`v1', `r11')
69 ASM_START()
70 PROLOGUE(func)
71 rldic r7, n, 3, 59
72 add up, up, r7
73 add vp, vp, r7
74 add rp, rp, r7
76 ifdef(`DO_add', `
77 addic r0, n, 3 C set cy flag as side effect
78 ',`
79 subfc r0, r0, r0 C set cy flag
80 addi r0, n, 3
82 srdi r0, r0, 2
83 mtctr r0
85 andi. r0, n, 1
86 beq L(bx0)
88 L(bx1): andi. r0, n, 2
89 li s0, 0
90 bne L(lo3)
91 b L(lo1)
93 L(bx0): andi. r0, n, 2
94 li s1, 0
95 bne L(lo2)
97 ALIGN(32)
98 L(top): addi rp, rp, 32
99 ld v0, 0(vp)
100 addi vp, vp, 32
101 rldimi s1, v0, LSH, 0
102 ld u0, 0(up)
103 addi up, up, 32
104 srdi s0, v0, RSH
105 ADDSUBE(s1, s1, u0)
106 std s1, -32(rp)
107 L(lo3): ld v1, -24(vp)
108 rldimi s0, v1, LSH, 0
109 ld u1, -24(up)
110 srdi s1, v1, RSH
111 ADDSUBE(s0, s0, u1)
112 std s0, -24(rp)
113 L(lo2): ld v0, -16(vp)
114 rldimi s1, v0, LSH, 0
115 ld u0, -16(up)
116 srdi s0, v0, RSH
117 ADDSUBE(s1, s1, u0)
118 std s1, -16(rp)
119 L(lo1): ld v1, -8(vp)
120 rldimi s0, v1, LSH, 0
121 ld u1, -8(up)
122 srdi s1, v1, RSH
123 ADDSUBE(s0, s0, u1)
124 std s0, -8(rp)
125 bdnz L(top) C decrement CTR and loop back
127 RETVAL( s1)
129 EPILOGUE()