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*10465441SEvalZerouint32_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