| /* | 
 |  * This file is part of GNU CC. | 
 |  * | 
 |  * GNU CC is free software; you can redistribute it and/or modify | 
 |  * it under the terms of the GNU General Public License as published | 
 |  * by the Free Software Foundation; either version 2, or (at your | 
 |  * option) any later version. | 
 |  * | 
 |  * GNU CC is distributed in the hope that it will be useful, | 
 |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
 |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
 |  * GNU General Public License for more details. | 
 |  * | 
 |  * You should have received a copy of the GNU General Public | 
 |  * License along with GNU CC; see the file COPYING.  If not, write | 
 |  * to the Free Software Foundation, 59 Temple Place - Suite 330, | 
 |  * Boston, MA 02111-1307, USA. | 
 |  */ | 
 |  | 
 |  | 
 | #include "math.h" | 
 |  | 
 | USItype udivmodsi4 (USItype num, USItype den, word_type modwanted) | 
 | { | 
 | 	USItype bit = 1; | 
 | 	USItype res = 0; | 
 |  | 
 | 	while (den < num && bit && !(den & (1L << 31))) { | 
 | 		den <<= 1; | 
 | 		bit <<= 1; | 
 | 	} | 
 | 	while (bit) { | 
 | 		if (num >= den) { | 
 | 			num -= den; | 
 | 			res |= bit; | 
 | 		} | 
 | 		bit >>= 1; | 
 | 		den >>= 1; | 
 | 	} | 
 | 	if (modwanted) | 
 | 		return num; | 
 | 	return res; | 
 | } | 
 |  | 
 |  | 
 | SItype __divsi3 (SItype a, SItype b) | 
 | { | 
 | 	word_type neg = 0; | 
 | 	SItype res; | 
 |  | 
 | 	if (a < 0) { | 
 | 		a = -a; | 
 | 		neg = !neg; | 
 | 	} | 
 |  | 
 | 	if (b < 0) { | 
 | 		b = -b; | 
 | 		neg = !neg; | 
 | 	} | 
 |  | 
 | 	res = udivmodsi4 (a, b, 0); | 
 |  | 
 | 	if (neg) | 
 | 		res = -res; | 
 |  | 
 | 	return res; | 
 | } | 
 |  | 
 |  | 
 | SItype __modsi3 (SItype a, SItype b) | 
 | { | 
 | 	word_type neg = 0; | 
 | 	SItype res; | 
 |  | 
 | 	if (a < 0) { | 
 | 		a = -a; | 
 | 		neg = 1; | 
 | 	} | 
 |  | 
 | 	if (b < 0) | 
 | 		b = -b; | 
 |  | 
 | 	res = udivmodsi4 (a, b, 1); | 
 |  | 
 | 	if (neg) | 
 | 		res = -res; | 
 |  | 
 | 	return res; | 
 | } | 
 |  | 
 |  | 
 | SItype __udivsi3 (SItype a, SItype b) | 
 | { | 
 | 	return udivmodsi4 (a, b, 0); | 
 | } | 
 |  | 
 |  | 
 | SItype __umodsi3 (SItype a, SItype b) | 
 | { | 
 | 	return udivmodsi4 (a, b, 1); | 
 | } |