hc
2024-01-31 f9004dbfff8a3fbbd7e2a88c8a4327c7f2f8e5b2
kernel/include/asm-generic/div64.h
....@@ -28,12 +28,12 @@
2828
2929 /**
3030 * do_div - returns 2 values: calculate remainder and update new dividend
31
- * @n: pointer to uint64_t dividend (will be updated)
31
+ * @n: uint64_t dividend (will be updated)
3232 * @base: uint32_t divisor
3333 *
3434 * Summary:
35
- * ``uint32_t remainder = *n % base;``
36
- * ``*n = *n / base;``
35
+ * ``uint32_t remainder = n % base;``
36
+ * ``n = n / base;``
3737 *
3838 * Return: (uint32_t)remainder
3939 *
....@@ -178,7 +178,8 @@
178178 uint32_t m_hi = m >> 32;
179179 uint32_t n_lo = n;
180180 uint32_t n_hi = n >> 32;
181
- uint64_t res, tmp;
181
+ uint64_t res;
182
+ uint32_t res_lo, res_hi, tmp;
182183
183184 if (!bias) {
184185 res = ((uint64_t)m_lo * n_lo) >> 32;
....@@ -187,8 +188,9 @@
187188 res = (m + (uint64_t)m_lo * n_lo) >> 32;
188189 } else {
189190 res = m + (uint64_t)m_lo * n_lo;
190
- tmp = (res < m) ? (1ULL << 32) : 0;
191
- res = (res >> 32) + tmp;
191
+ res_lo = res >> 32;
192
+ res_hi = (res_lo < m_hi);
193
+ res = res_lo | ((uint64_t)res_hi << 32);
192194 }
193195
194196 if (!(m & ((1ULL << 63) | (1ULL << 31)))) {
....@@ -197,10 +199,12 @@
197199 res += (uint64_t)m_hi * n_lo;
198200 res >>= 32;
199201 } else {
200
- tmp = res += (uint64_t)m_lo * n_hi;
202
+ res += (uint64_t)m_lo * n_hi;
203
+ tmp = res >> 32;
201204 res += (uint64_t)m_hi * n_lo;
202
- tmp = (res < tmp) ? (1ULL << 32) : 0;
203
- res = (res >> 32) + tmp;
205
+ res_lo = res >> 32;
206
+ res_hi = (res_lo < tmp);
207
+ res = res_lo | ((uint64_t)res_hi << 32);
204208 }
205209
206210 res += (uint64_t)m_hi * n_hi;