FIX BUILD (with GHC 6.2.x): System.Directory.Internals is no more
[ghc-hetmet.git] / rts / gmp / mpn / pa64w / umul_ppmm.S
1 ; Copyright (C) 1999, 2000 Free Software Foundation, Inc.
2
3 ; This file is part of the GNU MP Library.
4
5 ; The GNU MP Library is free software; you can redistribute it and/or modify
6 ; it under the terms of the GNU Lesser General Public License as published by
7 ; the Free Software Foundation; either version 2.1 of the License, or (at your
8 ; option) any later version.
9
10 ; The GNU MP Library is distributed in the hope that it will be useful, but
11 ; WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12 ; or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
13 ; License for more details.
14
15 ; You should have received a copy of the GNU Lesser General Public License
16 ; along with the GNU MP Library; see the file COPYING.LIB.  If not, write to
17 ; the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
18 ; MA 02111-1307, USA.
19
20 #define p0      %r28
21 #define p1      %r29
22 #define t32     %r19
23 #define t0      %r20
24 #define t1      %r21
25 #define x       %r22
26 #define m0      %r23
27 #define m1      %r24
28         .level  2.0w
29         .code
30         .export __gmpn_umul_ppmm,entry
31 __gmpn_umul_ppmm
32         .proc
33         .callinfo frame=128,no_calls
34         .entry
35         ldo             128(%r30),%r30
36         std             %r26,-64(%r30)
37         std             %r25,-56(%r30)
38
39         copy            %r24,%r31
40
41         fldd            -64(%r30),%fr4
42         fldd            -56(%r30),%fr5
43
44         xmpyu           %fr5R,%fr4R,%fr6
45         fstd            %fr6,-128(%r30)
46         xmpyu           %fr5R,%fr4L,%fr7
47         fstd            %fr7,-120(%r30)
48         xmpyu           %fr5L,%fr4R,%fr8
49         fstd            %fr8,-112(%r30)
50         xmpyu           %fr5L,%fr4L,%fr9
51         fstd            %fr9,-104(%r30)
52
53         depdi,z         1,31,1,t32              ; t32 = 2^32
54
55         ldd             -128(%r30),p0           ; lo = low 64 bit of product
56         ldd             -120(%r30),m0           ; m0 = mid0 64 bit of product
57         ldd             -112(%r30),m1           ; m1 = mid1 64 bit of product
58         ldd             -104(%r30),p1           ; hi = high 64 bit of product
59
60         add,l,*nuv      m0,m1,x                 ; x = m1+m0
61          add,l          t32,p1,p1               ; propagate carry to mid of p1
62         depd,z          x,31,32,t0              ; lo32(m1+m0)
63         add             t0,p0,p0
64         extrd,u         x,31,32,t1              ; hi32(m1+m0)
65         add,dc          t1,p1,p1
66
67         std             p0,0(%r31)              ; store low half of product
68         copy            p1,%r28                 ; return high half of product
69         bve             (%r2)
70         .exit
71         ldo             -128(%r30),%r30
72         .procend