FIX BUILD (with GHC 6.2.x): System.Directory.Internals is no more
[ghc-hetmet.git] / rts / gmp / mpn / powerpc64 / sub_n.asm
1 # PowerPC-64 mpn_sub_n -- Subtract two limb vectors of the same length > 0
2 # and store difference in a third limb vector.
3
4 # Copyright (C) 1999, 2000 Free Software Foundation, Inc.b
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       r3
26 # s1_ptr        r4
27 # s2_ptr        r5
28 # size          r6
29
30 include(`../config.m4')
31
32 ASM_START()
33 PROLOGUE(mpn_sub_n)
34         mtctr   r6              # copy size into CTR
35         addic   r0,r6,-1        # set cy
36         ld      r8,0(r4)        # load least significant s1 limb
37         ld      r0,0(r5)        # load least significant s2 limb
38         addi    r3,r3,-8        # offset res_ptr, it's updated before it's used
39         bdz     .Lend           # If done, skip loop
40 .Loop:  ld      r9,8(r4)        # load s1 limb
41         ld      r10,8(r5)       # load s2 limb
42         subfe   r7,r0,r8        # subtract limbs with cy, set cy
43         std     r7,8(r3)        # store result limb
44         bdz     .Lexit          # decrement CTR and exit if done
45         ldu     r8,16(r4)       # load s1 limb and update s1_ptr
46         ldu     r0,16(r5)       # load s2 limb and update s2_ptr
47         subfe   r7,r10,r9       # subtract limbs with cy, set cy
48         stdu    r7,16(r3)       # store result limb and update res_ptr
49         bdnz    .Loop           # decrement CTR and loop back
50
51 .Lend:  subfe   r7,r0,r8
52         std     r7,8(r3)        # store ultimate result limb
53         subfe   r3,r0,r0        # load !cy into ...
54         subfic  r3,r3,0         # ... return value register
55         blr
56 .Lexit: subfe   r7,r10,r9
57         std     r7,16(r3)
58         subfe   r3,r0,r0        # load !cy into ...
59         subfic  r3,r3,0         # ... return value register
60         blr
61 EPILOGUE(mpn_sub_n)