1*a67ef280SAlexey Brodkin /* 2*a67ef280SAlexey Brodkin * Copyright (C) 1989-2013 Free Software Foundation, Inc. 3*a67ef280SAlexey Brodkin * 4*a67ef280SAlexey Brodkin * SPDX-License-Identifier: GPL-2.0+ 5*a67ef280SAlexey Brodkin */ 6*a67ef280SAlexey Brodkin 7*a67ef280SAlexey Brodkin #include "libgcc2.h" 8*a67ef280SAlexey Brodkin 9*a67ef280SAlexey Brodkin DWtype 10*a67ef280SAlexey Brodkin __ashldi3(DWtype u, shift_count_type b) 11*a67ef280SAlexey Brodkin { 12*a67ef280SAlexey Brodkin if (b == 0) 13*a67ef280SAlexey Brodkin return u; 14*a67ef280SAlexey Brodkin 15*a67ef280SAlexey Brodkin const DWunion uu = {.ll = u}; 16*a67ef280SAlexey Brodkin const shift_count_type bm = W_TYPE_SIZE - b; 17*a67ef280SAlexey Brodkin DWunion w; 18*a67ef280SAlexey Brodkin 19*a67ef280SAlexey Brodkin if (bm <= 0) { 20*a67ef280SAlexey Brodkin w.s.low = 0; 21*a67ef280SAlexey Brodkin w.s.high = (UWtype)uu.s.low << -bm; 22*a67ef280SAlexey Brodkin } else { 23*a67ef280SAlexey Brodkin const UWtype carries = (UWtype) uu.s.low >> bm; 24*a67ef280SAlexey Brodkin 25*a67ef280SAlexey Brodkin w.s.low = (UWtype)uu.s.low << b; 26*a67ef280SAlexey Brodkin w.s.high = ((UWtype)uu.s.high << b) | carries; 27*a67ef280SAlexey Brodkin } 28*a67ef280SAlexey Brodkin 29*a67ef280SAlexey Brodkin return w.ll; 30*a67ef280SAlexey Brodkin } 31*a67ef280SAlexey Brodkin 32*a67ef280SAlexey Brodkin DWtype 33*a67ef280SAlexey Brodkin __ashrdi3(DWtype u, shift_count_type b) 34*a67ef280SAlexey Brodkin { 35*a67ef280SAlexey Brodkin if (b == 0) 36*a67ef280SAlexey Brodkin return u; 37*a67ef280SAlexey Brodkin 38*a67ef280SAlexey Brodkin const DWunion uu = {.ll = u}; 39*a67ef280SAlexey Brodkin const shift_count_type bm = W_TYPE_SIZE - b; 40*a67ef280SAlexey Brodkin DWunion w; 41*a67ef280SAlexey Brodkin 42*a67ef280SAlexey Brodkin if (bm <= 0) { 43*a67ef280SAlexey Brodkin /* w.s.high = 1..1 or 0..0 */ 44*a67ef280SAlexey Brodkin w.s.high = uu.s.high >> (W_TYPE_SIZE - 1); 45*a67ef280SAlexey Brodkin w.s.low = uu.s.high >> -bm; 46*a67ef280SAlexey Brodkin } else { 47*a67ef280SAlexey Brodkin const UWtype carries = (UWtype) uu.s.high << bm; 48*a67ef280SAlexey Brodkin 49*a67ef280SAlexey Brodkin w.s.high = uu.s.high >> b; 50*a67ef280SAlexey Brodkin w.s.low = ((UWtype)uu.s.low >> b) | carries; 51*a67ef280SAlexey Brodkin } 52*a67ef280SAlexey Brodkin 53*a67ef280SAlexey Brodkin return w.ll; 54*a67ef280SAlexey Brodkin } 55*a67ef280SAlexey Brodkin 56*a67ef280SAlexey Brodkin DWtype 57*a67ef280SAlexey Brodkin __lshrdi3(DWtype u, shift_count_type b) 58*a67ef280SAlexey Brodkin { 59*a67ef280SAlexey Brodkin if (b == 0) 60*a67ef280SAlexey Brodkin return u; 61*a67ef280SAlexey Brodkin 62*a67ef280SAlexey Brodkin const DWunion uu = {.ll = u}; 63*a67ef280SAlexey Brodkin const shift_count_type bm = W_TYPE_SIZE - b; 64*a67ef280SAlexey Brodkin DWunion w; 65*a67ef280SAlexey Brodkin 66*a67ef280SAlexey Brodkin if (bm <= 0) { 67*a67ef280SAlexey Brodkin w.s.high = 0; 68*a67ef280SAlexey Brodkin w.s.low = (UWtype)uu.s.high >> -bm; 69*a67ef280SAlexey Brodkin } else { 70*a67ef280SAlexey Brodkin const UWtype carries = (UWtype)uu.s.high << bm; 71*a67ef280SAlexey Brodkin 72*a67ef280SAlexey Brodkin w.s.high = (UWtype)uu.s.high >> b; 73*a67ef280SAlexey Brodkin w.s.low = ((UWtype)uu.s.low >> b) | carries; 74*a67ef280SAlexey Brodkin } 75*a67ef280SAlexey Brodkin 76*a67ef280SAlexey Brodkin return w.ll; 77*a67ef280SAlexey Brodkin } 78*a67ef280SAlexey Brodkin 79*a67ef280SAlexey Brodkin unsigned long 80*a67ef280SAlexey Brodkin udivmodsi4(unsigned long num, unsigned long den, int modwanted) 81*a67ef280SAlexey Brodkin { 82*a67ef280SAlexey Brodkin unsigned long bit = 1; 83*a67ef280SAlexey Brodkin unsigned long res = 0; 84*a67ef280SAlexey Brodkin 85*a67ef280SAlexey Brodkin while (den < num && bit && !(den & (1L<<31))) { 86*a67ef280SAlexey Brodkin den <<= 1; 87*a67ef280SAlexey Brodkin bit <<= 1; 88*a67ef280SAlexey Brodkin } 89*a67ef280SAlexey Brodkin 90*a67ef280SAlexey Brodkin while (bit) { 91*a67ef280SAlexey Brodkin if (num >= den) { 92*a67ef280SAlexey Brodkin num -= den; 93*a67ef280SAlexey Brodkin res |= bit; 94*a67ef280SAlexey Brodkin } 95*a67ef280SAlexey Brodkin bit >>= 1; 96*a67ef280SAlexey Brodkin den >>= 1; 97*a67ef280SAlexey Brodkin } 98*a67ef280SAlexey Brodkin 99*a67ef280SAlexey Brodkin if (modwanted) 100*a67ef280SAlexey Brodkin return num; 101*a67ef280SAlexey Brodkin 102*a67ef280SAlexey Brodkin return res; 103*a67ef280SAlexey Brodkin } 104*a67ef280SAlexey Brodkin 105*a67ef280SAlexey Brodkin long 106*a67ef280SAlexey Brodkin __divsi3(long a, long b) 107*a67ef280SAlexey Brodkin { 108*a67ef280SAlexey Brodkin int neg = 0; 109*a67ef280SAlexey Brodkin long res; 110*a67ef280SAlexey Brodkin 111*a67ef280SAlexey Brodkin if (a < 0) { 112*a67ef280SAlexey Brodkin a = -a; 113*a67ef280SAlexey Brodkin neg = !neg; 114*a67ef280SAlexey Brodkin } 115*a67ef280SAlexey Brodkin 116*a67ef280SAlexey Brodkin if (b < 0) { 117*a67ef280SAlexey Brodkin b = -b; 118*a67ef280SAlexey Brodkin neg = !neg; 119*a67ef280SAlexey Brodkin } 120*a67ef280SAlexey Brodkin 121*a67ef280SAlexey Brodkin res = udivmodsi4(a, b, 0); 122*a67ef280SAlexey Brodkin 123*a67ef280SAlexey Brodkin if (neg) 124*a67ef280SAlexey Brodkin res = -res; 125*a67ef280SAlexey Brodkin 126*a67ef280SAlexey Brodkin return res; 127*a67ef280SAlexey Brodkin } 128*a67ef280SAlexey Brodkin 129*a67ef280SAlexey Brodkin long 130*a67ef280SAlexey Brodkin __modsi3(long a, long b) 131*a67ef280SAlexey Brodkin { 132*a67ef280SAlexey Brodkin int neg = 0; 133*a67ef280SAlexey Brodkin long res; 134*a67ef280SAlexey Brodkin 135*a67ef280SAlexey Brodkin if (a < 0) { 136*a67ef280SAlexey Brodkin a = -a; 137*a67ef280SAlexey Brodkin neg = 1; 138*a67ef280SAlexey Brodkin } 139*a67ef280SAlexey Brodkin 140*a67ef280SAlexey Brodkin if (b < 0) 141*a67ef280SAlexey Brodkin b = -b; 142*a67ef280SAlexey Brodkin 143*a67ef280SAlexey Brodkin res = udivmodsi4(a, b, 1); 144*a67ef280SAlexey Brodkin 145*a67ef280SAlexey Brodkin if (neg) 146*a67ef280SAlexey Brodkin res = -res; 147*a67ef280SAlexey Brodkin 148*a67ef280SAlexey Brodkin return res; 149*a67ef280SAlexey Brodkin } 150*a67ef280SAlexey Brodkin 151*a67ef280SAlexey Brodkin long 152*a67ef280SAlexey Brodkin __udivsi3(long a, long b) 153*a67ef280SAlexey Brodkin { 154*a67ef280SAlexey Brodkin return udivmodsi4(a, b, 0); 155*a67ef280SAlexey Brodkin } 156*a67ef280SAlexey Brodkin 157*a67ef280SAlexey Brodkin long 158*a67ef280SAlexey Brodkin __umodsi3(long a, long b) 159*a67ef280SAlexey Brodkin { 160*a67ef280SAlexey Brodkin return udivmodsi4(a, b, 1); 161*a67ef280SAlexey Brodkin } 162