summaryrefslogtreecommitdiff
path: root/vere/ext/gmp/gen/aarch64-macos/mpn/divrem_1.s
blob: 3d4ca8c84f932d1e1a8c312141ff426b3464523d (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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235































































	.text
	.align	3
	.globl	___gmpn_preinv_divrem_1 
	
___gmpn_preinv_divrem_1:
	cbz	x3, Lfz
	stp	x29, x30, [sp, #-80]!
	mov	x29, sp
	stp	x19, x20, [sp, #16]
	stp	x21, x22, [sp, #32]
	stp	x23, x24, [sp, #48]

	sub	x21, x3, #1
	add	x7, x21, x1
	add	x20, x2, x21, lsl #3
	add	x19, x0, x7, lsl #3
	mov	x24, x1
	mov	x22, x4
	mov	x0, x5
	tbnz	x4, #63, Lnentry
	mov	x23, x6
	b	Luentry
	

	.text
	.align	3
	.globl	___gmpn_divrem_1 
	
___gmpn_divrem_1:
	cbz	x3, Lfz
	stp	x29, x30, [sp, #-80]!
	mov	x29, sp
	stp	x19, x20, [sp, #16]
	stp	x21, x22, [sp, #32]
	stp	x23, x24, [sp, #48]

	sub	x21, x3, #1
	add	x7, x21, x1
	add	x20, x2, x21, lsl #3
	add	x19, x0, x7, lsl #3
	mov	x24, x1
	mov	x22, x4
	tbnz	x4, #63, Lnormalised

Lunnorm:
	clz	x23, x22
	lsl	x0, x22, x23
	bl	___gmpn_invert_limb
Luentry:
	lsl	x22, x22, x23
	ldr	x7, [x20], #-8
	sub	x8, xzr, x23
	lsr	x11, x7, x8		
	lsl	x1, x7, x23
	cbz	x21, Luend

Lutop:ldr	x7, [x20], #-8
	add	x2, x11, #1
	mul	x10, x11, x0
	umulh	x17, x11, x0
	lsr	x9, x7, x8
	orr	x1, x1, x9
	adds	x10, x1, x10
	adc	x2, x2, x17
	msub	x11, x22, x2, x1
	lsl	x1, x7, x23
	cmp	x10, x11
	add	x14, x11, x22
	csel	x11, x14, x11, cc
	sbc	x2, x2, xzr
	cmp	x11, x22
	bcs	Lufx
Luok:	str	x2, [x19], #-8
	sub	x21, x21, #1
	cbnz	x21, Lutop

Luend:add	x2, x11, #1
	mul	x10, x11, x0
	umulh	x17, x11, x0
	adds	x10, x1, x10
	adc	x2, x2, x17
	msub	x11, x22, x2, x1
	cmp	x10, x11
	add	x14, x11, x22
	csel	x11, x14, x11, cc
	sbc	x2, x2, xzr
	subs	x14, x11, x22
	adc	x2, x2, xzr
	csel	x11, x14, x11, cs
	str	x2, [x19], #-8

	cbnz	x24, Lftop
	lsr	x0, x11, x23
	ldp	x19, x20, [sp, #16]
	ldp	x21, x22, [sp, #32]
	ldp	x23, x24, [sp, #48]
	ldp	x29, x30, [sp], #80
	ret

Lufx:	add	x2, x2, #1
	sub	x11, x11, x22
	b	Luok


Lnormalised:
	mov	x0, x22
	bl	___gmpn_invert_limb
Lnentry:
	ldr	x7, [x20], #-8
	subs	x14, x7, x22
	adc	x2, xzr, xzr		
	csel	x11, x14, x7, cs
	b	Lnok

Lntop:ldr	x1, [x20], #-8
	add	x2, x11, #1
	mul	x10, x11, x0
	umulh	x17, x11, x0
	adds	x10, x1, x10
	adc	x2, x2, x17
	msub	x11, x22, x2, x1
	cmp	x10, x11
	add	x14, x11, x22
	csel	x11, x14, x11, cc	
	sbc	x2, x2, xzr
	cmp	x11, x22
	bcs	Lnfx
Lnok:	str	x2, [x19], #-8
	sub	x21, x21, #1
	tbz	x21, #63, Lntop

Lnend:cbnz	x24, Lfrac
	mov	x0, x11
	ldp	x19, x20, [sp, #16]
	ldp	x21, x22, [sp, #32]
	ldp	x23, x24, [sp, #48]
	ldp	x29, x30, [sp], #80
	ret

Lnfx:	add	x2, x2, #1
	sub	x11, x11, x22
	b	Lnok

Lfrac:mov	x23, #0
Lftop:add	x2, x11, #1
	mul	x10, x11, x0
	umulh	x17, x11, x0
	add	x2, x2, x17
	msub	x11, x22, x2, xzr
	cmp	x10, x11
	add	x14, x11, x22
	csel	x11, x14, x11, cc	
	sbc	x2, x2, xzr
	str	x2, [x19], #-8
	sub	x24, x24, #1
	cbnz	x24, Lftop

	lsr	x0, x11, x23
	ldp	x19, x20, [sp, #16]
	ldp	x21, x22, [sp, #32]
	ldp	x23, x24, [sp, #48]
	ldp	x29, x30, [sp], #80
	ret


Lfz:	cbz	x1, Lzend
Lztop:str	xzr, [x0], #8
	sub	x1, x1, #1
	cbnz	x1, Lztop
Lzend:mov	x0, #0
	ret