summaryrefslogtreecommitdiff
path: root/arch/sh/lib/div64.S
blob: 4a9a966e71b0e7871536a68c36e0cc3c44000e4d (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
/* SPDX-License-Identifier: GPL-2.0 */
/*	
 * unsigned long __xdiv64_32(unsigned long long n, unsigned long d); 
 */

#include <linux/linkage.h>

.text
ENTRY(__xdiv64_32)
#ifdef CONFIG_CPU_LITTLE_ENDIAN
	mov	r4, r0
	mov	r5, r1
#else
	mov	r4, r1
	mov	r5, r0
#endif
	cmp/hs	r6, r1
	bf.s	1f
	 mov	#0, r2

	mov	r1, r2
	mov	#0, r3
	div0u
	.rept	32
	rotcl	r2
	div1	r6, r3
	.endr
	rotcl	r2
	mul.l	r6, r2
	sts	macl, r3
	sub	r3, r1
1:
	div0u
	.rept	32
	rotcl	r0
	div1	r6, r1
	.endr
#ifdef CONFIG_CPU_LITTLE_ENDIAN
	mov	r2, r1
	rts
	 rotcl	r0
#else
	rotcl	r0
	mov	r0, r1
	rts
	 mov	r2, r0
#endif