<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/119849>119849</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[x86][CF]Unable to obtain the correct CF flag bit
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
zhaojiangkun-1
</td>
</tr>
</table>
<pre>
Retrieve the CF register flag bit through __readeflags() and verify if the parameters are equal.
Clang generates the 'and' instruction after compilation, and clears the CF flag after executing the 'and' instruction. Is this a bug or is it for some purpose? Resulting in the inability to obtain correct results through __readeflags().
https://godbolt.org/z/4oaWeKxY1
**How did I do it**
1)`clang -g test.c -o -test`
2)`cgdb test`
3) run to ` flags = readeflags_test (100, 101)` and debug in assembly
**the debug result**
![Image](https://github.com/user-attachments/assets/d0f6daff-e3f0-4db9-9c13-07c615cd5ea4)
**test script:**
```#include <x86intrin.h>
extern void abort (void);
#ifdef __x86_64__
#define EFLAGS_TYPE unsigned long long int
#else
#define EFLAGS_TYPE unsigned int
#endif
EFLAGS_TYPE
readeflags_test (unsigned int a, unsigned int b)
{
volatile char x = (a == b);
return __readeflags ();
}
int
main ()
{
EFLAGS_TYPE flags;
flags = readeflags_test (100, 100);
if ((flags & 1) != 0) /* Read CF */
abort ();
flags = readeflags_test (100, 101);
flags = readeflags_test(101, 100);//新增测试用例,用于验证比较对CF的影响
if ((flags & 1) == 0) /* Read CF */
abort ();
#ifdef DEBUG
printf ("PASSED\n");
#endif
return 0;
}
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJykVk2P2zYT_jXjy8AGRX1YOvgg21Le4O0hSBoUORmUNJKZyqRLUhtvfn1ByvZ6F03aogtiTc_nMw9nSAtr5aCINpBuId0vxOSO2my-H4X-KoUafp_UMlo0unvefCRnJD0RuiPhrkZDg7SODPajGLCRDt3R6Gk44uFgSHTk5RZ4DrxAoTp8IiP7Z5R9iHAWRpzIkbEoDCH9MYlxBazcjUINOJAiIxzZYAt8LVQHfI1SWWem1kmtUPQ-e6tPZzkKLwG-C4nakYSxN5wB3mxLF2onJ9Xw46grfO89pUWBzTSgNigtSoe9Nmj1ifA8mbO2BHGNH8lOY4gnVQgplWjkKN0zOo26cUIqbLUx1Do0wdj-hCVfPrDy6NzZQlwCr4HXg-4aPbqVNgPw-jvwOtHiN_r_5Us0m_vF_fqf_oad7PA9dhqlm4XAygiqGrY7yAvIWBvoXQ7oyLpVi0uNS7-FjAEr-SvToWvwRRf7c0QzKV8bQsYCsxYh3uNLJQfvgMDziDF_HhGLgPto4WQ68pxKhcJaOjXj8x28Z2_Wzjzd0QeLCNLt-5MYCNI98PwNQ9Idp2bV6hPwerJklsI50R5PpJwFXvtcYdOxPutE3y8p7tky6ZpiWbRRvGTrNovStktJJB7sndY3awbq67OtkWcXENxgZuy6eCxVO04dIcS7S55J5YxUqyPE1RyHLo6MwictOxSNNoEu_83njre3ZLHsO-rxcLjk2SFLDodZ2lEvFWFV_1K--3T49cuHCicVhrjDUath_ieVm81ptPT3ji_mqpP9veIHW2DlXxzyYwAU_rxfSZorm2tfFCLik_aTOhK2R2HwEnoHeC78xu-bOwXe2pCbjHo1KDhPypWm9X7GOcM_-Wm76h-TPlY8T9uNZK_9Z03MHs_Gu8l-TpXfYGXoGx19r8Z7ZGFYQn-W-JFE52-i0Cz1NYD_u5_-2-j_YrLubP3QJ7hEr-sIgwNVBkUGWwZVCiWHovKSbQr5FqocyhqKFKo1FAmUOVQJbKugmq-I3WtVCXkFVQFlGVTBPY98QB8n8RLvHodcNWyLXR0ClJAnXrbdwzbymyKGfH9vwZ9yPTfNf-D6PmX7avv53dX6bKRy15T8Q_npU7WHdKeA8xfXV5Py0KvsTWcCKxfdJu6KuBAL2kTrOGF5nCd8cdwkjGVi3eUiS7JEtHzdMtaIpElbHqfpOl7IDWc8iXgUsyJdc75i677vMt4mLMlZ0kSQMDoJOa7G8enkX4iFtHaiTRQVeVIsRtHQaMPTzrmibxi0vo50vzAb77RspsFCwkZpnX0J46Qbw2-CS575Kzfd7mpI95-VaEZ6eNv8rX17325PbSPdYjLj5ieXtM9z_Viejf5KrQNeB3T-nr7Cf9rwPwMAAP__GkZ9Mw">