FIX BUILD (with GHC 6.2.x): System.Directory.Internals is no more
[ghc-hetmet.git] / rts / gmp / mpn / powerpc32 / addmul_1.asm
1 dnl PowerPC-32 mpn_addmul_1 -- Multiply a limb vector with a limb and add
2 dnl the result to a second limb vector.
3
4 dnl Copyright (C) 1995, 1997, 1998, 2000 Free Software Foundation, Inc.
5
6 dnl This file is part of the GNU MP Library.
7
8 dnl The GNU MP Library is free software; you can redistribute it and/or modify
9 dnl it under the terms of the GNU Lesser General Public License as published by
10 dnl the Free Software Foundation; either version 2.1 of the License, or (at your
11 dnl option) any later version.
12
13 dnl The GNU MP Library is distributed in the hope that it will be useful, but
14 dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 dnl or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
16 dnl License for more details.
17
18 dnl You should have received a copy of the GNU Lesser General Public License
19 dnl along with the GNU MP Library; see the file COPYING.LIB.  If not, write to
20 dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
21 dnl MA 02111-1307, USA.
22
23
24 dnl INPUT PARAMETERS
25 dnl res_ptr     r3
26 dnl s1_ptr      r4
27 dnl size        r5
28 dnl s2_limb     r6
29
30 dnl This is optimized for the PPC604.  It has not been tested on PPC601, PPC603
31 dnl or PPC750 since I don't have access to any such machines.
32
33 include(`../config.m4')
34
35 ASM_START()
36 PROLOGUE(mpn_addmul_1)
37         cmpi    cr0,r5,9        C more than 9 limbs?
38         bgt     cr0,.Lbig       C branch if more than 9 limbs
39
40         mtctr   r5
41         lwz     r0,0(r4)
42         mullw   r7,r0,r6
43         mulhwu  r10,r0,r6
44         lwz     r9,0(r3)
45         addc    r8,r7,r9
46         addi    r3,r3,-4
47         bdz     .Lend
48 .Lloop:
49         lwzu    r0,4(r4)
50         stwu    r8,4(r3)
51         mullw   r8,r0,r6
52         adde    r7,r8,r10
53         mulhwu  r10,r0,r6
54         lwz     r9,4(r3)
55         addze   r10,r10
56         addc    r8,r7,r9
57         bdnz    .Lloop
58 .Lend:  stw     r8,4(r3)
59         addze   r3,r10
60         blr
61
62 .Lbig:  stmw    r30,-32(r1)
63         addi    r5,r5,-1
64         srwi    r0,r5,2
65         mtctr   r0
66
67         lwz     r7,0(r4)
68         mullw   r8,r7,r6
69         mulhwu  r0,r7,r6
70         lwz     r7,0(r3)
71         addc    r8,r8,r7
72         stw     r8,0(r3)
73
74 .LloopU:
75         lwz     r7,4(r4)
76         lwz     r12,8(r4)
77         lwz     r30,12(r4)
78         lwzu    r31,16(r4)
79         mullw   r8,r7,r6
80         mullw   r9,r12,r6
81         mullw   r10,r30,r6
82         mullw   r11,r31,r6
83         adde    r8,r8,r0        C add cy_limb
84         mulhwu  r0,r7,r6
85         lwz     r7,4(r3)
86         adde    r9,r9,r0
87         mulhwu  r0,r12,r6
88         lwz     r12,8(r3)
89         adde    r10,r10,r0
90         mulhwu  r0,r30,r6
91         lwz     r30,12(r3)
92         adde    r11,r11,r0
93         mulhwu  r0,r31,r6
94         lwz     r31,16(r3)
95         addze   r0,r0           C new cy_limb
96         addc    r8,r8,r7
97         stw     r8,4(r3)
98         adde    r9,r9,r12
99         stw     r9,8(r3)
100         adde    r10,r10,r30
101         stw     r10,12(r3)
102         adde    r11,r11,r31
103         stwu    r11,16(r3)
104         bdnz    .LloopU
105
106         andi.   r31,r5,3
107         mtctr   r31
108         beq     cr0,.Lendx
109
110 .LloopE:
111         lwzu    r7,4(r4)
112         mullw   r8,r7,r6
113         adde    r8,r8,r0        C add cy_limb
114         mulhwu  r0,r7,r6
115         lwz     r7,4(r3)
116         addze   r0,r0           C new cy_limb
117         addc    r8,r8,r7
118         stwu    r8,4(r3)
119         bdnz    .LloopE
120 .Lendx:
121         addze   r3,r0
122         lmw     r30,-32(r1)
123         blr
124 EPILOGUE(mpn_addmul_1)