xref: /netbsd-src/external/gpl3/gcc/dist/libgcc/config/lm32/_udivmodsi4.c (revision b1e838363e3c6fc78a55519254d99869742dd33c)
14fee23f9Smrg /* _udivmodsi4 for Lattice Mico32.
24fee23f9Smrg    Contributed by Jon Beniston <jon@beniston.com>
34fee23f9Smrg 
4*b1e83836Smrg    Copyright (C) 2009-2022 Free Software Foundation, Inc.
54fee23f9Smrg 
64fee23f9Smrg    This file is free software; you can redistribute it and/or modify it
74fee23f9Smrg    under the terms of the GNU General Public License as published by the
84fee23f9Smrg    Free Software Foundation; either version 3, or (at your option) any
94fee23f9Smrg    later version.
104fee23f9Smrg 
114fee23f9Smrg    This file is distributed in the hope that it will be useful, but
124fee23f9Smrg    WITHOUT ANY WARRANTY; without even the implied warranty of
134fee23f9Smrg    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
144fee23f9Smrg    General Public License for more details.
154fee23f9Smrg 
164fee23f9Smrg    Under Section 7 of GPL version 3, you are granted additional
174fee23f9Smrg    permissions described in the GCC Runtime Library Exception, version
184fee23f9Smrg    3.1, as published by the Free Software Foundation.
194fee23f9Smrg 
204fee23f9Smrg    You should have received a copy of the GNU General Public License and
214fee23f9Smrg    a copy of the GCC Runtime Library Exception along with this program;
224fee23f9Smrg    see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
234fee23f9Smrg    <http://www.gnu.org/licenses/>. */
244fee23f9Smrg 
254fee23f9Smrg #include "libgcc_lm32.h"
264fee23f9Smrg 
274fee23f9Smrg /* Unsigned integer division/modulus.  */
284fee23f9Smrg 
294fee23f9Smrg USItype
__udivmodsi4(USItype num,USItype den,int modwanted)304fee23f9Smrg __udivmodsi4 (USItype num, USItype den, int modwanted)
314fee23f9Smrg {
324fee23f9Smrg   USItype bit = 1;
334fee23f9Smrg   USItype res = 0;
344fee23f9Smrg 
354fee23f9Smrg   while (den < num && bit && !(den & (1L << 31)))
364fee23f9Smrg     {
374fee23f9Smrg       den <<= 1;
384fee23f9Smrg       bit <<= 1;
394fee23f9Smrg     }
404fee23f9Smrg   while (bit)
414fee23f9Smrg     {
424fee23f9Smrg       if (num >= den)
434fee23f9Smrg 	{
444fee23f9Smrg 	  num -= den;
454fee23f9Smrg 	  res |= bit;
464fee23f9Smrg 	}
474fee23f9Smrg       bit >>= 1;
484fee23f9Smrg       den >>= 1;
494fee23f9Smrg     }
504fee23f9Smrg   if (modwanted)
514fee23f9Smrg     return num;
524fee23f9Smrg   return res;
534fee23f9Smrg }
54