"Pavan Nikhilesh Bhagavatula" <pbhagavat...@marvell.com> wrote Thursday, March 
28, 2019 6:35 AM:

Hi Stefan,

Thanks for the heads up, I am planning to use a modified version of
https://github.com/hcs0/Hackers-Delight/blob/master/divluh.c.txt
for simplicity as we don't require the remainder.

Why don't you refer to the ORIGINAL source
<https://www.hackersdelight.org/hdcodetxt/divluh.c.txt> instead?

BUT: you also shouldn't use these routines, they too show quite bad
    implementations of a binary division!
    As Don Knuth wrote in volume 2 of TAoCP, hardware implementations
    are most often NOT well-suited for implementation in software.

Take a look at the following STRAIGHTFORWARD implementation, both
in ANSI C and x86 assembly (for Microsoft's Visual C compiler):

unsigned long long divide(unsigned long long dividendlow,
                         unsigned long long dividendhigh,
                         unsigned long long divisor,
                         unsigned long long *remainder)
{
#ifndef _M_IX86
   unsigned int shift = 64;

   do
   {
       if (dividendhigh < divisor)
       {
           dividendhigh <<= 1;
           dividendhigh |= dividendlow >> 63;
           dividendlow <<= 1;
       }
       else
       {
           dividendhigh -= divisor;
           dividendhigh <<= 1;
           dividendhigh |= dividendlow >> 63;
           dividendlow <<= 1;
           dividendlow |= 1;
       }
   } while (--shift != 0);

   if (*remainder != NULL)
       remainder = dividendhigh;

   return dividendlow;
#else
   __asm
   {
       mov    eax, dword ptr dividendlow
       mov    edx, dword ptr dividendlow+4
       mov    ecx, dword ptr dividendhigh
       mov    ebx, dword ptr dividendhigh+4
       mov    edi, dword ptr divisor
       mov    esi, dword ptr divisor+4
       mov    ebp, 64

   NEXT:
       cmp    ebx, esi
       ja     SUBTRACT
       jb     SHIFT
       cmp    ecx, edi
       jb     SHIFT

   SUBTRACT:
       sub    ecx, edi
       sbb    ebx, esi

   SHIFT:
       cmc
       adc    eax, eax
       adc    edx, edx
       adc    ecx, ecx
       adc    ebx, ebx
       dec    ebp
       jnz    NEXT

       or     ebp, remainder
       jz     EXIT

       mov    [ebp], ecx
       mov    [ebp+4], ebx
   EXIT:
   }
#endif
}


-----Original Message-----
From: dev <dev-boun...@dpdk.org> On Behalf Of Stefan Kanthak
Sent: Tuesday, March 26, 2019 6:41 AM
To: dev@dpdk.org
Cc: han...@stressinduktion.org
Subject: [dpdk-dev] [BUG] Maintainer for
lib/librte_eal/common/rte_reciprocal.c?

Hi @ll,

<https://git.dpdk.org/dpdk/plain/MAINTAINERS> does NOT list a maintainer
for lib/librte_eal/common/rte_reciprocal.c

Whoever it is should take a close look at <https://skanthak.homepage.t-
online.de/division.html>,
then fix the most obvious bug plus the many deficiencies of
divide_128_div_64_to_64().

regards
Stefan Kanthak

Reply via email to