162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * unsigned long __xdiv64_32(unsigned long long n, unsigned long d);
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#include <linux/linkage.h>
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci.text
962306a36Sopenharmony_ciENTRY(__xdiv64_32)
1062306a36Sopenharmony_ci#ifdef CONFIG_CPU_LITTLE_ENDIAN
1162306a36Sopenharmony_ci	mov	r4, r0
1262306a36Sopenharmony_ci	mov	r5, r1
1362306a36Sopenharmony_ci#else
1462306a36Sopenharmony_ci	mov	r4, r1
1562306a36Sopenharmony_ci	mov	r5, r0
1662306a36Sopenharmony_ci#endif
1762306a36Sopenharmony_ci	cmp/hs	r6, r1
1862306a36Sopenharmony_ci	bf.s	1f
1962306a36Sopenharmony_ci	 mov	#0, r2
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci	mov	r1, r2
2262306a36Sopenharmony_ci	mov	#0, r3
2362306a36Sopenharmony_ci	div0u
2462306a36Sopenharmony_ci	.rept	32
2562306a36Sopenharmony_ci	rotcl	r2
2662306a36Sopenharmony_ci	div1	r6, r3
2762306a36Sopenharmony_ci	.endr
2862306a36Sopenharmony_ci	rotcl	r2
2962306a36Sopenharmony_ci	mul.l	r6, r2
3062306a36Sopenharmony_ci	sts	macl, r3
3162306a36Sopenharmony_ci	sub	r3, r1
3262306a36Sopenharmony_ci1:
3362306a36Sopenharmony_ci	div0u
3462306a36Sopenharmony_ci	.rept	32
3562306a36Sopenharmony_ci	rotcl	r0
3662306a36Sopenharmony_ci	div1	r6, r1
3762306a36Sopenharmony_ci	.endr
3862306a36Sopenharmony_ci#ifdef CONFIG_CPU_LITTLE_ENDIAN
3962306a36Sopenharmony_ci	mov	r2, r1
4062306a36Sopenharmony_ci	rts
4162306a36Sopenharmony_ci	 rotcl	r0
4262306a36Sopenharmony_ci#else
4362306a36Sopenharmony_ci	rotcl	r0
4462306a36Sopenharmony_ci	mov	r0, r1
4562306a36Sopenharmony_ci	rts
4662306a36Sopenharmony_ci	 mov	r2, r0
4762306a36Sopenharmony_ci#endif
48