1 | /* PowerPC64 mpn_lshift -- mpn_add_n/mpn_sub_n -- mpn addition and |
2 | subtraction. |
3 | Copyright (C) 2003-2024 Free Software Foundation, Inc. |
4 | This file is part of the GNU C Library. |
5 | |
6 | The GNU C Library is free software; you can redistribute it and/or |
7 | modify it under the terms of the GNU Lesser General Public |
8 | License as published by the Free Software Foundation; either |
9 | version 2.1 of the License, or (at your option) any later version. |
10 | |
11 | The GNU C Library is distributed in the hope that it will be useful, |
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
14 | Lesser General Public License for more details. |
15 | |
16 | You should have received a copy of the GNU Lesser General Public |
17 | License along with the GNU C Library; if not, see |
18 | <https://www.gnu.org/licenses/>. */ |
19 | |
20 | #include <sysdep.h> |
21 | |
22 | /* cycles/limb |
23 | * POWER7 2.18 |
24 | */ |
25 | |
26 | #ifdef USE_AS_SUB |
27 | # define FUNC __mpn_sub_n |
28 | # define ADDSUBC subfe |
29 | #else |
30 | # define FUNC __mpn_add_n |
31 | # define ADDSUBC adde |
32 | #endif |
33 | |
34 | #define RP r3 |
35 | #define UP r4 |
36 | #define VP r5 |
37 | #define N r6 |
38 | |
39 | ENTRY_TOCLESS (FUNC, 5) |
40 | #ifdef USE_AS_SUB |
41 | addic r0, r1, -1 |
42 | #else |
43 | addic r0, r0, 0 |
44 | #endif |
45 | andi. r7, N, 1 |
46 | beq L(bx0) |
47 | |
48 | ld r7, 0(UP) |
49 | ld r9, 0(VP) |
50 | ADDSUBC r11, r9, r7 |
51 | std r11, 0(RP) |
52 | cmpldi N, N, 1 |
53 | beq N, L(end) |
54 | addi UP, UP, 8 |
55 | addi VP, VP, 8 |
56 | addi RP, RP, 8 |
57 | |
58 | L(bx0): addi r0, N, 2 |
59 | srdi r0, r0, 2 |
60 | mtctr r0 |
61 | |
62 | andi. r7, N, 2 |
63 | bne L(mid) |
64 | |
65 | addi UP, UP, 16 |
66 | addi VP, VP, 16 |
67 | addi RP, RP, 16 |
68 | |
69 | .align 5 |
70 | L(top): ld r6, -16(UP) |
71 | ld r7, -8(UP) |
72 | ld r8, -16(VP) |
73 | ld r9, -8(VP) |
74 | ADDSUBC r10, r8, N |
75 | ADDSUBC r11, r9, r7 |
76 | std r10, -16(RP) |
77 | std r11, -8(RP) |
78 | L(mid): ld r6, 0(UP) |
79 | ld r7, 8(UP) |
80 | ld r8, 0(VP) |
81 | ld r9, 8(VP) |
82 | ADDSUBC r10, r8, N |
83 | ADDSUBC r11, r9, r7 |
84 | std r10, 0(RP) |
85 | std r11, 8(RP) |
86 | addi UP, UP, 32 |
87 | addi VP, VP, 32 |
88 | addi RP, RP, 32 |
89 | bdnz L(top) |
90 | |
91 | L(end): subfe r3, r0, r0 |
92 | #ifdef USE_AS_SUB |
93 | neg r3, r3 |
94 | #else |
95 | addi r3, r3, 1 |
96 | #endif |
97 | blr |
98 | END(FUNC) |
99 | |