
A newer toolchain will emit udivmoddi4 for certain divide + modulo operations instead of a separate divide and modulo operation. AFAIU, this would be sufficient.
Signed-off-by: Christian Melki christian.melki@t2data.com --- arch/x86/lib/div64.c | 5 +++++ 1 file changed, 5 insertions(+)
diff --git a/arch/x86/lib/div64.c b/arch/x86/lib/div64.c index 2bea205f60..a5b536fbc5 100644 --- a/arch/x86/lib/div64.c +++ b/arch/x86/lib/div64.c @@ -110,3 +110,8 @@ u64 __umoddi3(u64 num, u64 den) _64bit_divide(num, den, &v); return v; } + +u64 __udivmoddi4(u64 num, u64 den, u64 *rem) +{ + return _64bit_divide(num, den, rem); +}

On Mon, Jun 07, 2021 at 11:20:47AM +0200, Christian Melki wrote:
A newer toolchain will emit udivmoddi4 for certain divide + modulo operations instead of a separate divide and modulo operation. AFAIU, this would be sufficient.
Signed-off-by: Christian Melki christian.melki@t2data.com
arch/x86/lib/div64.c | 5 +++++ 1 file changed, 5 insertions(+)
diff --git a/arch/x86/lib/div64.c b/arch/x86/lib/div64.c index 2bea205f60..a5b536fbc5 100644 --- a/arch/x86/lib/div64.c +++ b/arch/x86/lib/div64.c @@ -110,3 +110,8 @@ u64 __umoddi3(u64 num, u64 den) _64bit_divide(num, den, &v); return v; }
+u64 __udivmoddi4(u64 num, u64 den, u64 *rem) +{
- return _64bit_divide(num, den, rem);
+}
How do you trigger this and should you not be using do_div(), etc, instead?

On 6/9/21 8:31 PM, Tom Rini wrote:
On Mon, Jun 07, 2021 at 11:20:47AM +0200, Christian Melki wrote:
A newer toolchain will emit udivmoddi4 for certain divide + modulo operations instead of a separate divide and modulo operation. AFAIU, this would be sufficient.
Signed-off-by: Christian Melki christian.melki@t2data.com
arch/x86/lib/div64.c | 5 +++++ 1 file changed, 5 insertions(+)
diff --git a/arch/x86/lib/div64.c b/arch/x86/lib/div64.c index 2bea205f60..a5b536fbc5 100644 --- a/arch/x86/lib/div64.c +++ b/arch/x86/lib/div64.c @@ -110,3 +110,8 @@ u64 __umoddi3(u64 num, u64 den) _64bit_divide(num, den, &v); return v; }
+u64 __udivmoddi4(u64 num, u64 den, u64 *rem) +{
- return _64bit_divide(num, den, rem);
+}
How do you trigger this and should you not be using do_div(), etc, instead?
I probably should. Was trying to minimize various dependencies on u-boot code (atleast with function separation) while trying to implement a redundancy boot mechanism as a cmd. Triggered by using two consecutive calls between the same variables for division and remainder as pure operands with a gcc 9.3 x86 toolchain.
U-boot has no div_up afaik?
a = b / c; if (b % c) { a++; }
b / c and b % c gets optimized / translated to udivmoddi4 as one operation.

On Wed, Jun 09, 2021 at 09:20:20PM +0200, Christian Melki wrote:
On 6/9/21 8:31 PM, Tom Rini wrote:
On Mon, Jun 07, 2021 at 11:20:47AM +0200, Christian Melki wrote:
A newer toolchain will emit udivmoddi4 for certain divide + modulo operations instead of a separate divide and modulo operation. AFAIU, this would be sufficient.
Signed-off-by: Christian Melki christian.melki@t2data.com
arch/x86/lib/div64.c | 5 +++++ 1 file changed, 5 insertions(+)
diff --git a/arch/x86/lib/div64.c b/arch/x86/lib/div64.c index 2bea205f60..a5b536fbc5 100644 --- a/arch/x86/lib/div64.c +++ b/arch/x86/lib/div64.c @@ -110,3 +110,8 @@ u64 __umoddi3(u64 num, u64 den) _64bit_divide(num, den, &v); return v; }
+u64 __udivmoddi4(u64 num, u64 den, u64 *rem) +{
- return _64bit_divide(num, den, rem);
+}
How do you trigger this and should you not be using do_div(), etc, instead?
I probably should. Was trying to minimize various dependencies on u-boot code (atleast with function separation) while trying to implement a redundancy boot mechanism as a cmd. Triggered by using two consecutive calls between the same variables for division and remainder as pure operands with a gcc 9.3 x86 toolchain.
U-boot has no div_up afaik?
a = b / c; if (b % c) { a++; }
b / c and b % c gets optimized / translated to udivmoddi4 as one operation.
I think you should look at include/div64.h and see if what you want is handled by something there already.
participants (2)
-
Christian Melki
-
Tom Rini