Re: Using CPU flags in C
Matthias Pfaller <[email protected]>
| Newsgroups | gmane.comp.gcc.help |
|---|---|
| Organization | marco Systemanalyse und Entwicklung GmbH |
| Message-ID | <[email protected]> |
On the question about arm support I would suggest calling "info gcc" and searching for "@cc". It would be a real shame not to use the nice documentation the gcc developers provide. regards, Matthias On 2025-11-19 09:54, jh--- via Gcc-help wrote: > 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 -- Matthias Pfaller Software Entwicklung marco Systemanalyse und Entwicklung GmbH Tel +49 8131 5161 41 Hans-Böckler-Str. 2, D 85221 Dachau Fax +49 8131 5161 66 https://www.marco.de Email [email protected] Geschäftsführer Martin Reuter, Torsten Lukas HRB 171775 Amtsgericht München