1# VAX __gmpn_mul_1 -- Multiply a limb vector with a limb and store
2# the result in a second limb vector.
3
4# Copyright 1992, 1994, 1996, 2000 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 Lesser General Public License as published by
10# the Free Software Foundation; either version 3 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.  If not, see http://www.gnu.org/licenses/.
20
21
22# INPUT PARAMETERS
23# res_ptr	(sp + 4)
24# s1_ptr	(sp + 8)
25# size		(sp + 12)
26# s2_limb	(sp + 16)
27
28.text
29	.align 1
30.globl ___gmpn_mul_1
31___gmpn_mul_1:
32	.word	0xfc0
33	movl	12(ap),r4
34	movl	8(ap),r8
35	movl	4(ap),r9
36	movl	16(ap),r6
37	jlss	s2_big
38
39# One might want to combine the addl2 and the store below, but that
40# is actually just slower according to my timing tests.  (VAX 3600)
41
42	clrl	r3
43	incl	r4
44	ashl	$-1,r4,r7
45	jlbc	r4,L1
46	clrl	r11
47
48# Loop for S2_LIMB < 0x80000000
49Loop1:	movl	(r8)+,r1
50	jlss	L1n0
51	emul	r1,r6,$0,r2
52	addl2	r11,r2
53	adwc	$0,r3
54	movl	r2,(r9)+
55L1:	movl	(r8)+,r1
56	jlss	L1n1
57L1p1:	emul	r1,r6,$0,r10
58	addl2	r3,r10
59	adwc	$0,r11
60	movl	r10,(r9)+
61
62	sobgtr	r7,Loop1
63	movl	r11,r0
64	ret
65
66L1n0:	emul	r1,r6,$0,r2
67	addl2	r11,r2
68	adwc	r6,r3
69	movl	r2,(r9)+
70	movl	(r8)+,r1
71	jgeq	L1p1
72L1n1:	emul	r1,r6,$0,r10
73	addl2	r3,r10
74	adwc	r6,r11
75	movl	r10,(r9)+
76
77	sobgtr	r7,Loop1
78	movl	r11,r0
79	ret
80
81
82s2_big:	clrl	r3
83	incl	r4
84	ashl	$-1,r4,r7
85	jlbc	r4,L2
86	clrl	r11
87
88# Loop for S2_LIMB >= 0x80000000
89Loop2:	movl	(r8)+,r1
90	jlss	L2n0
91	emul	r1,r6,$0,r2
92	addl2	r11,r2
93	adwc	r1,r3
94	movl	r2,(r9)+
95L2:	movl	(r8)+,r1
96	jlss	L2n1
97L2p1:	emul	r1,r6,$0,r10
98	addl2	r3,r10
99	adwc	r1,r11
100	movl	r10,(r9)+
101
102	sobgtr	r7,Loop2
103	movl	r11,r0
104	ret
105
106L2n0:	emul	r1,r6,$0,r2
107	addl2	r1,r3
108	addl2	r11,r2
109	adwc	r6,r3
110	movl	r2,(r9)+
111	movl	(r8)+,r1
112	jgeq	L2p1
113L2n1:	emul	r1,r6,$0,r10
114	addl2	r1,r11
115	addl2	r3,r10
116	adwc	r6,r11
117	movl	r10,(r9)+
118
119	sobgtr	r7,Loop2
120	movl	r11,r0
121	ret
122