Re: Using CPU flags in C

jh--- via Gcc-help <[email protected]>
Newsgroups gmane.comp.gcc.help
Message-ID <[email protected]>
Thank you for your answer.
I'm not sure I understand it completely, could you give me some details?
Le 2025-11-18 19:42, Florian Weimer a écrit :
> * jh:
> 
>> I don't really know where to look for this information.
>> Is it possible to use the CPU status flags to communicate information
>> between inline assembly and the normal C control flow?
>> For example, an asm statement would set the Z flag and then the C code
>> would jump (for example with beq or bne in the case of ARM) without
>> using any additional variable and comparison instruction. Using a
>> dummy variable is no issue if the generated code is just the
>> conditional branch instruction.
> 
> Do you mean something like this?
> 
> commit 119d658ac2aad88e306b4a66c1717e5ebf86c73f
> Author: Uros Bizjak <[email protected]>
> Date:   Fri Aug 29 09:05:23 2025 +0200
> 
>     x86: Use flag output operands for inline asm in atomic-machine.h
> 
>     Use the flag output constraints feature available in gcc 6+
>     ("=@cc<cond>") instead of explicitly setting a boolean variable
>     with SETcc instruction.  This approach decouples the instruction
>     that sets the flags from the code that consumes them, allowing
>     the compiler to create better code when working with flags users.
Does this "=@cc<cond>" also work for ARM? Is the usage of the conditions 
documented somewhere (like Z is ==0, N==V is signed >=0). I know where 
to find the ARM definitions, but is there a place where I can check 
gcc's interpretation (i.e. which C code generates which flag access)?
>     Instead of e.g.:
> 
>        lock add %esi,(%rdi)
>        sets   %sil
>        test   %sil,%sil
>        jne    <...>
> 
>     the compiler now generates:
> 
>        lock add %esi,(%rdi)
>        js     <...>
How is this code integrated into C? Would it be used like this? But can 
I get the -6 value at the same time?
if(asm_add(36, -42)<0){
     printf("negative\n");
}else{
     printf("positive\n");
}
If yes, is it possible to at the same time set a register value and the 
flags and how would that be written?
For example, I would like to be able to set a register to any value, but 
when I set it to 0, I would like to set the Z flag (to 1 or 0) and I 
would like the compiler to jump depending on my Z flag, while being able 
to use the register value later in the C code (not going through memory 
as is done in the commit).
> 
>     No functional changes intended.
> 
>     Signed-off-by: Uros Bizjak <[email protected]>
>     Cc: H.J.Lu <[email protected]>
>     Cc: Florian Weimer <[email protected]>
>     Cc: Carlos O'Donell <[email protected]>
>     Reviewed-by: Florian Weimer <[email protected]>
> 
> <https://sourceware.org/cgit/glibc/commit/?id=119d658ac2aad88e306b4a66c1717e5ebf86c73f>
> 
> Thanks,
> Florian
Best regards,
JH
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.