* Re: optimize div to right shift (NOT!)
[not found] <20101212172643.3EF80BC5D@yquem.inria.fr>
@ 2010-12-13 12:33 ` Jonathan Kimmitt
2010-12-13 12:58 ` [Caml-list] " Török Edwin
0 siblings, 1 reply; 4+ messages in thread
From: Jonathan Kimmitt @ 2010-12-13 12:33 UTC (permalink / raw)
To: caml-list
> A C compiler would optimize this to a right shift. Changing that to 'Int64.shift_right n 1' speeds
> up the code.
Sorry to be a pedant, but this is not correct. The optimisation is only possible when the arguments
are unsigned integers which I don't think is specifiable when working in OCAML
# Int64.shift_right (-2L) 1;;
- : int64 = -1L (So far, so good)
# Int64.div (-1L) 2L;;
- : int64 = 0L (Good)
# Int64.shift_right (-1L) 1;;
- : int64 = -1L (Duh)
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [Caml-list] Re: optimize div to right shift (NOT!)
2010-12-13 12:33 ` optimize div to right shift (NOT!) Jonathan Kimmitt
@ 2010-12-13 12:58 ` Török Edwin
2010-12-13 13:03 ` Benedikt Meurer
2010-12-13 20:13 ` Jon Harrop
0 siblings, 2 replies; 4+ messages in thread
From: Török Edwin @ 2010-12-13 12:58 UTC (permalink / raw)
To: Jonathan Kimmitt; +Cc: caml-list
On Mon, 13 Dec 2010 12:33:33 +0000
Jonathan Kimmitt <jonathan@kimmitt.co.uk> wrote:
>
> > A C compiler would optimize this to a right shift. Changing that to
> > 'Int64.shift_right n 1' speeds up the code.
>
> Sorry to be a pedant, but this is not correct. The optimisation is
> only possible when the arguments are unsigned integers
That particular program never used negative integers.
> which I don't
> think is specifiable when working in OCAML
You are right, there is no way to tell ocaml that.
>
> # Int64.shift_right (-2L) 1;;
> - : int64 = -1L (So far, so good)
> # Int64.div (-1L) 2L;;
> - : int64 = 0L (Good)
> # Int64.shift_right (-1L) 1;;
> - : int64 = -1L (Duh)
It is still possible to avoid the division, gcc generates this:
movq %rdi, %rax
shrq $63, %rax
addq %rdi, %rax
sarq %rax
Or a better example with division by 8:
leaq 7(%rdi), %rax
testq %rdi, %rdi
cmovns %rdi, %rax
sarq $3, %rax
And division by non-power of two integers can optimized by replacing it
with multiplication with its inverse (which gcc and llvm don't do for
signed divisions, only for unsigned ones):
http://www.hackersdelight.org/HDcode/magic.c.txt
http://www.hackersdelight.org/HDcode/magicu.c.txt
Best regards,
--Edwin
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [Caml-list] Re: optimize div to right shift (NOT!)
2010-12-13 12:58 ` [Caml-list] " Török Edwin
@ 2010-12-13 13:03 ` Benedikt Meurer
2010-12-13 20:13 ` Jon Harrop
1 sibling, 0 replies; 4+ messages in thread
From: Benedikt Meurer @ 2010-12-13 13:03 UTC (permalink / raw)
To: caml-list
On Dec 13, 2010, at 13:58 , Török Edwin wrote:
> It is still possible to avoid the division, gcc generates this:
> movq %rdi, %rax
> shrq $63, %rax
> addq %rdi, %rax
> sarq %rax
>
> Or a better example with division by 8:
> leaq 7(%rdi), %rax
> testq %rdi, %rdi
> cmovns %rdi, %rax
> sarq $3, %rax
ocamlopt does exactly this, atleast for x86-64.
> And division by non-power of two integers can optimized by replacing it
> with multiplication with its inverse (which gcc and llvm don't do for
> signed divisions, only for unsigned ones):
> http://www.hackersdelight.org/HDcode/magic.c.txt
> http://www.hackersdelight.org/HDcode/magicu.c.txt
The AMD64 optimization guide gives additional pointers here, i.e. it also lists replacement sequences for multiplication by constant.
> Best regards,
> --Edwin
greets,
Benedikt
^ permalink raw reply [flat|nested] 4+ messages in thread
* RE: [Caml-list] Re: optimize div to right shift (NOT!)
2010-12-13 12:58 ` [Caml-list] " Török Edwin
2010-12-13 13:03 ` Benedikt Meurer
@ 2010-12-13 20:13 ` Jon Harrop
1 sibling, 0 replies; 4+ messages in thread
From: Jon Harrop @ 2010-12-13 20:13 UTC (permalink / raw)
To: 'Török Edwin'; +Cc: caml-list
Edwin wrote:
> http://www.hackersdelight.org/HDcode/magic.c.txt
> http://www.hackersdelight.org/HDcode/magicu.c.txt
Nice! :-)
Cheers,
Jon.
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2010-12-13 20:13 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
[not found] <20101212172643.3EF80BC5D@yquem.inria.fr>
2010-12-13 12:33 ` optimize div to right shift (NOT!) Jonathan Kimmitt
2010-12-13 12:58 ` [Caml-list] " Török Edwin
2010-12-13 13:03 ` Benedikt Meurer
2010-12-13 20:13 ` Jon Harrop
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox