xref: /plan9/sys/src/libc/arm/div.s (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
1*7dd7cddfSDavid du ColombierQ	= 0
2*7dd7cddfSDavid du ColombierN	= 1
3*7dd7cddfSDavid du ColombierD	= 2
4*7dd7cddfSDavid du ColombierCC	= 3
5*7dd7cddfSDavid du ColombierTMP	= 11
6*7dd7cddfSDavid du Colombier
7*7dd7cddfSDavid du ColombierTEXT	save<>(SB), 1, $0
8*7dd7cddfSDavid du Colombier	MOVW	R(Q), 0(FP)
9*7dd7cddfSDavid du Colombier	MOVW	R(N), 4(FP)
10*7dd7cddfSDavid du Colombier	MOVW	R(D), 8(FP)
11*7dd7cddfSDavid du Colombier	MOVW	R(CC), 12(FP)
12*7dd7cddfSDavid du Colombier
13*7dd7cddfSDavid du Colombier	MOVW	R(TMP), R(Q)		/* numerator */
14*7dd7cddfSDavid du Colombier	MOVW	20(FP), R(D)		/* denominator */
15*7dd7cddfSDavid du Colombier	CMP	$0, R(D)
16*7dd7cddfSDavid du Colombier	BNE	s1
17*7dd7cddfSDavid du Colombier	MOVW	-1(R(D)), R(TMP)	/* divide by zero fault */
18*7dd7cddfSDavid du Colombiers1:	RET
19*7dd7cddfSDavid du Colombier
20*7dd7cddfSDavid du ColombierTEXT	rest<>(SB), 1, $0
21*7dd7cddfSDavid du Colombier	MOVW	0(FP), R(Q)
22*7dd7cddfSDavid du Colombier	MOVW	4(FP), R(N)
23*7dd7cddfSDavid du Colombier	MOVW	8(FP), R(D)
24*7dd7cddfSDavid du Colombier	MOVW	12(FP), R(CC)
25*7dd7cddfSDavid du Colombier/*
26*7dd7cddfSDavid du Colombier * return to caller
27*7dd7cddfSDavid du Colombier * of rest<>
28*7dd7cddfSDavid du Colombier */
29*7dd7cddfSDavid du Colombier	MOVW	0(R13), R14
30*7dd7cddfSDavid du Colombier	ADD	$20, R13
31*7dd7cddfSDavid du Colombier	B	(R14)
32*7dd7cddfSDavid du Colombier
33*7dd7cddfSDavid du ColombierTEXT	div<>(SB), 1, $0
34*7dd7cddfSDavid du Colombier	MOVW	$32, R(CC)
35*7dd7cddfSDavid du Colombier/*
36*7dd7cddfSDavid du Colombier * skip zeros 8-at-a-time
37*7dd7cddfSDavid du Colombier */
38*7dd7cddfSDavid du Colombiere1:
39*7dd7cddfSDavid du Colombier	AND.S	$(0xff<<24),R(Q), R(N)
40*7dd7cddfSDavid du Colombier	BNE	e2
41*7dd7cddfSDavid du Colombier	SLL	$8, R(Q)
42*7dd7cddfSDavid du Colombier	SUB.S	$8, R(CC)
43*7dd7cddfSDavid du Colombier	BNE	e1
44*7dd7cddfSDavid du Colombier	RET
45*7dd7cddfSDavid du Colombiere2:
46*7dd7cddfSDavid du Colombier	MOVW	$0, R(N)
47*7dd7cddfSDavid du Colombier
48*7dd7cddfSDavid du Colombierloop:
49*7dd7cddfSDavid du Colombier/*
50*7dd7cddfSDavid du Colombier * shift R(N||Q) left one
51*7dd7cddfSDavid du Colombier */
52*7dd7cddfSDavid du Colombier	SLL	$1, R(N)
53*7dd7cddfSDavid du Colombier	CMP	$0, R(Q)
54*7dd7cddfSDavid du Colombier	ORR.LT	$1, R(N)
55*7dd7cddfSDavid du Colombier	SLL	$1, R(Q)
56*7dd7cddfSDavid du Colombier
57*7dd7cddfSDavid du Colombier/*
58*7dd7cddfSDavid du Colombier * compare numerator to denominator
59*7dd7cddfSDavid du Colombier * if less, subtract and set quotent bit
60*7dd7cddfSDavid du Colombier */
61*7dd7cddfSDavid du Colombier	CMP	R(D), R(N)
62*7dd7cddfSDavid du Colombier	ORR.HS	$1, R(Q)
63*7dd7cddfSDavid du Colombier	SUB.HS	R(D), R(N)
64*7dd7cddfSDavid du Colombier	SUB.S	$1, R(CC)
65*7dd7cddfSDavid du Colombier	BNE	loop
66*7dd7cddfSDavid du Colombier	RET
67*7dd7cddfSDavid du Colombier
68*7dd7cddfSDavid du ColombierTEXT	_div(SB), 1, $16
69*7dd7cddfSDavid du Colombier	BL	save<>(SB)
70*7dd7cddfSDavid du Colombier	CMP	$0, R(Q)
71*7dd7cddfSDavid du Colombier	BGE	d1
72*7dd7cddfSDavid du Colombier	RSB	$0, R(Q), R(Q)
73*7dd7cddfSDavid du Colombier	CMP	$0, R(D)
74*7dd7cddfSDavid du Colombier	BGE	d2
75*7dd7cddfSDavid du Colombier	RSB	$0, R(D), R(D)
76*7dd7cddfSDavid du Colombierd0:
77*7dd7cddfSDavid du Colombier	BL	div<>(SB)		/* none/both neg */
78*7dd7cddfSDavid du Colombier	MOVW	R(Q), R(TMP)
79*7dd7cddfSDavid du Colombier	B	out
80*7dd7cddfSDavid du Colombierd1:
81*7dd7cddfSDavid du Colombier	CMP	$0, R(D)
82*7dd7cddfSDavid du Colombier	BGE	d0
83*7dd7cddfSDavid du Colombier	RSB	$0, R(D), R(D)
84*7dd7cddfSDavid du Colombierd2:
85*7dd7cddfSDavid du Colombier	BL	div<>(SB)		/* one neg */
86*7dd7cddfSDavid du Colombier	RSB	$0, R(Q), R(TMP)
87*7dd7cddfSDavid du Colombier	B	out
88*7dd7cddfSDavid du Colombier
89*7dd7cddfSDavid du ColombierTEXT	_mod(SB), 1, $16
90*7dd7cddfSDavid du Colombier	BL	save<>(SB)
91*7dd7cddfSDavid du Colombier	CMP	$0, R(D)
92*7dd7cddfSDavid du Colombier	RSB.LT	$0, R(D), R(D)
93*7dd7cddfSDavid du Colombier	CMP	$0, R(Q)
94*7dd7cddfSDavid du Colombier	BGE	m1
95*7dd7cddfSDavid du Colombier	RSB	$0, R(Q), R(Q)
96*7dd7cddfSDavid du Colombier	BL	div<>(SB)		/* neg numerator */
97*7dd7cddfSDavid du Colombier	RSB	$0, R(N), R(TMP)
98*7dd7cddfSDavid du Colombier	B	out
99*7dd7cddfSDavid du Colombierm1:
100*7dd7cddfSDavid du Colombier	BL	div<>(SB)		/* pos numerator */
101*7dd7cddfSDavid du Colombier	MOVW	R(N), R(TMP)
102*7dd7cddfSDavid du Colombier	B	out
103*7dd7cddfSDavid du Colombier
104*7dd7cddfSDavid du ColombierTEXT	_divu(SB), 1, $16
105*7dd7cddfSDavid du Colombier	BL	save<>(SB)
106*7dd7cddfSDavid du Colombier	BL	div<>(SB)
107*7dd7cddfSDavid du Colombier	MOVW	R(Q), R(TMP)
108*7dd7cddfSDavid du Colombier	B	out
109*7dd7cddfSDavid du Colombier
110*7dd7cddfSDavid du ColombierTEXT	_modu(SB), 1, $16
111*7dd7cddfSDavid du Colombier	BL	save<>(SB)
112*7dd7cddfSDavid du Colombier	BL	div<>(SB)
113*7dd7cddfSDavid du Colombier	MOVW	R(N), R(TMP)
114*7dd7cddfSDavid du Colombier	B	out
115*7dd7cddfSDavid du Colombier
116*7dd7cddfSDavid du Colombierout:
117*7dd7cddfSDavid du Colombier	BL	rest<>(SB)
118*7dd7cddfSDavid du Colombier	B	out
119