1 | // REQUIRES: arm-target-arch || armv6m-target-arch |
2 | // RUN: %clang_builtins %s %librt -o %t && %run %t |
3 | |
4 | #include <stdint.h> |
5 | #include <stdio.h> |
6 | #include <stdlib.h> |
7 | #include <math.h> |
8 | |
9 | #if __arm__ |
10 | #include "call_apsr.h" |
11 | |
12 | extern __attribute__((pcs("aapcs" ))) void __aeabi_cdcmpeq(double a, double b); |
13 | |
14 | int test__aeabi_cdcmpeq(double a, double b, int expected) |
15 | { |
16 | uint32_t cpsr_value = call_apsr_d(a, b, __aeabi_cdcmpeq); |
17 | union cpsr cpsr = { .value = cpsr_value }; |
18 | if (expected != cpsr.flags.z) { |
19 | printf("error in __aeabi_cdcmpeq(%f, %f) => Z = %d, expected %d\n" , |
20 | a, b, cpsr.flags.z, expected); |
21 | return 1; |
22 | } |
23 | return 0; |
24 | } |
25 | #endif |
26 | |
27 | int main() |
28 | { |
29 | #if __arm__ |
30 | if (test__aeabi_cdcmpeq(1.0, 1.0, 1)) |
31 | return 1; |
32 | if (test__aeabi_cdcmpeq(1234.567, 765.4321, 0)) |
33 | return 1; |
34 | if (test__aeabi_cdcmpeq(-123.0, -678.0, 0)) |
35 | return 1; |
36 | if (test__aeabi_cdcmpeq(0.0, -0.0, 1)) |
37 | return 1; |
38 | if (test__aeabi_cdcmpeq(1.0, NAN, 0)) |
39 | return 1; |
40 | if (test__aeabi_cdcmpeq(NAN, 1.0, 0)) |
41 | return 1; |
42 | if (test__aeabi_cdcmpeq(NAN, NAN, 0)) |
43 | return 1; |
44 | if (test__aeabi_cdcmpeq(INFINITY, 1.0, 0)) |
45 | return 1; |
46 | if (test__aeabi_cdcmpeq(0.0, INFINITY, 0)) |
47 | return 1; |
48 | if (test__aeabi_cdcmpeq(-INFINITY, 0.0, 0)) |
49 | return 1; |
50 | if (test__aeabi_cdcmpeq(0.0, -INFINITY, 0)) |
51 | return 1; |
52 | if (test__aeabi_cdcmpeq(INFINITY, INFINITY, 1)) |
53 | return 1; |
54 | if (test__aeabi_cdcmpeq(-INFINITY, -INFINITY, 1)) |
55 | return 1; |
56 | #else |
57 | printf(format: "skipped\n" ); |
58 | #endif |
59 | return 0; |
60 | } |
61 | |