1//===-- aeabi_cdcmple.c - Test __aeabi_cdcmple and __aeabi_cdrcmple -------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file tests __aeabi_cdcmple and __aeabi_cdrcmple for the compiler_rt
11// library.
12//
13//===----------------------------------------------------------------------===//
14
15#include <stdint.h>
16#include <stdio.h>
17#include <stdlib.h>
18#include <math.h>
19
20#include "call_apsr.h"
21
22#if __arm__
23
24extern __attribute__((pcs("aapcs"))) void __aeabi_cdcmple(double a, double b);
25extern __attribute__((pcs("aapcs"))) void __aeabi_cdrcmple(double a, double b);
26
27int test__aeabi_cdcmple(double a, double b, int expected)
28{
29    int32_t cpsr_value = call_apsr_d(a, b, __aeabi_cdcmple);
30    int32_t r_cpsr_value = call_apsr_d(b, a, __aeabi_cdrcmple);
31
32    if (cpsr_value != r_cpsr_value) {
33        printf("error: __aeabi_cdcmple(%f, %f) != __aeabi_cdrcmple(%f, %f)\n", a, b, b, a);
34        return 1;
35    }
36
37    int expected_z, expected_c;
38    if (expected == -1) {
39        expected_z = 0;
40        expected_c = 0;
41    } else if (expected == 0) {
42        expected_z = 1;
43        expected_c = 1;
44    } else {
45        // a or b is NaN, or a > b
46        expected_z = 0;
47        expected_c = 1;
48    }
49
50    union cpsr cpsr = { .value = cpsr_value };
51    if (expected_z != cpsr.flags.z || expected_c != cpsr.flags.c) {
52        printf("error in __aeabi_cdcmple(%f, %f) => (Z = %d, C = %d), expected (Z = %d, C = %d)\n",
53               a, b, cpsr.flags.z, cpsr.flags.c, expected_z, expected_c);
54        return 1;
55    }
56
57    cpsr.value = r_cpsr_value;
58    if (expected_z != cpsr.flags.z || expected_c != cpsr.flags.c) {
59        printf("error in __aeabi_cdrcmple(%f, %f) => (Z = %d, C = %d), expected (Z = %d, C = %d)\n",
60               a, b, cpsr.flags.z, cpsr.flags.c, expected_z, expected_c);
61        return 1;
62    }
63    return 0;
64}
65#endif
66
67int main()
68{
69#if __arm__
70    if (test__aeabi_cdcmple(1.0, 1.0, 0))
71        return 1;
72    if (test__aeabi_cdcmple(1234.567, 765.4321, 1))
73        return 1;
74    if (test__aeabi_cdcmple(765.4321, 1234.567, -1))
75        return 1;
76    if (test__aeabi_cdcmple(-123.0, -678.0, 1))
77        return 1;
78    if (test__aeabi_cdcmple(-678.0, -123.0, -1))
79        return 1;
80    if (test__aeabi_cdcmple(0.0, -0.0, 0))
81        return 1;
82    if (test__aeabi_cdcmple(1.0, NAN, 1))
83        return 1;
84    if (test__aeabi_cdcmple(NAN, 1.0, 1))
85        return 1;
86    if (test__aeabi_cdcmple(NAN, NAN, 1))
87        return 1;
88#else
89    printf("skipped\n");
90#endif
91    return 0;
92}
93