Annotation of OpenXM_contrib/gmp/mpn/sparc32/v8/mul_1.S, Revision 1.1.1.1
1.1 maekawa 1: ! SPARC v8 __mpn_mul_1 -- Multiply a limb vector with a single limb and
2: ! store the product in a second limb vector.
3:
4: ! Copyright (C) 1992, 1994, 1995 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 Library General Public License as published by
10: ! the Free Software Foundation; either version 2 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 Library General Public
16: ! License for more details.
17:
18: ! You should have received a copy of the GNU Library 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 o0
26: ! s1_ptr o1
27: ! size o2
28: ! s2_limb o3
29:
30: #include "sysdep.h"
31:
32: .text
33: .align 8
34: .global C_SYMBOL_NAME(__mpn_mul_1)
35: C_SYMBOL_NAME(__mpn_mul_1):
36: sll %o2,4,%g1
37: and %g1,(4-1)<<4,%g1
38: #if PIC
39: mov %o7,%g4 ! Save return address register
40: call 1f
41: add %o7,LL-1f,%g3
42: 1: mov %g4,%o7 ! Restore return address register
43: #else
44: sethi %hi(LL),%g3
45: or %g3,%lo(LL),%g3
46: #endif
47: jmp %g3+%g1
48: ld [%o1+0],%o4 ! 1
49: LL:
50: LL00: add %o0,-4,%o0
51: add %o1,-4,%o1
52: b Loop00 /* 4, 8, 12, ... */
53: orcc %g0,%g0,%g2
54: LL01: b Loop01 /* 1, 5, 9, ... */
55: orcc %g0,%g0,%g2
56: nop
57: nop
58: LL10: add %o0,-12,%o0 /* 2, 6, 10, ... */
59: add %o1,4,%o1
60: b Loop10
61: orcc %g0,%g0,%g2
62: nop
63: LL11: add %o0,-8,%o0 /* 3, 7, 11, ... */
64: add %o1,-8,%o1
65: b Loop11
66: orcc %g0,%g0,%g2
67:
68: Loop: addcc %g3,%g2,%g3 ! 1
69: ld [%o1+4],%o4 ! 2
70: st %g3,[%o0+0] ! 1
71: rd %y,%g2 ! 1
72: Loop00: umul %o4,%o3,%g3 ! 2
73: addxcc %g3,%g2,%g3 ! 2
74: ld [%o1+8],%o4 ! 3
75: st %g3,[%o0+4] ! 2
76: rd %y,%g2 ! 2
77: Loop11: umul %o4,%o3,%g3 ! 3
78: addxcc %g3,%g2,%g3 ! 3
79: ld [%o1+12],%o4 ! 4
80: add %o1,16,%o1
81: st %g3,[%o0+8] ! 3
82: rd %y,%g2 ! 3
83: Loop10: umul %o4,%o3,%g3 ! 4
84: addxcc %g3,%g2,%g3 ! 4
85: ld [%o1+0],%o4 ! 1
86: st %g3,[%o0+12] ! 4
87: add %o0,16,%o0
88: rd %y,%g2 ! 4
89: addx %g0,%g2,%g2
90: Loop01: addcc %o2,-4,%o2
91: bg Loop
92: umul %o4,%o3,%g3 ! 1
93:
94: addcc %g3,%g2,%g3 ! 4
95: st %g3,[%o0+0] ! 4
96: rd %y,%g2 ! 4
97:
98: retl
99: addx %g0,%g2,%o0
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>