remove empty dir
[ghc-hetmet.git] / ghc / rts / gmp / mpn / a29k / submul_1.s
1 ; 29000 __gmpn_submul_1 -- Multiply a limb vector with a single limb and
2 ; subtract the product from a second limb vector.
3
4 ; Copyright (C) 1992, 1994, 2000 Free Software Foundation, Inc.
5
6 ; This file is part of the GNU MP Library.
7
8 ; The GNU MP Library is free software; you can redistribute it and/or modify
9 ; it under the terms of the GNU Lesser General Public License as published by
10 ; the Free Software Foundation; either version 2.1 of the License, or (at your
11 ; option) any later version.
12
13 ; The GNU MP Library is distributed in the hope that it will be useful, but
14 ; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 ; or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
16 ; License for more details.
17
18 ; You should have received a copy of the GNU Lesser General Public License
19 ; along with the GNU MP Library; see the file COPYING.LIB.  If not, write to
20 ; the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
21 ; MA 02111-1307, USA.
22
23
24 ; INPUT PARAMETERS
25 ; res_ptr       lr2
26 ; s1_ptr        lr3
27 ; size          lr4
28 ; s2_limb       lr5
29
30         .cputype 29050
31         .sect .lit,lit
32         .text
33         .align  4
34         .global ___gmpn_submul_1
35         .word   0x60000
36 ___gmpn_submul_1:
37         sub     lr4,lr4,8
38         jmpt    lr4,Ltail
39          const  gr120,0                 ; init cylimb reg
40
41         srl     gr117,lr4,3             ; divide by 8
42         sub     gr117,gr117,1           ; count for jmpfdec
43
44 Loop:   mtsrim  cr,(8-1)
45         loadm   0,0,gr96,lr3
46         add     lr3,lr3,32
47
48         multiplu gr104,gr96,lr5
49         multmu   gr96,gr96,lr5
50         multiplu gr105,gr97,lr5
51         multmu   gr97,gr97,lr5
52         multiplu gr106,gr98,lr5
53         multmu   gr98,gr98,lr5
54         multiplu gr107,gr99,lr5
55         multmu   gr99,gr99,lr5
56         multiplu gr108,gr100,lr5
57         multmu   gr100,gr100,lr5
58         multiplu gr109,gr101,lr5
59         multmu   gr101,gr101,lr5
60         multiplu gr110,gr102,lr5
61         multmu   gr102,gr102,lr5
62         multiplu gr111,gr103,lr5
63         multmu   gr103,gr103,lr5
64
65         add     gr104,gr104,gr120
66         addc    gr105,gr105,gr96
67         addc    gr106,gr106,gr97
68         addc    gr107,gr107,gr98
69         addc    gr108,gr108,gr99
70         addc    gr109,gr109,gr100
71         addc    gr110,gr110,gr101
72         addc    gr111,gr111,gr102
73         addc    gr120,gr103,0
74
75         mtsrim  cr,(8-1)
76         loadm   0,0,gr96,lr2
77
78         sub     gr96,gr96,gr104
79         subc    gr97,gr97,gr105
80         subc    gr98,gr98,gr106
81         subc    gr99,gr99,gr107
82         subc    gr100,gr100,gr108
83         subc    gr101,gr101,gr109
84         subc    gr102,gr102,gr110
85         subc    gr103,gr103,gr111
86
87         add     gr104,gr103,gr111       ; invert carry from previus sub
88         addc    gr120,gr120,0
89
90         mtsrim  cr,(8-1)
91         storem  0,0,gr96,lr2
92         jmpfdec gr117,Loop
93          add    lr2,lr2,32
94
95 Ltail:  and     lr4,lr4,(8-1)
96         sub     gr118,lr4,1             ; count for CR
97         jmpt    gr118,Lend
98          sub    lr4,lr4,2
99         sub     lr2,lr2,4               ; offset res_ptr by one limb
100
101 Loop2:  load    0,0,gr116,lr3
102         add     lr3,lr3,4
103         multiplu gr117,gr116,lr5
104         multmu  gr118,gr116,lr5
105         add     lr2,lr2,4
106         load    0,0,gr119,lr2
107         add     gr117,gr117,gr120
108         addc    gr118,gr118,0
109         sub     gr119,gr119,gr117
110         add     gr104,gr119,gr117       ; invert carry from previus sub
111         store   0,0,gr119,lr2
112         jmpfdec lr4,Loop2
113          addc   gr120,gr118,0
114
115 Lend:   jmpi    lr0
116          or     gr96,gr120,0            ; copy