remove empty dir
[ghc-hetmet.git] / rts / gmp / mpn / alpha / mul_1.asm
1 dnl  Alpha __gmpn_mul_1 -- Multiply a limb vector with a limb and store
2 dnl  the result in a second limb vector.
3
4 dnl  Copyright (C) 1992, 1994, 1995, 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 include(`../config.m4')
24
25 dnl  INPUT PARAMETERS
26 dnl  res_ptr    r16
27 dnl  s1_ptr     r17
28 dnl  size       r18
29 dnl  s2_limb    r19
30
31 dnl  This code runs at 42 cycles/limb on EV4, 18 cycles/limb on EV5, and 7
32 dnl  cycles/limb on EV6.
33
34 ASM_START()
35 PROLOGUE(mpn_mul_1)
36         ldq     r2,0(r17)       C r2 = s1_limb
37         subq    r18,1,r18       C size--
38         mulq    r2,r19,r3       C r3 = prod_low
39         bic     r31,r31,r4      C clear cy_limb
40         umulh   r2,r19,r0       C r0 = prod_high
41         beq     r18,$Lend1      C jump if size was == 1
42         ldq     r2,8(r17)       C r2 = s1_limb
43         subq    r18,1,r18       C size--
44         stq     r3,0(r16)
45         beq     r18,$Lend2      C jump if size was == 2
46
47         ALIGN(8)
48 $Loop:  mulq    r2,r19,r3       C r3 = prod_low
49         addq    r4,r0,r0        C cy_limb = cy_limb + 'cy'
50         subq    r18,1,r18       C size--
51         umulh   r2,r19,r4       C r4 = cy_limb
52         ldq     r2,16(r17)      C r2 = s1_limb
53         addq    r17,8,r17       C s1_ptr++
54         addq    r3,r0,r3        C r3 = cy_limb + prod_low
55         stq     r3,8(r16)
56         cmpult  r3,r0,r0        C r0 = carry from (cy_limb + prod_low)
57         addq    r16,8,r16       C res_ptr++
58         bne     r18,$Loop
59
60 $Lend2: mulq    r2,r19,r3       C r3 = prod_low
61         addq    r4,r0,r0        C cy_limb = cy_limb + 'cy'
62         umulh   r2,r19,r4       C r4 = cy_limb
63         addq    r3,r0,r3        C r3 = cy_limb + prod_low
64         cmpult  r3,r0,r0        C r0 = carry from (cy_limb + prod_low)
65         stq     r3,8(r16)
66         addq    r4,r0,r0        C cy_limb = prod_high + cy
67         ret     r31,(r26),1
68 $Lend1: stq     r3,0(r16)
69         ret     r31,(r26),1
70 EPILOGUE(mpn_mul_1)
71 ASM_END()