xref: /plan9/sys/src/libc/sparc/vlop.s (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1*219b2ee8SDavid du ColombierTEXT	_mulv(SB), $0
2*219b2ee8SDavid du Colombier	MOVW	u1+8(FP), R8
3*219b2ee8SDavid du Colombier	MOVW	u2+16(FP), R13
4*219b2ee8SDavid du Colombier
5*219b2ee8SDavid du Colombier	MOVW	R13, R16		/* save low parts for later */
6*219b2ee8SDavid du Colombier	MOVW	R8, R12
7*219b2ee8SDavid du Colombier
8*219b2ee8SDavid du Colombier	/*
9*219b2ee8SDavid du Colombier	 * unsigned 32x32 => 64 multiply
10*219b2ee8SDavid du Colombier	 */
11*219b2ee8SDavid du Colombier	CMP	R13, R8
12*219b2ee8SDavid du Colombier	BLE	mul1
13*219b2ee8SDavid du Colombier	MOVW	R12, R13
14*219b2ee8SDavid du Colombier	MOVW	R16, R8
15*219b2ee8SDavid du Colombiermul1:
16*219b2ee8SDavid du Colombier	MOVW	R13, Y
17*219b2ee8SDavid du Colombier	ANDNCC	$0xFFF, R13, R0
18*219b2ee8SDavid du Colombier	BE	mul_shortway
19*219b2ee8SDavid du Colombier	ANDCC	R0, R0, R9		/* zero partial product and clear N and V cond's */
20*219b2ee8SDavid du Colombier
21*219b2ee8SDavid du Colombier	/* long multiply */
22*219b2ee8SDavid du Colombier	MULSCC	R8, R9, R9		/* 0 */
23*219b2ee8SDavid du Colombier	MULSCC	R8, R9, R9		/* 1 */
24*219b2ee8SDavid du Colombier	MULSCC	R8, R9, R9		/* 2 */
25*219b2ee8SDavid du Colombier	MULSCC	R8, R9, R9		/* 3 */
26*219b2ee8SDavid du Colombier	MULSCC	R8, R9, R9		/* 4 */
27*219b2ee8SDavid du Colombier	MULSCC	R8, R9, R9		/* 5 */
28*219b2ee8SDavid du Colombier	MULSCC	R8, R9, R9		/* 6 */
29*219b2ee8SDavid du Colombier	MULSCC	R8, R9, R9		/* 7 */
30*219b2ee8SDavid du Colombier	MULSCC	R8, R9, R9		/* 8 */
31*219b2ee8SDavid du Colombier	MULSCC	R8, R9, R9		/* 9 */
32*219b2ee8SDavid du Colombier	MULSCC	R8, R9, R9		/* 10 */
33*219b2ee8SDavid du Colombier	MULSCC	R8, R9, R9		/* 11 */
34*219b2ee8SDavid du Colombier	MULSCC	R8, R9, R9		/* 12 */
35*219b2ee8SDavid du Colombier	MULSCC	R8, R9, R9		/* 13 */
36*219b2ee8SDavid du Colombier	MULSCC	R8, R9, R9		/* 14 */
37*219b2ee8SDavid du Colombier	MULSCC	R8, R9, R9		/* 15 */
38*219b2ee8SDavid du Colombier	MULSCC	R8, R9, R9		/* 16 */
39*219b2ee8SDavid du Colombier	MULSCC	R8, R9, R9		/* 17 */
40*219b2ee8SDavid du Colombier	MULSCC	R8, R9, R9		/* 18 */
41*219b2ee8SDavid du Colombier	MULSCC	R8, R9, R9		/* 19 */
42*219b2ee8SDavid du Colombier	MULSCC	R8, R9, R9		/* 20 */
43*219b2ee8SDavid du Colombier	MULSCC	R8, R9, R9		/* 21 */
44*219b2ee8SDavid du Colombier	MULSCC	R8, R9, R9		/* 22 */
45*219b2ee8SDavid du Colombier	MULSCC	R8, R9, R9		/* 23 */
46*219b2ee8SDavid du Colombier	MULSCC	R8, R9, R9		/* 24 */
47*219b2ee8SDavid du Colombier	MULSCC	R8, R9, R9		/* 25 */
48*219b2ee8SDavid du Colombier	MULSCC	R8, R9, R9		/* 26 */
49*219b2ee8SDavid du Colombier	MULSCC	R8, R9, R9		/* 27 */
50*219b2ee8SDavid du Colombier	MULSCC	R8, R9, R9		/* 28 */
51*219b2ee8SDavid du Colombier	MULSCC	R8, R9, R9		/* 29 */
52*219b2ee8SDavid du Colombier	MULSCC	R8, R9, R9		/* 30 */
53*219b2ee8SDavid du Colombier	MULSCC	R8, R9, R9		/* 31 */
54*219b2ee8SDavid du Colombier	MULSCC	R0, R9, R9		/* 32; shift only; r9 is high part */
55*219b2ee8SDavid du Colombier
56*219b2ee8SDavid du Colombier	/*
57*219b2ee8SDavid du Colombier	 * need to correct top word if top bit set
58*219b2ee8SDavid du Colombier	 */
59*219b2ee8SDavid du Colombier	CMP	R8, R0
60*219b2ee8SDavid du Colombier	BGE	mul_tstlow
61*219b2ee8SDavid du Colombier	ADD	R13, R9			/* adjust the high parts */
62*219b2ee8SDavid du Colombier
63*219b2ee8SDavid du Colombiermul_tstlow:
64*219b2ee8SDavid du Colombier	MOVW	Y, R13			/* get low part */
65*219b2ee8SDavid du Colombier	BA	mul_done
66*219b2ee8SDavid du Colombier
67*219b2ee8SDavid du Colombiermul_shortway:
68*219b2ee8SDavid du Colombier	ANDCC	R0, R0, R9		/* zero partial product and clear N and V cond's */
69*219b2ee8SDavid du Colombier	MULSCC	R8, R9, R9		/*  0 */
70*219b2ee8SDavid du Colombier	MULSCC	R8, R9, R9		/*  1 */
71*219b2ee8SDavid du Colombier	MULSCC	R8, R9, R9		/*  2 */
72*219b2ee8SDavid du Colombier	MULSCC	R8, R9, R9		/*  3 */
73*219b2ee8SDavid du Colombier	MULSCC	R8, R9, R9		/*  4 */
74*219b2ee8SDavid du Colombier	MULSCC	R8, R9, R9		/*  5 */
75*219b2ee8SDavid du Colombier	MULSCC	R8, R9, R9		/*  6 */
76*219b2ee8SDavid du Colombier	MULSCC	R8, R9, R9		/*  7 */
77*219b2ee8SDavid du Colombier	MULSCC	R8, R9, R9		/*  8 */
78*219b2ee8SDavid du Colombier	MULSCC	R8, R9, R9		/*  9 */
79*219b2ee8SDavid du Colombier	MULSCC	R8, R9, R9		/* 10 */
80*219b2ee8SDavid du Colombier	MULSCC	R8, R9, R9		/* 11 */
81*219b2ee8SDavid du Colombier	MULSCC	R0, R9, R9		/* 12; shift only; r9 is high part */
82*219b2ee8SDavid du Colombier
83*219b2ee8SDavid du Colombier	MOVW	Y, R8			/* make low part of partial low part & high part */
84*219b2ee8SDavid du Colombier	SLL	$12, R9, R13
85*219b2ee8SDavid du Colombier	SRL	$20, R8
86*219b2ee8SDavid du Colombier	OR	R8, R13
87*219b2ee8SDavid du Colombier
88*219b2ee8SDavid du Colombier	SRA	$20, R9			/* high part */
89*219b2ee8SDavid du Colombier
90*219b2ee8SDavid du Colombiermul_done:
91*219b2ee8SDavid du Colombier
92*219b2ee8SDavid du Colombier	/*
93*219b2ee8SDavid du Colombier	 * mul by high halves if needed
94*219b2ee8SDavid du Colombier	 */
95*219b2ee8SDavid du Colombier	MOVW	R13, 4(R7)
96*219b2ee8SDavid du Colombier	MOVW	u2+12(FP), R11
97*219b2ee8SDavid du Colombier	CMP	R11, R0
98*219b2ee8SDavid du Colombier	BE	nomul1
99*219b2ee8SDavid du Colombier	MUL	R11, R12
100*219b2ee8SDavid du Colombier	ADD	R12, R9
101*219b2ee8SDavid du Colombier
102*219b2ee8SDavid du Colombiernomul1:
103*219b2ee8SDavid du Colombier	MOVW	u1+4(FP), R11
104*219b2ee8SDavid du Colombier	CMP	R11, R0
105*219b2ee8SDavid du Colombier	BE	nomul2
106*219b2ee8SDavid du Colombier	MUL	R11, R16
107*219b2ee8SDavid du Colombier	ADD	R16, R9
108*219b2ee8SDavid du Colombier
109*219b2ee8SDavid du Colombiernomul2:
110*219b2ee8SDavid du Colombier
111*219b2ee8SDavid du Colombier	MOVW	R9, 0(R7)
112*219b2ee8SDavid du Colombier	RETURN
113