• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#include "libgcc.h"
2
3	;; This function also computes the remainder and stores it in er3.
4	.global	__udivsi3
5__udivsi3:
6	mov.w	A1E,A1E		; denominator top word 0?
7	bne	DenHighNonZero
8
9	; do it the easy way, see page 107 in manual
10	mov.w	A0E,A2
11	extu.l	A2P
12	divxu.w	A1,A2P
13	mov.w	A2E,A0E
14	divxu.w	A1,A0P
15	mov.w	A0E,A3
16	mov.w	A2,A0E
17	extu.l	A3P
18	rts
19
20	; er0 = er0 / er1
21	; er3 = er0 % er1
22	; trashes er1 er2
23	; expects er1 >= 2^16
24DenHighNonZero:
25	mov.l	er0,er3
26	mov.l	er1,er2
27#ifdef CONFIG_CPU_H8300H
28divmod_L21:
29	shlr.l	er0
30	shlr.l	er2		; make divisor < 2^16
31	mov.w	e2,e2
32	bne	divmod_L21
33#else
34	shlr.l	#2,er2		; make divisor < 2^16
35	mov.w	e2,e2
36	beq	divmod_L22A
37divmod_L21:
38	shlr.l	#2,er0
39divmod_L22:
40	shlr.l	#2,er2		; make divisor < 2^16
41	mov.w	e2,e2
42	bne	divmod_L21
43divmod_L22A:
44	rotxl.w	r2
45	bcs	divmod_L23
46	shlr.l	er0
47	bra	divmod_L24
48divmod_L23:
49	rotxr.w	r2
50	shlr.l	#2,er0
51divmod_L24:
52#endif
53	;; At this point,
54	;;  er0 contains shifted dividend
55	;;  er1 contains divisor
56	;;  er2 contains shifted divisor
57	;;  er3 contains dividend, later remainder
58	divxu.w	r2,er0		; r0 now contains the approximate quotient (AQ)
59	extu.l	er0
60	beq	divmod_L25
61	subs	#1,er0		; er0 = AQ - 1
62	mov.w	e1,r2
63	mulxu.w	r0,er2		; er2 = upper (AQ - 1) * divisor
64	sub.w	r2,e3		; dividend - 65536 * er2
65	mov.w	r1,r2
66	mulxu.w	r0,er2		; compute er3 = remainder (tentative)
67	sub.l	er2,er3		; er3 = dividend - (AQ - 1) * divisor
68divmod_L25:
69	cmp.l	er1,er3		; is divisor < remainder?
70	blo	divmod_L26
71	adds	#1,er0
72	sub.l	er1,er3		; correct the remainder
73divmod_L26:
74	rts
75
76	.end
77