~ubuntu-branches/ubuntu/intrepid/ecl/intrepid

« back to all changes in this revision

Viewing changes to src/gmp/mpn/arm/submul_1.asm

  • Committer: Bazaar Package Importer
  • Author(s): Peter Van Eynde
  • Date: 2007-04-09 11:51:51 UTC
  • mfrom: (1.1.3 upstream)
  • Revision ID: james.westby@ubuntu.com-20070409115151-ql8cr0kalzx1jmla
Tags: 0.9i-20070324-2
Upload to unstable. 

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
dnl  ARM mpn_submul_1 -- Multiply a limb vector with a limb and subtract the
2
2
dnl  result from a second limb vector.
3
 
dnl  Based on mpn_addmul_1, which was contributed by Robert Harley.
4
3
 
5
 
dnl  Copyright 1998, 2000, 2001 Free Software Foundation, Inc.
 
4
dnl  Copyright 1998, 2000, 2001, 2003 Free Software Foundation, Inc.
6
5
 
7
6
dnl  This file is part of the GNU MP Library.
8
7
 
17
16
dnl  License for more details.
18
17
 
19
18
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.
 
19
dnl  along with the GNU MP Library; see the file COPYING.LIB.  If not, write
 
20
dnl  to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 
21
dnl  Boston, MA 02110-1301, USA.
23
22
 
24
23
include(`../config.m4')
25
24
 
26
 
C This runs at 9.75 cycles/limb in the StrongARM.
27
 
 
28
 
C Could use some register cleanup.  Some fewer registers might be needed, or
29
 
C r11 could be utilized for better speed.  Could avoid saving all registers for
30
 
C small (n <= 3) operands.
 
25
C            cycles/limb
 
26
C StrongARM:  7.75-9.75  (dependent on vl value)
 
27
C XScale:        8-9     (dependent on vl value, estimated)
31
28
 
32
29
define(`rp',`r0')
33
30
define(`up',`r1')
34
31
define(`n',`r2')
35
 
define(`v',`r3')
 
32
define(`vl',`r3')
 
33
define(`rl',`r12')
 
34
define(`ul',`r6')
 
35
define(`r',`lr')
 
36
 
36
37
 
37
38
ASM_START()
38
39
PROLOGUE(mpn_submul_1)
39
 
        stmfd   sp!, { r4-r10, lr }
40
 
        mov     r4, #0
41
 
        movs    n, n, lsr #1
42
 
        bcc     L(skip1)
43
 
        ldr     lr, [up], #4
44
 
        umull   r4, r12, v, lr
45
 
        ldr     r6, [rp]
46
 
        subs    r6, r6, r4
47
 
        sbc     r4, r0, r0
48
 
        sub     r4, r12, r4
49
 
        str     r6, [rp], #4
 
40
        stmfd   sp!, { r4-r6, lr }
 
41
        subs    r4, r0, r0              C clear r4, set cy
 
42
        tst     n, #1
 
43
        beq     L(skip1)
 
44
        ldr     ul, [up], #4
 
45
        ldr     rl, [rp, #0]
 
46
        umull   r5, r4, ul, vl
 
47
        subs    r, rl, r5
 
48
        str     r, [rp], #4
50
49
L(skip1):
51
 
        movs    n, n, lsr #1
52
 
        bcc     L(skip2)
53
 
        ldmia   up!, { r9, r10 }
 
50
        tst     n, #2
 
51
        beq     L(skip2)
 
52
        ldr     ul, [up], #4
 
53
        ldr     rl, [rp, #0]
54
54
        mov     r5, #0
55
 
        umlal   r4, r5, v, r9
56
 
        mov     r9, #0
57
 
        umlal   r5, r9, v, r10
58
 
        ldmia   rp, { r6, r7 }
59
 
        subs    r6, r6, r4
60
 
        sbcs    r7, r7, r5
61
 
        sbc     r4, r0, r0
62
 
        sub     r4, r9, r4
63
 
        stmia   rp!, { r6, r7 }
 
55
        umlal   r4, r5, ul, vl
 
56
        ldr     ul, [up], #4
 
57
        sbcs    r, rl, r4
 
58
        ldr     rl, [rp, #4]
 
59
        mov     r4, #0
 
60
        umlal   r5, r4, ul, vl
 
61
        str     r, [rp], #4
 
62
        sbcs    r, rl, r5
 
63
        str     r, [rp], #4
64
64
L(skip2):
65
 
        teq     n, #0
 
65
        bics    r, n, #3
66
66
        beq     L(return)
67
67
 
68
 
L(submul_loop):
69
 
        ldmia   up!, { r9, r10, r12, lr }
70
 
        mov     r5, #0
71
 
        umlal   r4, r5, v, r9
72
 
        mov     r9, #0
73
 
        umlal   r5, r9, v, r10
74
 
        mov     r10, #0
75
 
        umlal   r9, r10, v, r12
76
 
        mov     r12, #0
77
 
        umlal   r10, r12, v, lr
78
 
        ldmia   rp, { r6, r7, r8, lr }
79
 
        subs    r6, r6, r4
80
 
        sbcs    r7, r7, r5
81
 
        sbcs    r8, r8, r9
82
 
        sbcs    lr, lr, r10
83
 
        sbc     r4, r0, r0
84
 
        sub     r4, r12, r4
85
 
        subs    n, n, #1
86
 
        stmia   rp!, { r6, r7, r8, lr }
87
 
        bne     L(submul_loop)
 
68
        ldr     ul, [up], #4
 
69
        ldr     rl, [rp, #0]
 
70
        mov     r5, #0
 
71
        umlal   r4, r5, ul, vl
 
72
        b       L(in)
 
73
 
 
74
L(loop):
 
75
        ldr     ul, [up], #4
 
76
        sbcs    r, rl, r5
 
77
        ldr     rl, [rp, #4]
 
78
        mov     r5, #0
 
79
        umlal   r4, r5, ul, vl
 
80
        str     r, [rp], #4
 
81
L(in):  ldr     ul, [up], #4
 
82
        sbcs    r, rl, r4
 
83
        ldr     rl, [rp, #4]
 
84
        mov     r4, #0
 
85
        umlal   r5, r4, ul, vl
 
86
        str     r, [rp], #4
 
87
        ldr     ul, [up], #4
 
88
        sbcs    r, rl, r5
 
89
        ldr     rl, [rp, #4]
 
90
        mov     r5, #0
 
91
        umlal   r4, r5, ul, vl
 
92
        str     r, [rp], #4
 
93
        ldr     ul, [up], #4
 
94
        sbcs    r, rl, r4
 
95
        ldr     rl, [rp, #4]
 
96
        mov     r4, #0
 
97
        umlal   r5, r4, ul, vl
 
98
        str     r, [rp], #4
 
99
        sub     n, n, #4
 
100
        bics    r, n, #3
 
101
        bne     L(loop)
 
102
 
 
103
        sbcs    r, rl, r5
 
104
        str     r, [rp], #4
88
105
L(return):
89
 
        mov     r0, r4
90
 
        ldmfd   sp!, { r4-r10, pc }
 
106
        sbc     r0, r0, r0
 
107
        sub     r0, r4, r0
 
108
        ldmfd   sp!, { r4-r6, pc }
91
109
EPILOGUE(mpn_submul_1)