<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/134663>134663</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[ARM32][compiler-rt] movle Condition Fails After __aeabi_cdcmple Due to Inconsistent CPSR Flags Across libgcc/libunwind
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
dongjianqiang2
</td>
</tr>
</table>
<pre>
Hi, I compiled the Luajit with clang, and found the __aeabi_cdcmple fails to set CPSR Flags correctly for movle insn.
https://github.com/LuaJIT/LuaJIT/blob/v2.1/src/vm_arm.dasc#L1705
```
#include <stdio.h>
#include <stdint.h>
extern void __aeabi_cdcmple(double a, double b);
void test_with_movle() {
uint32_t cpsr;
uint32_t r0_val, r1_val;
__asm__ __volatile__(
// Set initial register values
"mov r0, #0x0\n\t" // a_low = 0x0
"ldr r1, =0xBFF00000\n\t" // a_high = 0xBFF00000 → a = -1.0
"mov r2, #0x1\n\t" // b_low = 0x1
"ldr r3, =0x40000000\n\t" // b_high = 0x40000000 → b = 2.0
// Call comparison function (modifies CPSR)
"bl __aeabi_cdcmple\n\t"
// Conditional move: if a <= b (LE condition true), r0 = r2, r1 = r3
"movle r0, r2\n\t" // If LE, move b_low to r0
"movle r1, r3\n\t" // If LE, move b_high to r1
// Save registers to variables
"mov %0, r0\n\t" // Save r0 to r0_val
"mov %1, r1\n\t" // Save r1 to r1_val
"mrs %2, cpsr\n\t" // Save CPSR
: "=r" (r0_val), "=r" (r1_val), "=r" (cpsr)
:
: "r0", "r1", "r2", "r3", "lr", "cc", "memory"
);
// Extract CPSR flags
int N = (cpsr >> 31) & 1; // Bit 31: N (Negative)
int Z = (cpsr >> 30) & 1; // Bit 30: Z (Zero)
int C = (cpsr >> 29) & 1; // Bit 29: C (Carry)
int V = (cpsr >> 28) & 1; // Bit 28: V (Overflow)
// Print results
printf("After movle:\n");
printf("r0 = 0x%08X, r1 = 0x%08X\n", r0_val, r1_val);
printf("Flags: N=%d, Z=%d, C=%d, V=%d\n", N, Z, C, V);
}
int main() {
test_with_movle();
return 0;
}
```
gcc with libgcc:
After movle:
r0 = 0x00000001, r1 = 0x40000000
Flags: N=1, Z=0, C=0, V=0
clang with compiler-rt:
After movle:
r0 = 0x00000000, r1 = 0xBFF00000
Flags: N=0, Z=0, C=0, V=0
Is this a compatibility issue between Clang and GCC?
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJyMVlFv4roS_jXmxSpybALkgYc0kHt71btntXu0OupL5CQGvHLsHtuh7b8_GidAUsLuQZU64JlvPn8ee4Y7Jw9aiA2KH1G8nfHWH43d1EYffkqu_5ZcH-isNPXH5r8S0Qw_4co0r1KJGvujwM8t_yk9fpP-iCvF9QF8uK7x3rS6cykKLngpi6qumlcl8J5L5bA32AmPs6_fv-Fc8YPDlbFWVF594L2xuDEnJbDUTs8RSRFJj96_OsRSRHNE84P0x7acV6ZBNH9u-f-e_hwapTIlovmJziNEc2cr-NIU3DbzmrsKUfYcrUjcIaMl6f9IiiiTulJtLTBimfO1NPMjYrvJJe0vayQV715YjU9G1p-3jOi6Nm2pBOYgT2-XiCaIPXbRIcwL5wuQsgi7R3SNaILRCnwwxriV2jNaeFy9OtuFjn62pDhxBSlsFKwzOngVBXdNUeCiOBnFvVSiKCBDtwqfTln8XXgstfSSK2zFQTovLD5x1Qo3cqaNOWFLIB2ijLwTFGcaxZlHlH6C5IUybxixLQa3EYiqLbZRAGFb8v6Y5wQ-Q6wLyFEejj3K2Q-jHUXrJUoo5mHpIZqTCZr0QjO6T7Mc0IwmaLILzQUh92iWQ5pnvwHNMizRwPJW_IwrFW4Yt9IZjfetrrw0GiO6bkwt91K4cGmgeEYMS3VTdldy07mMriWAcwXXTSCWYrkPOmbAsYSkzztcnf2wt62AxFBhJOyjE9ZG3Rd2o7wSfYlYOqHV0x4_72AV0vfyewMRUzihSiz7FzjhBAAomtz4d34Sl9IOT9GJW8lLNVXhiMbdBj7V9wiLdLTDpZtC6KhHv0CIOr4TCNYBQtA53Pvb7QeEUBSDSJZCNGJb23muz69D0l2F0VJ0dymkHNcaS2_zwCH3d4zCQV1sOrDZ1Vb2alfV1W5EY-xHV7GdAMnoFet3vHv3lld9-9hD--jXpfb4SyjGnjuGB5rtMIvCW0qXOELs8QL0KD0ssRSi6PqLOHAvT-K6YwB8mQQk9wEJAL5AxIuwZgyWTYGB8nfAQIAUoug64xa0GaL9mERb30dbA9oPiPjjJOxembcOcKzvVwvgVrhW-bO0r_DbPjQlmu6hKXRdiqWhJOEIk2tTGnr3bwV5h7u0_mvwYlx-OiNkt03sHmqYGsLJIbZFNK4h5mVgZwP7x9m-JvrS-QfH4HEptdW2EwQ0aLjUN414slFfWVrhW6sxGcENhoxDVXUTk5LloarQLkePGUpSjEj6SVmSXsTrW0k0ku_SiEg60iM6i0HOSpCzDH3jCdNaP7h1E519sL7L-VsSZETi0rQ_kSC_JfHksD9Kh3nX87wspZL-A0vnWoFL4d-E0DgLVGGq_E-WIZYjks7qDasTlvCZ2ESrxYKwFYvp7Lgpk2XCq5qXkVgllVgLUvJkwVdVzWOxjulMbiihMVmQVbRYJBGdr5arOhFkuYzXJFqVC7QgouFSzZU6NXNjD7PAZhOxxXLJZoqXQrkwL1OqxVvHFWoq3s7sBoIeyvbg0IIo6by7wnjpVRi002__Z-CO4seh9PG2n3ovjRnnYVbujuPzHL1tBfSMJ10Z7aCV6dE4nVbWOHcuMZorWbb6Tep61lq1-cU0DXz7fw-v1vwUlUc0D7t0iOa9DKcN_ScAAP__NOtROg">