xref: /netbsd-src/external/gpl3/gcc.old/dist/libgcc/config/rl78/mulsi3.S (revision 75f6d617e282811cb173c2ccfbf5df0dd71f7045)
1;   Copyright (C) 2011-2013 Free Software Foundation, Inc.
2;   Contributed by Red Hat.
3;
4; This file is free software; you can redistribute it and/or modify it
5; under the terms of the GNU General Public License as published by the
6; Free Software Foundation; either version 3, or (at your option) any
7; later version.
8;
9; This file is distributed in the hope that it will be useful, but
10; WITHOUT ANY WARRANTY; without even the implied warranty of
11; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12; General Public License for more details.
13;
14; Under Section 7 of GPL version 3, you are granted additional
15; permissions described in the GCC Runtime Library Exception, version
16; 3.1, as published by the Free Software Foundation.
17;
18; You should have received a copy of the GNU General Public License and
19; a copy of the GCC Runtime Library Exception along with this program;
20; see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
21; <http://www.gnu.org/licenses/>.
22
23;; 32x32=32 multiply
24
25; real
26; GAS defines r0..r7 as aliases for real registers; we want the saddr
27; forms here.
28r_0	=	0xffef8
29r_1	=	0xffef9
30r_2	=	0xffefa
31r_3	=	0xffefb
32r_4	=	0xffefc
33r_5	=	0xffefd
34r_6	=	0xffefe
35r_7	=	0xffeff
36; clobberable
37r8	=	0xffef0
38r9	=	0xffef1
39r10	=	0xffef2
40r11	=	0xffef3
41r12	=	0xffef4
42r13	=	0xffef5
43r14	=	0xffef6
44r15	=	0xffef7
45; preserved
46r16	=	0xffee8
47r17	=	0xffee9
48r18	=	0xffeea
49r19	=	0xffeeb
50r20	=	0xffeec
51r21	=	0xffeed
52r22	=	0xffeee
53r23	=	0xffeef
54
55
56;----------------------------------------------------------------------
57
58; Register use:
59;	RB0	RB1	RB2
60; AX	op2L	res32L	res32H
61; BC	op2H	(resH)	op1
62; DE	count	(resL-tmp)
63; HL	[sp+4]
64
65	.text
66	nop
67	.global	___mulsi3		; (USI a, USI b)
68___mulsi3:
69	;; A is at [sp+4]
70	;; B is at [sp+8]
71	;; result is in R8..R11
72
73	movw	ax, sp
74	addw	ax, #4
75	movw	hl, ax
76
77	sel	rb2
78	push	ax
79	push	bc
80	sel	rb0
81
82	clrw	ax
83	movw	r8, ax
84	movw	r16, ax
85
86	movw	ax, [hl+6]
87	cmpw	ax, #0
88	bz	$1f
89	cmpw	ax, #0xffff
90	bnz	$2f
91	movw	ax, [hl]
92	sel	rb1
93	subw	ax, r_0
94	sel	rb0
95	br	$1f
962:
97	movw	bc, ax
98	movw	ax, [hl]
99	cmpw	ax, #0
100	skz
101	call	!.Lmul_hi
1021:
103
104	movw	ax, [hl+2]
105	cmpw	ax, #0
106	bz	$1f
107	cmpw	ax, #0xffff
108	bnz	$2f
109	movw	ax, [hl+4]
110	sel	rb1
111	subw	ax, r_0
112	sel	rb0
113	br	$1f
1142:
115	movw	bc, ax
116	movw	ax, [hl+4]
117	cmpw	ax, #0
118	skz
119	call	!.Lmul_hi
1201:
121
122	movw	ax, r8
123	movw	r16, ax
124	clrw	ax
125	movw	r8, ax
126
127	;; now do R16:R8 += op1L * op2L
128
129	;; op1 is in AX.0 (needs to shrw)
130	;; op2 is in BC.2 and BC.1 (bc can shlw/rolcw)
131	;; res is in AX.2 and AX.1 (needs to addw)
132
133	movw	ax, [hl]
134	movw	r10, ax		; BC.1
135	movw	ax, [hl+4]
136
137	cmpw	ax, r10
138	bc	$.Lmul_hisi_top
139	movw	bc, r10
140	movw	r10, ax
141	movw	ax, bc
142
143
144.Lmul_hisi_top:
145	movw	bc, #0
146
147.Lmul_hisi_loop:
148	shrw	ax, 1
149	bnc	$.Lmul_hisi_no_add
150	sel	rb1
151	addw	ax, bc
152	sel	rb2
153	sknc
154	incw	ax
155	addw	ax, r_2
156.Lmul_hisi_no_add:
157	sel	rb1
158	shlw	bc, 1
159	sel	rb0
160	rolwc	bc, 1
161	cmpw	ax, #0
162	bz	$.Lmul_hisi_done
163
164	shrw	ax, 1
165	bnc	$.Lmul_hisi_no_add2
166	sel	rb1
167	addw	ax, bc
168	sel	rb2
169	sknc
170	incw	ax
171	addw	ax, r_2
172.Lmul_hisi_no_add2:
173	sel	rb1
174	shlw	bc, 1
175	sel	rb0
176	rolwc	bc, 1
177	cmpw	ax, #0
178	bnz	$.Lmul_hisi_loop
179
180.Lmul_hisi_done:
181
182	movw	ax, r16
183	movw	r10, ax
184
185	sel	rb2
186	pop	bc
187	pop	ax
188	sel	rb0
189
190	ret
191
192;----------------------------------------------------------------------
193
194	;; R8 += AX * BC
195.Lmul_hi:
196	cmpw	ax, bc
197	skc
198	xchw	ax, bc
199	br	$.Lmul_hi_loop
200
201.Lmul_hi_top:
202	sel	rb1
203	addw	ax, r_2
204	sel	rb0
205.Lmul_hi_no_add:
206	shlw	bc, 1
207.Lmul_hi_loop:
208	shrw	ax, 1
209	bc	$.Lmul_hi_top
210	cmpw	ax, #0
211	bz	$.Lmul_hi_done
212
213	shlw	bc, 1
214	shrw	ax, 1
215	bc	$.Lmul_hi_top
216	cmpw	ax, #0
217	bnz	$.Lmul_hi_no_add
218
219.Lmul_hi_done:
220	ret
221
222;----------------------------------------------------------------------
223
224	.global	___mulhi3
225___mulhi3:
226	sel	rb1
227	clrw	ax
228	sel	rb0
229	movw	ax, sp
230	addw	ax, #4
231	movw	hl, ax
232	movw	ax, [hl+2]
233	movw	bc, ax
234	movw	ax, [hl]
235	br	$.Lmul_hi
236