~ubuntu-branches/ubuntu/quantal/gclcvs/quantal

« back to all changes in this revision

Viewing changes to gmp3/mpn/pa64/submul_1.S

  • Committer: Bazaar Package Importer
  • Author(s): Camm Maguire
  • Date: 2004-06-24 15:13:46 UTC
  • Revision ID: james.westby@ubuntu.com-20040624151346-xh0xaaktyyp7aorc
Tags: 2.7.0-26
C_GC_OFFSET is 2 on m68k-linux

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
; HP-PA 2.0 64-bit __gmpn_submul_1 -- Multiply a limb vector with a limb and
 
2
; subtract the result from a second limb vector.
 
3
 
 
4
; Copyright 1998, 1999, 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
; INPUT PARAMETERS
 
24
#define rptr            %r26
 
25
#define sptr            %r25
 
26
#define size            %r24
 
27
#define s2limb          -56(%r30)
 
28
 
 
29
; This runs at 11 cycles/limb on a PA8000.  It might be possible to make
 
30
; it faster, but the PA8000 pipeline is not publically documented and it
 
31
; is very complex to reverse engineer
 
32
 
 
33
#define t1 %r19
 
34
#define rlimb %r20
 
35
#define hi %r21
 
36
#define lo %r22
 
37
#define m0 %r28
 
38
#define m1 %r3
 
39
#define cylimb %r29
 
40
#define t3 %r4
 
41
#define t2 %r6
 
42
#define t5 %r23
 
43
#define t4 %r31
 
44
        .level  2.0n
 
45
        .code
 
46
        .export __gmpn_submul_1,entry
 
47
__gmpn_submul_1
 
48
        .proc
 
49
        .callinfo frame=128,no_calls
 
50
        .entry
 
51
        fldd            -56(%r30),%fr5          ; s2limb passed on stack
 
52
        ldo             128(%r30),%r30
 
53
        add             %r0,%r0,cylimb          ; clear cy and cylimb
 
54
 
 
55
        std             %r3,-96(%r30)
 
56
        std             %r4,-88(%r30)
 
57
        std             %r5,-80(%r30)
 
58
        std             %r6,-72(%r30)
 
59
        depdi,z         1,31,1,%r5
 
60
 
 
61
        fldd            0(sptr),%fr4
 
62
        ldo             8(sptr),sptr
 
63
 
 
64
        xmpyu           %fr5R,%fr4R,%fr6
 
65
        fstd            %fr6,-128(%r30)
 
66
        xmpyu           %fr5R,%fr4L,%fr7
 
67
        fstd            %fr7,-120(%r30)
 
68
        xmpyu           %fr5L,%fr4R,%fr8
 
69
        fstd            %fr8,-112(%r30)
 
70
        xmpyu           %fr5L,%fr4L,%fr9
 
71
        fstd            %fr9,-104(%r30)
 
72
        ldd             -128(%r30),lo           ; lo = low 64 bit of product
 
73
        ldd             -120(%r30),m0           ; m0 = mid0 64 bit of product
 
74
        ldd             -112(%r30),m1           ; m1 = mid1 64 bit of product
 
75
        ldd             -104(%r30),hi           ; hi = high 64 bit of product
 
76
        addib,=         -1,%r24,L$end1
 
77
        nop
 
78
        fldd            0(sptr),%fr4
 
79
        ldo             8(sptr),sptr
 
80
        addib,=         -1,%r24,L$end2
 
81
        nop
 
82
L$loop
 
83
        xmpyu           %fr5R,%fr4R,%fr6
 
84
        fstd            %fr6,-128(%r30)
 
85
        xmpyu           %fr5R,%fr4L,%fr7
 
86
        fstd            %fr7,-120(%r30)
 
87
        xmpyu           %fr5L,%fr4R,%fr8
 
88
        fstd            %fr8,-112(%r30)
 
89
        xmpyu           %fr5L,%fr4L,%fr9
 
90
        fstd            %fr9,-104(%r30)
 
91
        ldd             0(rptr),rlimb
 
92
        extrd,u         lo,31,32,t1             ; t1 = hi32(lo)
 
93
        extrd,u         lo,63,32,t4             ; t4 = lo32(lo)
 
94
        add,l           m0,t1,t1                ; t1 += m0
 
95
        add,l,*nuv      m1,t1,t1                ; t1 += m1
 
96
         add,l          %r5,hi,hi               ; propagate carry
 
97
        extrd,u         t1,31,32,t2             ; t2 = hi32(t1)
 
98
        depd,z          t1,31,32,t5             ; t5 = lo32(t1)
 
99
        add,l           t5,t4,t4                ; t4 += lo32(t1)
 
100
        ldd             -128(%r30),lo           ; lo = low 64 bit of product
 
101
        add             cylimb,t4,t4
 
102
        ldd             -120(%r30),m0           ; m0 = mid0 64 bit of product
 
103
        add,dc          t2,hi,cylimb
 
104
        ldd             -112(%r30),m1           ; m1 = mid1 64 bit of product
 
105
        sub             rlimb,t4,t3
 
106
        add             t4,t3,%r0
 
107
        ldd             -104(%r30),hi           ; hi = high 64 bit of product
 
108
        add,dc          %r0,cylimb,cylimb
 
109
        fldd            0(sptr),%fr4
 
110
        ldo             8(sptr),sptr
 
111
        std             t3,0(rptr)
 
112
        addib,<>        -1,%r24,L$loop
 
113
        ldo             8(rptr),rptr
 
114
L$end2
 
115
        xmpyu           %fr5R,%fr4R,%fr6
 
116
        fstd            %fr6,-128(%r30)
 
117
        xmpyu           %fr5R,%fr4L,%fr7
 
118
        fstd            %fr7,-120(%r30)
 
119
        xmpyu           %fr5L,%fr4R,%fr8
 
120
        fstd            %fr8,-112(%r30)
 
121
        xmpyu           %fr5L,%fr4L,%fr9
 
122
        fstd            %fr9,-104(%r30)
 
123
        ldd             0(rptr),rlimb
 
124
        extrd,u         lo,31,32,t1             ; t1 = hi32(lo)
 
125
        extrd,u         lo,63,32,t4             ; t4 = lo32(lo)
 
126
        add,l           m0,t1,t1                ; t1 += m0
 
127
        add,l,*nuv      m1,t1,t1                ; t1 += m0
 
128
         add,l          %r5,hi,hi               ; propagate carry
 
129
        extrd,u         t1,31,32,t2             ; t2 = hi32(t1)
 
130
        depd,z          t1,31,32,t5             ; t5 = lo32(t1)
 
131
        add,l           t5,t4,t4                ; t4 += lo32(t1)
 
132
        ldd             -128(%r30),lo           ; lo = low 64 bit of product
 
133
        add             cylimb,t4,t4
 
134
        ldd             -120(%r30),m0           ; m0 = mid0 64 bit of product
 
135
        add,dc          t2,hi,cylimb
 
136
        ldd             -112(%r30),m1           ; m1 = mid1 64 bit of product
 
137
        sub             rlimb,t4,t3
 
138
        add             t4,t3,%r0
 
139
        ldd             -104(%r30),hi           ; hi = high 64 bit of product
 
140
        add,dc          %r0,cylimb,cylimb
 
141
        std             t3,0(rptr)
 
142
        ldo             8(rptr),rptr
 
143
L$end1
 
144
        ldd             0(rptr),rlimb
 
145
        extrd,u         lo,31,32,t1             ; t1 = hi32(lo)
 
146
        extrd,u         lo,63,32,t4             ; t4 = lo32(lo)
 
147
        add,l           m0,t1,t1                ; t1 += m0
 
148
        add,l,*nuv      m1,t1,t1                ; t1 += m0
 
149
         add,l          %r5,hi,hi               ; propagate carry
 
150
        extrd,u         t1,31,32,t2             ; t2 = hi32(t1)
 
151
        depd,z          t1,31,32,t5             ; t5 = lo32(t1)
 
152
        add,l           t5,t4,t4                ; t4 += lo32(t1)
 
153
        add             cylimb,t4,t4
 
154
        add,dc          t2,hi,cylimb
 
155
        sub             rlimb,t4,t3
 
156
        add             t4,t3,%r0
 
157
        add,dc          %r0,cylimb,cylimb
 
158
        std             t3,0(rptr)
 
159
        ldo             8(rptr),rptr
 
160
 
 
161
        ldd             -96(%r30),%r3
 
162
        ldd             -88(%r30),%r4
 
163
        ldd             -80(%r30),%r5
 
164
        ldd             -72(%r30),%r6
 
165
 
 
166
        extrd,u         cylimb,31,32,%r28
 
167
        bve             (%r2)
 
168
        .exit
 
169
        ldo             -128(%r30),%r30
 
170
        .procend