#include <linux/linkage.h>
#include <asm/asmmacro.h>
#include <asm/core.h>
ENTRY(__udivsi3)
abi_entry_default
#if XCHAL_HAVE_DIV32
quou a2, a2, a3
#else
bltui a3, 2, .Lle_one
mov a6, a2
do_nsau a5, a6, a2, a7
do_nsau a4, a3, a2, a7
bgeu a5, a4, .Lspecial
sub a4, a4, a5
ssl a4
sll a3, a3
movi a2, 0
#if XCHAL_HAVE_LOOPS
loopnez a4, .Lloopend
#endif
.Lloop:
bltu a6, a3, .Lzerobit
sub a6, a6, a3
addi a2, a2, 1
.Lzerobit:
slli a2, a2, 1
srli a3, a3, 1
#if !XCHAL_HAVE_LOOPS
addi a4, a4, -1
bnez a4, .Lloop
#endif
.Lloopend:
bltu a6, a3, .Lreturn
addi a2, a2, 1
.Lreturn:
abi_ret_default
.Lle_one:
beqz a3, .Lerror
abi_ret_default
.Lspecial:
bltu a6, a3, .Lreturn0
movi a2, 1
abi_ret_default
.Lerror:
ill
.ascii "DIV0"
.Lreturn0:
movi a2, 0
#endif
abi_ret_default
ENDPROC(__udivsi3)
EXPORT_SYMBOL(__udivsi3)