xref: /OK3568_Linux_fs/kernel/arch/h8300/lib/mulsi3.S (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun; SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun;
3*4882a593Smuzhiyun; mulsi3 for H8/300H - based on Renesas SH implementation
4*4882a593Smuzhiyun;
5*4882a593Smuzhiyun; by Toshiyasu Morita
6*4882a593Smuzhiyun;
7*4882a593Smuzhiyun; Old code:
8*4882a593Smuzhiyun;
9*4882a593Smuzhiyun; 16b * 16b = 372 states (worst case)
10*4882a593Smuzhiyun; 32b * 32b = 724 states (worst case)
11*4882a593Smuzhiyun;
12*4882a593Smuzhiyun; New code:
13*4882a593Smuzhiyun;
14*4882a593Smuzhiyun; 16b * 16b =  48 states
15*4882a593Smuzhiyun; 16b * 32b =  72 states
16*4882a593Smuzhiyun; 32b * 32b =  92 states
17*4882a593Smuzhiyun;
18*4882a593Smuzhiyun
19*4882a593Smuzhiyun	.global __mulsi3
20*4882a593Smuzhiyun__mulsi3:
21*4882a593Smuzhiyun	mov.w	r1,r2   ; ( 2 states) b * d
22*4882a593Smuzhiyun	mulxu	r0,er2  ; (22 states)
23*4882a593Smuzhiyun
24*4882a593Smuzhiyun	mov.w	e0,r3   ; ( 2 states) a * d
25*4882a593Smuzhiyun	beq	L_skip1 ; ( 4 states)
26*4882a593Smuzhiyun	mulxu	r1,er3  ; (22 states)
27*4882a593Smuzhiyun	add.w	r3,e2   ; ( 2 states)
28*4882a593Smuzhiyun
29*4882a593SmuzhiyunL_skip1:
30*4882a593Smuzhiyun	mov.w	e1,r3   ; ( 2 states) c * b
31*4882a593Smuzhiyun	beq	L_skip2 ; ( 4 states)
32*4882a593Smuzhiyun	mulxu	r0,er3  ; (22 states)
33*4882a593Smuzhiyun	add.w	r3,e2   ; ( 2 states)
34*4882a593Smuzhiyun
35*4882a593SmuzhiyunL_skip2:
36*4882a593Smuzhiyun	mov.l	er2,er0	; ( 2 states)
37*4882a593Smuzhiyun	rts		; (10 states)
38*4882a593Smuzhiyun
39*4882a593Smuzhiyun	.end
40