xref: /plan9/sys/src/ape/lib/ap/386/vlop.s (revision 853458f38e7eb3a48cfa3a36aefdb799375e398a)
1TEXT	_mulv(SB), $0
2	MOVL	r+0(FP), CX
3	MOVL	a+4(FP), AX
4	MULL	b+12(FP)
5	MOVL	AX, 0(CX)
6	MOVL	DX, BX
7	MOVL	a+4(FP), AX
8	MULL	b+16(FP)
9	ADDL	AX, BX
10	MOVL	a+8(FP), AX
11	MULL	b+12(FP)
12	ADDL	AX, BX
13	MOVL	BX, 4(CX)
14	RET
15
16/*
17 * _mul64by32(uint64 *r, uint64 a, uint32 b)
18 * sets *r = low 64 bits of 96-bit product a*b; returns high 32 bits.
19 */
20TEXT	_mul64by32(SB), $0
21	MOVL	r+0(FP), CX
22	MOVL	a+4(FP), AX
23	MULL	b+12(FP)
24	MOVL	AX, 0(CX)	/* *r = low 32 bits of a*b */
25	MOVL	DX, BX		/* BX = high 32 bits of a*b */
26
27	MOVL	a+8(FP), AX
28	MULL	b+12(FP)	/* hi = (a>>32) * b */
29	ADDL	AX, BX		/* BX += low 32 bits of hi */
30	ADCL	$0, DX		/* DX = high 32 bits of hi + carry */
31	MOVL	BX, 4(CX)	/* *r |= (high 32 bits of a*b) << 32 */
32
33	MOVL	DX, AX		/* return hi>>32 */
34	RET
35
36TEXT	_div64by32(SB), $0
37	MOVL	r+12(FP), CX
38	MOVL	a+0(FP), AX
39	MOVL	a+4(FP), DX
40	DIVL	b+8(FP)
41	MOVL	DX, 0(CX)
42	RET
43
44TEXT	_addv(SB), $0
45	MOVL	r+0(FP), CX
46	MOVL	a+4(FP), AX
47	MOVL	a+8(FP), BX
48	ADDL	b+12(FP), AX
49	ADCL	b+16(FP), BX
50	MOVL	AX, 0(CX)
51	MOVL	BX, 4(CX)
52	RET
53