2021-10-18 14:29:27 +03:00
/* SPDX-License-Identifier: GPL-2.0-or-later WITH GCC-exception-2.0 */
# include < l i n u x / l i n k a g e . h >
# include < a s m / a s m m a c r o . h >
# include < a s m / c o r e . h >
ENTRY( _ _ u d i v s i 3 )
abi_ e n t r y _ d e f a u l t
# if X C H A L _ H A V E _ D I V 3 2
quou a2 , a2 , a3
# else
bltui a3 , 2 , . L l e _ o n e / * c h e c k i f t h e d i v i s o r < = 1 * /
mov a6 , a2 / * k e e p d i v i d e n d i n a6 * /
do_ n s a u a5 , a6 , a2 , a7 / * d i v i d e n d _ s h i f t = n s a u ( d i v i d e n d ) * /
do_ n s a u a4 , a3 , a2 , a7 / * d i v i s o r _ s h i f t = n s a u ( d i v i s o r ) * /
bgeu a5 , a4 , . L s p e c i a l
sub a4 , a4 , a5 / * c o u n t = d i v i s o r _ s h i f t - d i v i d e n d _ s h i f t * /
ssl a4
sll a3 , a3 / * d i v i s o r < < = c o u n t * /
movi a2 , 0 / * q u o t i e n t = 0 * /
/* test-subtract-and-shift loop; one quotient bit on each iteration */
# if X C H A L _ H A V E _ L O O P S
loopnez a4 , . L l o o p e n d
# endif / * X C H A L _ H A V E _ L O O P S * /
.Lloop :
bltu a6 , a3 , . L z e r o b i t
sub a6 , a6 , a3
addi a2 , a2 , 1
.Lzerobit :
slli a2 , a2 , 1
srli a3 , a3 , 1
# if ! X C H A L _ H A V E _ L O O P S
addi a4 , a4 , - 1
bnez a4 , . L l o o p
# endif / * ! X C H A L _ H A V E _ L O O P S * /
.Lloopend :
bltu a6 , a3 , . L r e t u r n
addi a2 , a2 , 1 / * i n c r e m e n t q u o t i e n t i f d i v i d e n d > = d i v i s o r * /
.Lreturn :
abi_ r e t _ d e f a u l t
.Lle_one :
beqz a3 , . L e r r o r / * i f d i v i s o r = = 1 , r e t u r n t h e d i v i d e n d * /
abi_ r e t _ d e f a u l t
.Lspecial :
/* return dividend >= divisor */
bltu a6 , a3 , . L r e t u r n 0
movi a2 , 1
abi_ r e t _ d e f a u l t
.Lerror :
/ * Divide b y z e r o : U s e a n i l l e g a l i n s t r u c t i o n t o f o r c e a n e x c e p t i o n .
The s u b s e q u e n t " D I V 0 " s t r i n g c a n b e r e c o g n i z e d b y t h e e x c e p t i o n
handler t o i d e n t i f y t h e r e a l c a u s e o f t h e e x c e p t i o n . * /
ill
.ascii " DIV0 "
.Lreturn0 :
movi a2 , 0
# endif / * X C H A L _ H A V E _ D I V 3 2 * /
abi_ r e t _ d e f a u l t
ENDPROC( _ _ u d i v s i 3 )
2023-05-11 23:53:08 +03:00
EXPORT_ S Y M B O L ( _ _ u d i v s i 3 )