Annotation of OpenXM_contrib/gmp/mpn/power/sub_n.asm, Revision 1.1.1.1
1.1 ohara 1: dnl IBM POWER mpn_sub_n -- Subtract two limb vectors of equal, non-zero
2: dnl length.
3:
4: dnl Copyright 1992, 1994, 1995, 1996, 1999, 2000, 2001 Free Software
5: dnl Foundation, Inc.
6:
7: dnl This file is part of the GNU MP Library.
8:
9: dnl The GNU MP Library is free software; you can redistribute it and/or modify
10: dnl it under the terms of the GNU Lesser General Public License as published
11: dnl by the Free Software Foundation; either version 2.1 of the License, or (at
12: dnl your option) any later version.
13:
14: dnl The GNU MP Library is distributed in the hope that it will be useful, but
15: dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16: dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
17: dnl License for more details.
18:
19: dnl You should have received a copy of the GNU Lesser General Public License
20: dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to
21: dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
22: dnl MA 02111-1307, USA.
23:
24:
25: dnl INPUT PARAMETERS
26: dnl res_ptr r3
27: dnl s1_ptr r4
28: dnl s2_ptr r5
29: dnl size r6
30:
31: include(`../config.m4')
32:
33: ASM_START()
34: PROLOGUE(mpn_sub_n)
35: andil. 10,6,1 C odd or even number of limbs?
36: l 8,0(4) C load least significant s1 limb
37: l 0,0(5) C load least significant s2 limb
38: cal 3,-4(3) C offset res_ptr, it's updated before it's used
39: sri 10,6,1 C count for unrolled loop
40: sf 7,0,8 C subtract least significant limbs, set cy
41: mtctr 10 C copy count into CTR
42: beq 0,Leven C branch if even C of limbs (C of limbs >= 2)
43:
44: C We have an odd C of limbs. Add the first limbs separately.
45: cmpi 1,10,0 C is count for unrolled loop zero?
46: bc 4,6,L1 C bne cr1,L1 (misassembled by gas)
47: st 7,4(3)
48: sfe 3,0,0 C load !cy into ...
49: sfi 3,3,0 C ... return value register
50: br C return
51:
52: C We added least significant limbs. Now reload the next limbs to enter loop.
53: L1: lu 8,4(4) C load s1 limb and update s1_ptr
54: lu 0,4(5) C load s2 limb and update s2_ptr
55: stu 7,4(3)
56: sfe 7,0,8 C subtract limbs, set cy
57: Leven: lu 9,4(4) C load s1 limb and update s1_ptr
58: lu 10,4(5) C load s2 limb and update s2_ptr
59: bdz Lend C If done, skip loop
60:
61: Loop: lu 8,4(4) C load s1 limb and update s1_ptr
62: lu 0,4(5) C load s2 limb and update s2_ptr
63: sfe 11,10,9 C subtract previous limbs with cy, set cy
64: stu 7,4(3) C
65: lu 9,4(4) C load s1 limb and update s1_ptr
66: lu 10,4(5) C load s2 limb and update s2_ptr
67: sfe 7,0,8 C subtract previous limbs with cy, set cy
68: stu 11,4(3) C
69: bdn Loop C decrement CTR and loop back
70:
71: Lend: sfe 11,10,9 C subtract limbs with cy, set cy
72: st 7,4(3) C
73: st 11,8(3) C
74: sfe 3,0,0 C load !cy into ...
75: sfi 3,3,0 C ... return value register
76: br
77: EPILOGUE(mpn_sub_n)
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>