xref: /nrf52832-nimble/rt-thread/libcpu/ia32/__udivsi3.c (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero /*
2*10465441SEvalZero  * File      : __udivsi3.c
3*10465441SEvalZero  * This file is part of RT-Thread RTOS
4*10465441SEvalZero  * COPYRIGHT (C) 2006, RT-Thread Develop Team
5*10465441SEvalZero  *
6*10465441SEvalZero  * The license and distribution terms for this file may be
7*10465441SEvalZero  * found in the file LICENSE in this distribution or at
8*10465441SEvalZero  * http://openlab.rt-thread.com/license/LICENSE
9*10465441SEvalZero  *
10*10465441SEvalZero  * Change Logs:
11*10465441SEvalZero  * Date           Author       Notes
12*10465441SEvalZero  * 2006-10-09     Bernard      the first version for i386
13*10465441SEvalZero  */
14*10465441SEvalZero 
15*10465441SEvalZero #include <stdint.h>
16*10465441SEvalZero 
__udivsi3(uint32_t num,uint32_t den)17*10465441SEvalZero uint32_t __udivsi3(uint32_t num, uint32_t den)
18*10465441SEvalZero {
19*10465441SEvalZero 	uint32_t quot = 0, qbit = 1;
20*10465441SEvalZero 
21*10465441SEvalZero 	if (den == 0)
22*10465441SEvalZero 	{
23*10465441SEvalZero 		asm volatile ("int $0");
24*10465441SEvalZero 		return 0;	/* If trap returns... */
25*10465441SEvalZero 	}
26*10465441SEvalZero 
27*10465441SEvalZero 	/* Left-justify denominator and count shift */
28*10465441SEvalZero 	while ((int32_t) den >= 0)
29*10465441SEvalZero 	{
30*10465441SEvalZero 		den <<= 1;
31*10465441SEvalZero 		qbit <<= 1;
32*10465441SEvalZero 	}
33*10465441SEvalZero 
34*10465441SEvalZero 	while (qbit)
35*10465441SEvalZero 	{
36*10465441SEvalZero 		if (den <= num)
37*10465441SEvalZero 		{
38*10465441SEvalZero 			num -= den;
39*10465441SEvalZero 			quot += qbit;
40*10465441SEvalZero 		}
41*10465441SEvalZero 		den >>= 1;
42*10465441SEvalZero 		qbit >>= 1;
43*10465441SEvalZero 	}
44*10465441SEvalZero 
45*10465441SEvalZero 	return quot;
46*10465441SEvalZero }
47