Message ID | 20210607092047.13246-1-christian.melki@t2data.com |
---|---|
State | Changes Requested |
Delegated to: | Bin Meng |
Headers | show |
Series | Add udivmoddi4. | expand |
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.
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); +}
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(+)