1dnl  S/390 mpn_addmul_1 -- Multiply a limb vector with a limb and add the
2dnl  result to a second limb vector.
3
4dnl  Copyright 2001 Free Software Foundation, Inc.
5
6dnl  This file is part of the GNU MP Library.
7
8dnl  The GNU MP Library is free software; you can redistribute it and/or modify
9dnl  it under the terms of the GNU Lesser General Public License as published
10dnl  by the Free Software Foundation; either version 3 of the License, or (at
11dnl  your option) any later version.
12
13dnl  The GNU MP Library is distributed in the hope that it will be useful, but
14dnl  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15dnl  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
16dnl  License for more details.
17
18dnl  You should have received a copy of the GNU Lesser General Public License
19dnl  along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.
20
21include(`../config.m4')
22
23define(`rp',2)
24define(`up',3)
25define(`n',4)
26define(`vlimb',5)
27define(`cylimb',7)
28
29ASM_START()
30PROLOGUE(mpn_addmul_1)
31	stm	6,7,24(15)
32	slr	cylimb,cylimb	# clear cylimb
33	ltr	vlimb,vlimb
34	jnl	.Loopp
35
36.Loopn:	l	1,0(up)		# load from u
37	lr	6,1		#
38	mr	0,vlimb		# multiply signed
39	alr	0,6		# add vlimb to phi
40	sra	6,31		# make mask
41	nr	6,vlimb		# 0 or vlimb
42	alr	0,6		# conditionally add vlimb to phi
43	alr	1,cylimb	# add carry limb to plo
44	brc	8+4,+8		# branch if not carry
45	ahi	0,1		# increment phi
46	l	6,0(rp)		# load r limb
47	alr	6,1		# add u limb to plo
48	brc	8+4,+8		# branch if not carry
49	ahi	0,1		# increment phi
50	lr	cylimb,0	# new cylimb
51	st	6,0(rp)		# store
52	la	up,4(,up)
53	la	rp,4(,rp)
54	brct	n,.Loopn
55
56	lr	2,cylimb
57	lm	6,7,24(15)
58	br	14
59
60.Loopp:	l	1,0(up)		# load from u
61	lr	6,1		#
62	mr	0,vlimb		# multiply signed
63	sra	6,31		# make mask
64	nr	6,vlimb		# 0 or vlimb
65	alr	0,6		# conditionally add vlimb to phi
66	alr	1,cylimb	# add carry limb to plo
67	brc	8+4,+8		# branch if not carry
68	ahi	0,1		# increment phi
69	l	6,0(rp)		# load r limb
70	alr	6,1		# add u limb to plo
71	brc	8+4,+8		# branch if not carry
72	ahi	0,1		# increment phi
73	lr	cylimb,0	# new cylimb
74	st	6,0(rp)		# store
75	la	up,4(,up)
76	la	rp,4(,rp)
77	brct	n,.Loopp
78
79	lr	2,cylimb
80	lm	6,7,24(15)
81	br	14
82EPILOGUE(mpn_addmul_1)
83