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