On 05/07/2015 06:20 PM, H. Peter Anvin wrote:
> This is a separate issue which really shouldn't have anything to do with
> this, but is there a specific reason why:
> 
> void good1(int x, int y)
> {
>   _Bool pf;
> 
>   asm("cmpl %2,%1"
>       : "=@ccp" (pf)
>       : "r" (x), "g" (y));
> 
>   if (pf)
>     beta();
> }
> 
> ... ends up generating a jump to a jump?
> 
> 0000000000000000 <good1>:
>    0:   39 f7                   cmp    %esi,%edi
>    2:   7a 0c                   jp     10 <good1+0x10>
>    4:   f3 c3                   repz retq
>    6:   66 2e 0f 1f 84 00 00    nopw   %cs:0x0(%rax,%rax,1)
>    d:   00 00 00
>   10:   e9 00 00 00 00          jmpq   15 <good1+0x15>
>                         11: R_X86_64_PC32       beta-0x4
>   15:   66 66 2e 0f 1f 84 00    data32 nopw %cs:0x0(%rax,%rax,1)
>   1c:   00 00 00 00
> 

Yes, the i386 backend has not implemented conditional sibcalls.  AFAIK the only
targets that have done that are ones with predication: ia64 and maybe arm32.

It could certainly be done; I've no idea off hand how difficult it might be.  I
suspect that some new code has to be written generically in order to enable it.


r~

Reply via email to