]> git.ipfire.org Git - thirdparty/glibc.git/blob - sysdeps/powerpc/powerpc32/addmul_1.S
Merge glibc-ports into ports/ directory.
[thirdparty/glibc.git] / sysdeps / powerpc / powerpc32 / addmul_1.S
1 /* Multiply a limb vector by a single limb, for PowerPC.
2 Copyright (C) 1993-1995, 1997, 1999, 2000 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
4
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, see
17 <http://www.gnu.org/licenses/>. */
18
19 #include <sysdep.h>
20 #include <bp-sym.h>
21 #include <bp-asm.h>
22
23 /* mp_limb_t mpn_addmul_1 (mp_ptr res_ptr, mp_srcptr s1_ptr,
24 mp_size_t s1_size, mp_limb_t s2_limb)
25 Calculate res+s1*s2 and put result back in res; return carry. */
26 ENTRY (BP_SYM (__mpn_addmul_1))
27 #if __BOUNDED_POINTERS__
28 slwi r10,r5,2 /* convert limbs to bytes */
29 CHECK_BOUNDS_BOTH_WIDE (r3, r8, r9, r10)
30 CHECK_BOUNDS_BOTH_WIDE (r4, r8, r9, r10)
31 #endif
32 mtctr r5
33
34 lwz r0,0(r4)
35 mullw r7,r0,r6
36 mulhwu r10,r0,r6
37 lwz r9,0(r3)
38 addc r8,r7,r9
39 addi r3,r3,-4 /* adjust res_ptr */
40 bdz L(1)
41
42 L(0): lwzu r0,4(r4)
43 stwu r8,4(r3)
44 mullw r8,r0,r6
45 adde r7,r8,r10
46 mulhwu r10,r0,r6
47 lwz r9,4(r3)
48 addze r10,r10
49 addc r8,r7,r9
50 bdnz L(0)
51
52 L(1): stw r8,4(r3)
53 addze r3,r10
54 blr
55 END (BP_SYM (__mpn_addmul_1))