Some divisors, like 7, do not have a reciprocal that can be contained within 32 bits. Expanding to 64 bits, however, is a clever approach that I overlooked, since you can permit some loss of precision (the reason why the bit shift is required) due to the limited range. This might be worth exploring.
Gareth aka. Kit On Tue 24/08/21 20:14 , "Marģers . via" fpc-develfpc-de...@lists.freepascal.org sent: > I came up with even shorter variant of div > example > function teDWordDivBy7_v4( divided : dword):dword; assembler; > nostackframe; > asm > mov ecx,divided > mov rax,2635249153693862181 > mul rcx > mov eax,edx > end; > > current version for comparison > > function teDWordDivBy7_v0( divided : dword):dword; assembler; > nostackframe; > asm > mov ecx,divided > mov eax,613566757 > mul ecx > add edx,ecx > rcr edx,1 > shr edx,2 > mov eax,edx > end; > > > > > > > _______________________________________________ > fpc-devel maillist - fpc-devel@lists.freepascal.org > https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel [1] > > > > Links: > ------ > [1] > http://secureweb.fast.net.uk/parse.php?redirect=https://lists.freepascal.or > g/cgi-bin/mailman/listinfo/fpc-devel > _______________________________________________ fpc-devel maillist - fpc-devel@lists.freepascal.org https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel