[PATCH] Add udivmoddi4.

Christian Melki christian.melki at t2data.com
Wed Jun 9 21:20:20 CEST 2021


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 at 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.


More information about the U-Boot mailing list