Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /* This has so very few changes over libgcc2's __udivmoddi4 it isn't funny.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4) #include <math-emu/soft-fp.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6) #undef count_leading_zeros
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7) #define count_leading_zeros  __FP_CLZ
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) _fp_udivmodti4(_FP_W_TYPE q[2], _FP_W_TYPE r[2],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) 	       _FP_W_TYPE n1, _FP_W_TYPE n0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) 	       _FP_W_TYPE d1, _FP_W_TYPE d0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14)   _FP_W_TYPE q0, q1, r0, r1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15)   _FP_I_TYPE b, bm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17)   if (d1 == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) #if !UDIV_NEEDS_NORMALIZATION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20)       if (d0 > n1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) 	  /* 0q = nn / 0D */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) 	  udiv_qrnnd (q0, n0, n1, n0, d0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) 	  q1 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) 	  /* Remainder in n0.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29)       else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) 	  /* qq = NN / 0d */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) 	  if (d0 == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) 	    d0 = 1 / d0;	/* Divide intentionally by zero.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) 	  udiv_qrnnd (q1, n1, 0, n1, d0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) 	  udiv_qrnnd (q0, n0, n1, n0, d0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) 	  /* Remainder in n0.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42)       r0 = n0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43)       r1 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) #else /* UDIV_NEEDS_NORMALIZATION */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47)       if (d0 > n1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 	  /* 0q = nn / 0D */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 	  count_leading_zeros (bm, d0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 	  if (bm != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 	    {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 	      /* Normalize, i.e. make the most significant bit of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 		 denominator set.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 	      d0 = d0 << bm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 	      n1 = (n1 << bm) | (n0 >> (_FP_W_TYPE_SIZE - bm));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 	      n0 = n0 << bm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 	    }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 	  udiv_qrnnd (q0, n0, n1, n0, d0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 	  q1 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 	  /* Remainder in n0 >> bm.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68)       else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 	  /* qq = NN / 0d */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 	  if (d0 == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 	    d0 = 1 / d0;	/* Divide intentionally by zero.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 	  count_leading_zeros (bm, d0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 	  if (bm == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 	    {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 	      /* From (n1 >= d0) /\ (the most significant bit of d0 is set),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 		 conclude (the most significant bit of n1 is set) /\ (the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 		 leading quotient digit q1 = 1).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 		 This special case is necessary, not an optimization.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 		 (Shifts counts of SI_TYPE_SIZE are undefined.)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 	      n1 -= d0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 	      q1 = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 	    }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 	  else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 	    {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 	      _FP_W_TYPE n2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 	      /* Normalize.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 	      b = _FP_W_TYPE_SIZE - bm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 	      d0 = d0 << bm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 	      n2 = n1 >> b;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 	      n1 = (n1 << bm) | (n0 >> b);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 	      n0 = n0 << bm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 	      udiv_qrnnd (q1, n1, n2, n1, d0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 	    }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 	  /* n1 != d0...  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 	  udiv_qrnnd (q0, n0, n1, n0, d0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 	  /* Remainder in n0 >> bm.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112)       r0 = n0 >> bm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113)       r1 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) #endif /* UDIV_NEEDS_NORMALIZATION */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116)   else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117)     {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118)       if (d1 > n1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 	  /* 00 = nn / DD */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 	  q0 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 	  q1 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 	  /* Remainder in n1n0.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 	  r0 = n0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 	  r1 = n1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129)       else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 	  /* 0q = NN / dd */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 	  count_leading_zeros (bm, d1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 	  if (bm == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 	    {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 	      /* From (n1 >= d1) /\ (the most significant bit of d1 is set),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 		 conclude (the most significant bit of n1 is set) /\ (the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 		 quotient digit q0 = 0 or 1).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) 		 This special case is necessary, not an optimization.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) 	      /* The condition on the next line takes advantage of that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 		 n1 >= d1 (true due to program flow).  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 	      if (n1 > d1 || n0 >= d0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 		  q0 = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 		  sub_ddmmss (n1, n0, n1, n0, d1, d0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 	      else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 		q0 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) 	      q1 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 	      r0 = n0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 	      r1 = n1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) 	    }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) 	  else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) 	    {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) 	      _FP_W_TYPE m1, m0, n2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) 	      /* Normalize.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) 	      b = _FP_W_TYPE_SIZE - bm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) 	      d1 = (d1 << bm) | (d0 >> b);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) 	      d0 = d0 << bm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) 	      n2 = n1 >> b;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) 	      n1 = (n1 << bm) | (n0 >> b);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) 	      n0 = n0 << bm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) 	      udiv_qrnnd (q0, n1, n2, n1, d1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 	      umul_ppmm (m1, m0, q0, d0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) 	      if (m1 > n1 || (m1 == n1 && m0 > n0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) 		  q0--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) 		  sub_ddmmss (m1, m0, m1, m0, d1, d0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 	      q1 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) 	      /* Remainder in (n1n0 - m1m0) >> bm.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 	      sub_ddmmss (n1, n0, n1, n0, m1, m0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) 	      r0 = (n1 << b) | (n0 >> bm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 	      r1 = n1 >> bm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) 	    }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190)   q[0] = q0; q[1] = q1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191)   r[0] = r0, r[1] = r1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) }