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~