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