Boost logo

Boost :

From: Stjepan Rajko (stipe_at_[hidden])
Date: 2008-01-06 18:43:02


On Jan 4, 2008 3:31 AM, Alexander Nasonov <alnsn_at_[hidden]> wrote:
> Tobias Schwinger <tschwinger <at> isonews2.com> writes:
> > We actually very much want a preprocessor-generated 'switch' statement
> > because it is a special hint for optimization and most compilers
> > generate very efficient code for it...
>
> BTW,
> switch_ doesn't implement fall-though and I was worried about performance of
> this important case (bzero with Duff's device optimization):
>
> switch(n % 8)
> {
> case 7: buf[6] = 0;
> case 6: buf[5] = 0;
> case 5: buf[4] = 0;
> case 4: buf[3] = 0;
> case 3: buf[2] = 0;
> case 2: buf[1] = 0;
> case 1: buf[0] = 0;
> }
>
> switch_ would generate this code:
>
> switch(n % 8)
> {
> case 7:
> buf[6] = 0; buf[5] = 0; buf[4] = 0; buf[3] = 0;
> buf[2] = 0; buf[1] = 0; buf[0] = 0;
> break;
> case 6:
> buf[5] = 0; buf[4] = 0; buf[3] = 0;
> buf[2] = 0; buf[1] = 0; buf[0] = 0;
> break;
> case 5:
> buf[4] = 0; buf[3] = 0; buf[2] = 0; buf[1] = 0; buf[0] = 0;
> break;
> case 4:
> buf[3] = 0; buf[2] = 0; buf[1] = 0; buf[0] = 0;
> break;
> case 3:
> buf[2] = 0; buf[1] = 0; buf[0] = 0;
> break;
> case 2:
> buf[1] = 0; buf[0] = 0;
> break;
> case 1:
> buf[0] = 0;
> break;
> default:
> break;
> }
>
> Below is a program that demonstates a difference of assembly code between hand-
> crafted switch and the switch_. The are identical on gcc 3.4.6 x86_64.
>
> [snip program]

Hi Alexander,

Thanks for the example and the assembly analysis. Off the top of my
head, it doesn't seem like it would be too difficult to add support
for fall-through directly (e.g., by taking an (optional?) sequence of
MPL bool constants to specify whether a case should fall through or
break/return). Although, the difficult part might be deciding how to
deal with return values in this case.

Steven, what do you think?

Stjepan


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk