diff options
Diffstat (limited to 'compiler-rt/lib/builtins/udivsi3.c')
-rw-r--r-- | compiler-rt/lib/builtins/udivsi3.c | 58 |
1 files changed, 28 insertions, 30 deletions
diff --git a/compiler-rt/lib/builtins/udivsi3.c b/compiler-rt/lib/builtins/udivsi3.c index 28fec70b6ed..b5f326ad7c1 100644 --- a/compiler-rt/lib/builtins/udivsi3.c +++ b/compiler-rt/lib/builtins/udivsi3.c @@ -1,56 +1,54 @@ -/* ===-- udivsi3.c - Implement __udivsi3 -----------------------------------=== - * - * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. - * See https://llvm.org/LICENSE.txt for license information. - * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - * - * ===----------------------------------------------------------------------=== - * - * This file implements __udivsi3 for the compiler_rt library. - * - * ===----------------------------------------------------------------------=== - */ +//===-- udivsi3.c - Implement __udivsi3 -----------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file implements __udivsi3 for the compiler_rt library. +// +//===----------------------------------------------------------------------===// #include "int_lib.h" -/* Returns: a / b */ +// Returns: a / b -/* Translated from Figure 3-40 of The PowerPC Compiler Writer's Guide */ +// Translated from Figure 3-40 of The PowerPC Compiler Writer's Guide -/* This function should not call __divsi3! */ +// This function should not call __divsi3! COMPILER_RT_ABI su_int __udivsi3(su_int n, su_int d) { const unsigned n_uword_bits = sizeof(su_int) * CHAR_BIT; su_int q; su_int r; unsigned sr; - /* special cases */ + // special cases if (d == 0) - return 0; /* ?! */ + return 0; // ?! if (n == 0) return 0; sr = __builtin_clz(d) - __builtin_clz(n); - /* 0 <= sr <= n_uword_bits - 1 or sr large */ - if (sr > n_uword_bits - 1) /* d > r */ + // 0 <= sr <= n_uword_bits - 1 or sr large + if (sr > n_uword_bits - 1) // d > r return 0; - if (sr == n_uword_bits - 1) /* d == 1 */ + if (sr == n_uword_bits - 1) // d == 1 return n; ++sr; - /* 1 <= sr <= n_uword_bits - 1 */ - /* Not a special case */ + // 1 <= sr <= n_uword_bits - 1 + // Not a special case q = n << (n_uword_bits - sr); r = n >> sr; su_int carry = 0; for (; sr > 0; --sr) { - /* r:q = ((r:q) << 1) | carry */ + // r:q = ((r:q) << 1) | carry r = (r << 1) | (q >> (n_uword_bits - 1)); q = (q << 1) | carry; - /* carry = 0; - * if (r.all >= d.all) - * { - * r.all -= d.all; - * carry = 1; - * } - */ + // carry = 0; + // if (r.all >= d.all) + // { + // r.all -= d.all; + // carry = 1; + // } const si_int s = (si_int)(d - r - 1) >> (n_uword_bits - 1); carry = s & 1; r -= d & s; |