Using CPU flags in C

jh@clesse.com jh@clesse.com
Wed Nov 19 08:54:07 GMT 2025


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 <ubizjak@gmail.com>
> 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 <ubizjak@gmail.com>
>     Cc: H.J.Lu <hjl.tools@gmail.com>
>     Cc: Florian Weimer <fweimer@redhat.com>
>     Cc: Carlos O'Donell <carlos@redhat.com>
>     Reviewed-by: Florian Weimer <fweimer@redhat.com>
> 
> <https://sourceware.org/cgit/glibc/commit/?id=119d658ac2aad88e306b4a66c1717e5ebf86c73f>
> 
> Thanks,
> Florian
Best regards,
JH


More information about the Gcc-help mailing list