summaryrefslogtreecommitdiff
path: root/arch/metag/lib/div64.S
blob: 1cfc93498f709d8b4af19a2a6ba2ec9efe43aeef (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
! Copyright (C) 2012 Imagination Technologies Ltd.
!
! Signed/unsigned 64-bit division routines.
!

	.text
	.global _div_u64
	.type   _div_u64,function

_div_u64:
$L1:
	ORS     A0.3,D1Ar3,D0Ar4
	BNE     $L3
$L2:
	MOV     D0Re0,D0Ar2
	MOV     D1Re0,D1Ar1
	MOV     PC,D1RtP
$L3:
	CMP     D1Ar3,D1Ar1
	CMPEQ   D0Ar4,D0Ar2
	MOV     D0Re0,#1
	MOV     D1Re0,#0
	BHS     $L6
$L4:
	ADDS    D0Ar6,D0Ar4,D0Ar4
	ADD     D1Ar5,D1Ar3,D1Ar3
	ADDCS   D1Ar5,D1Ar5,#1
	CMP     D1Ar5,D1Ar3
	CMPEQ   D0Ar6,D0Ar4
	BLO     $L6
$L5:
	MOV     D0Ar4,D0Ar6
	MOV     D1Ar3,D1Ar5
	ADDS    D0Re0,D0Re0,D0Re0
	ADD     D1Re0,D1Re0,D1Re0
	ADDCS   D1Re0,D1Re0,#1
	CMP     D1Ar3,D1Ar1
	CMPEQ   D0Ar4,D0Ar2
	BLO     $L4
$L6:
	ORS     A0.3,D1Re0,D0Re0
	MOV     D0Ar6,#0
	MOV     D1Ar5,D0Ar6
	BEQ     $L10
$L7:
	CMP     D1Ar1,D1Ar3
	CMPEQ   D0Ar2,D0Ar4
	BLO     $L9
$L8:
	ADDS    D0Ar6,D0Ar6,D0Re0
	ADD     D1Ar5,D1Ar5,D1Re0
	ADDCS   D1Ar5,D1Ar5,#1

	SUBS    D0Ar2,D0Ar2,D0Ar4
	SUB     D1Ar1,D1Ar1,D1Ar3
	SUBCS   D1Ar1,D1Ar1,#1
$L9:
	LSL     A0.3,D1Re0,#31
	LSR     D0Re0,D0Re0,#1
	LSR     D1Re0,D1Re0,#1
	OR      D0Re0,D0Re0,A0.3
	LSL     A0.3,D1Ar3,#31
	LSR     D0Ar4,D0Ar4,#1
	LSR     D1Ar3,D1Ar3,#1
	OR      D0Ar4,D0Ar4,A0.3
	ORS     A0.3,D1Re0,D0Re0
	BNE     $L7
$L10:
	MOV     D0Re0,D0Ar6
	MOV     D1Re0,D1Ar5
	MOV     PC,D1RtP
	.size _div_u64,.-_div_u64

	.text
	.global _div_s64
	.type   _div_s64,function
_div_s64:
	MSETL   [A0StP],D0FrT,D0.5
	XOR     D0.5,D0Ar2,D0Ar4
	XOR     D1.5,D1Ar1,D1Ar3
	TSTT    D1Ar1,#HI(0x80000000)
	BZ      $L25

	NEGS    D0Ar2,D0Ar2
	NEG     D1Ar1,D1Ar1
	SUBCS   D1Ar1,D1Ar1,#1
$L25:
	TSTT    D1Ar3,#HI(0x80000000)
	BZ      $L27

	NEGS    D0Ar4,D0Ar4
	NEG     D1Ar3,D1Ar3
	SUBCS   D1Ar3,D1Ar3,#1
$L27:
	CALLR   D1RtP,_div_u64
	TSTT    D1.5,#HI(0x80000000)
	BZ      $L29

	NEGS    D0Re0,D0Re0
	NEG     D1Re0,D1Re0
	SUBCS   D1Re0,D1Re0,#1
$L29:

	GETL    D0FrT,D1RtP,[A0StP+#(-16)]
	GETL    D0.5,D1.5,[A0StP+#(-8)]
	SUB     A0StP,A0StP,#16
	MOV     PC,D1RtP
	.size _div_s64,.-_div_s64