	GET	h.asmregs

	AREA	|C$$code|,CODE,READONLY

	EXPORT	|__rt_sdiv|
|__rt_sdiv|
	B	|x$divide|

	EXPORT	|__rt_udiv|
|__rt_udiv|
	B	|x$udivide|

	EXPORT	|__umodsi3|
|__umodsi3|
	MOV	a3, a1
	MOV	a1, a2
	MOV	a2, a3
	B	|x$uremainder|

	EXPORT	|__udivsi3|
|__udivsi3|
	MOV	a3, a1
	MOV	a1, a2
	MOV	a2, a3
	B	|x$udivide|

	EXPORT	|__modsi3|
|__modsi3|
	MOV	a3, a1
	MOV	a1, a2
	MOV	a2, a3
	B	|x$remainder|

	EXPORT	|__divsi3|
|__divsi3|
	MOV	a3, a1
	MOV	a1, a2
	MOV	a2, a3
	B	|x$divide|

	EXPORT	|x$divtest|
|x$divtest|
	MOV	pc,lr

	EXPORT	|x$remainder|
|x$remainder|
	STMFD	sp!,{lr}
	BL	|x$divide|
	MOV	a1,a2
	LDMFD	sp!,{pc}

	EXPORT	|x$uremainder|
|x$uremainder|
	STMFD	sp!,{lr}
	BL	|x$udivide|
	MOV	a1,a2
	LDMFD	sp!,{pc}

|x$overflow|
	MVN	a1,#0
	MOV	pc,lr

	EXPORT	|x$udivide|	; a1 = a2 / a1; a2 = a2 % a1
|x$udivide|
	CMP	a1,#1
	BLO	|x$overflow|
	BEQ	|x$divide_l0|
	MOV	ip,#0
	MOVS	a2,a2
	BPL	|x$divide_l1|
	ORR	ip,ip,#&20000000; ip bit &20000000 = -ve a2
	MOVS	a2,a2,LSR #1
	ORRCS	ip,ip,#&10000000; ip bit &10000000 = bit 0 of a2
	B	|x$divide_l1|

|x$divide_l0|			; a1 == 1
	MOV	a1,a2
	MOV	a2,#0
	MOV	pc,lr

	EXPORT	|x$divide|	; a1 = a2 / a1; a2 = a2 % a1
|x$divide|
	CMP	a1,#1
	BLO	|x$overflow|
	BEQ	|x$divide_l0|
	ANDS	ip,a1,#&80000000
	RSBMI	a1,a1,#0
	ANDS	a3,a2,#&80000000
	EOR	ip,ip,a3
	RSBMI	a2,a2,#0
	ORR	ip,a3,ip,LSR #1 ; ip bit &40000000 = -ve division
				; ip bit &80000000 = -ve remainder

|x$divide_l1|
	MOV	a3,#1
	MOV	a4,#0

	CMP	a2,a1
	BLO	|x$divide_b0|
	CMP	a2,a1,LSL #1
	BLO	|x$divide_b1|
	CMP	a2,a1,LSL #2
	BLO	|x$divide_b2|
	CMP	a2,a1,LSL #3
	BLO	|x$divide_b3|
	CMP	a2,a1,LSL #4
	BLO	|x$divide_b4|
	CMP	a2,a1,LSL #5
	BLO	|x$divide_b5|
	CMP	a2,a1,LSL #6
	BLO	|x$divide_b6|
	CMP	a2,a1,LSL #7
	BLO	|x$divide_b7|
	CMP	a2,a1,LSL #8
	BLO	|x$divide_b8|
	CMP	a2,a1,LSL #9
	BLO	|x$divide_b9|
	CMP	a2,a1,LSL #10
	BLO	|x$divide_b10|
	CMP	a2,a1,LSL #11
	BLO	|x$divide_b11|
	CMP	a2,a1,LSL #12
	BLO	|x$divide_b12|
	CMP	a2,a1,LSL #13
	BLO	|x$divide_b13|
	CMP	a2,a1,LSL #14
	BLO	|x$divide_b14|
	CMP	a2,a1,LSL #15
	BLO	|x$divide_b15|
	CMP	a2,a1,LSL #16
	BLO	|x$divide_b16|
	CMP	a2,a1,LSL #17
	BLO	|x$divide_b17|
	CMP	a2,a1,LSL #18
	BLO	|x$divide_b18|
	CMP	a2,a1,LSL #19
	BLO	|x$divide_b19|
	CMP	a2,a1,LSL #20
	BLO	|x$divide_b20|
	CMP	a2,a1,LSL #21
	BLO	|x$divide_b21|
	CMP	a2,a1,LSL #22
	BLO	|x$divide_b22|
	CMP	a2,a1,LSL #23
	BLO	|x$divide_b23|
	CMP	a2,a1,LSL #24
	BLO	|x$divide_b24|
	CMP	a2,a1,LSL #25
	BLO	|x$divide_b25|
	CMP	a2,a1,LSL #26
	BLO	|x$divide_b26|
	CMP	a2,a1,LSL #27
	BLO	|x$divide_b27|
	CMP	a2,a1,LSL #28
	BLO	|x$divide_b28|
	CMP	a2,a1,LSL #29
	BLO	|x$divide_b29|
	CMP	a2,a1,LSL #30
	BLO	|x$divide_b30|
	CMP	a2,a1,LSL #31
	SUBHS	a2,a2,a1,LSL #31
	ADDHS	a4,a4,a3,LSL #31
	CMP	a2,a1,LSL #30
	SUBHS	a2,a2,a1,LSL #30
	ADDHS	a4,a4,a3,LSL #30
|x$divide_b30|
	CMP	a2,a1,LSL #29
	SUBHS	a2,a2,a1,LSL #29
	ADDHS	a4,a4,a3,LSL #29
|x$divide_b29|
	CMP	a2,a1,LSL #28
	SUBHS	a2,a2,a1,LSL #28
	ADDHS	a4,a4,a3,LSL #28
|x$divide_b28|
	CMP	a2,a1,LSL #27
	SUBHSS	a2,a2,a1,LSL #27
	ADDHS	a4,a4,a3,LSL #27
|x$divide_b27|
	CMP	a2,a1,LSL #26
	SUBHS	a2,a2,a1,LSL #26
	ADDHS	a4,a4,a3,LSL #26
|x$divide_b26|
	CMP	a2,a1,LSL #25
	SUBHS	a2,a2,a1,LSL #25
	ADDHS	a4,a4,a3,LSL #25
|x$divide_b25|
	CMP	a2,a1,LSL #24
	SUBHS	a2,a2,a1,LSL #24
	ADDHS	a4,a4,a3,LSL #24
|x$divide_b24|
	CMP	a2,a1,LSL #23
	SUBHS	a2,a2,a1,LSL #23
	ADDHS	a4,a4,a3,LSL #23
|x$divide_b23|
	CMP	a2,a1,LSL #22
	SUBHS	a2,a2,a1,LSL #22
	ADDHS	a4,a4,a3,LSL #22
|x$divide_b22|
	CMP	a2,a1,LSL #21
	SUBHS	a2,a2,a1,LSL #21
	ADDHS	a4,a4,a3,LSL #21
|x$divide_b21|
	CMP	a2,a1,LSL #20
	SUBHS	a2,a2,a1,LSL #20
	ADDHS	a4,a4,a3,LSL #20
|x$divide_b20|
	CMP	a2,a1,LSL #19
	SUBHS	a2,a2,a1,LSL #19
	ADDHS	a4,a4,a3,LSL #19
|x$divide_b19|
	CMP	a2,a1,LSL #18
	SUBHS	a2,a2,a1,LSL #18
	ADDHS	a4,a4,a3,LSL #18
|x$divide_b18|
	CMP	a2,a1,LSL #17
	SUBHS	a2,a2,a1,LSL #17
	ADDHS	a4,a4,a3,LSL #17
|x$divide_b17|
	CMP	a2,a1,LSL #16
	SUBHS	a2,a2,a1,LSL #16
	ADDHS	a4,a4,a3,LSL #16
|x$divide_b16|
	CMP	a2,a1,LSL #15
	SUBHS	a2,a2,a1,LSL #15
	ADDHS	a4,a4,a3,LSL #15
|x$divide_b15|
	CMP	a2,a1,LSL #14
	SUBHS	a2,a2,a1,LSL #14
	ADDHS	a4,a4,a3,LSL #14
|x$divide_b14|
	CMP	a2,a1,LSL #13
	SUBHS	a2,a2,a1,LSL #13
	ADDHS	a4,a4,a3,LSL #13
|x$divide_b13|
	CMP	a2,a1,LSL #12
	SUBHS	a2,a2,a1,LSL #12
	ADDHS	a4,a4,a3,LSL #12
|x$divide_b12|
	CMP	a2,a1,LSL #11
	SUBHS	a2,a2,a1,LSL #11
	ADDHS	a4,a4,a3,LSL #11
|x$divide_b11|
	CMP	a2,a1,LSL #10
	SUBHS	a2,a2,a1,LSL #10
	ADDHS	a4,a4,a3,LSL #10
|x$divide_b10|
	CMP	a2,a1,LSL #9
	SUBHS	a2,a2,a1,LSL #9
	ADDHS	a4,a4,a3,LSL #9
|x$divide_b9|
	CMP	a2,a1,LSL #8
	SUBHS	a2,a2,a1,LSL #8
	ADDHS	a4,a4,a3,LSL #8
|x$divide_b8|
	CMP	a2,a1,LSL #7
	SUBHS	a2,a2,a1,LSL #7
	ADDHS	a4,a4,a3,LSL #7
|x$divide_b7|
	CMP	a2,a1,LSL #6
	SUBHS	a2,a2,a1,LSL #6
	ADDHS	a4,a4,a3,LSL #6
|x$divide_b6|
	CMP	a2,a1,LSL #5
	SUBHS	a2,a2,a1,LSL #5
	ADDHS	a4,a4,a3,LSL #5
|x$divide_b5|
	CMP	a2,a1,LSL #4
	SUBHS	a2,a2,a1,LSL #4
	ADDHS	a4,a4,a3,LSL #4
|x$divide_b4|
	CMP	a2,a1,LSL #3
	SUBHS	a2,a2,a1,LSL #3
	ADDHS	a4,a4,a3,LSL #3
|x$divide_b3|
	CMP	a2,a1,LSL #2
	SUBHS	a2,a2,a1,LSL #2
	ADDHS	a4,a4,a3,LSL #2
|x$divide_b2|
	CMP	a2,a1,LSL #1
	SUBHS	a2,a2,a1,LSL #1
	ADDHS	a4,a4,a3,LSL #1
|x$divide_b1|
	CMP	a2,a1
	SUBHS	a2,a2,a1
	ADDHS	a4,a4,a3
|x$divide_b0|

	TST	ip,#&20000000
	BNE	|x$udivide_l1|
	MOV	a1,a4
	CMP	ip,#0
	RSBMI	a2,a2,#0
	MOVS	ip,ip,LSL #1
	RSBMI	a1,a1,#0
	MOV	pc,lr

|x$udivide_l1|
	TST	ip,#&10000000
	MOV	a2,a2,LSL #1
	ORRNE	a2,a2,#1
	MOV	a4,a4,LSL #1
	CMP	a2,a1
	SUBHS	a2,a2,a1
	ADDHS	a4,a4,a3
	MOV	a1,a4
	MOV	pc,lr

	END
