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