1799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar//===-- aeabi_cdcmple.c - Test __aeabi_cdcmple and __aeabi_cdrcmple -------===//
2799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar//
3799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar//                     The LLVM Compiler Infrastructure
4799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar//
5799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar// This file is dual licensed under the MIT and the University of Illinois Open
6799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar// Source Licenses. See LICENSE.TXT for details.
7799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar//
8799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar//===----------------------------------------------------------------------===//
9799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar//
10799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar// This file tests __aeabi_cdcmple and __aeabi_cdrcmple for the compiler_rt
11799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar// library.
12799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar//
13799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar//===----------------------------------------------------------------------===//
14799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
15799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#include <stdint.h>
16799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#include <stdio.h>
17799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#include <stdlib.h>
18799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#include <math.h>
19799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
20799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#include "call_apsr.h"
21799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
22799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#if __arm__
23799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
24799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainarextern __attribute__((pcs("aapcs"))) void __aeabi_cdcmple(double a, double b);
25799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainarextern __attribute__((pcs("aapcs"))) void __aeabi_cdrcmple(double a, double b);
26799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
27799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainarint test__aeabi_cdcmple(double a, double b, int expected)
28799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar{
29799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    int32_t cpsr_value = call_apsr_d(a, b, __aeabi_cdcmple);
30799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    int32_t r_cpsr_value = call_apsr_d(b, a, __aeabi_cdrcmple);
31799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
32799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    if (cpsr_value != r_cpsr_value) {
33799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar        printf("error: __aeabi_cdcmple(%f, %f) != __aeabi_cdrcmple(%f, %f)\n", a, b, b, a);
34799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar        return 1;
35799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    }
36799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
37799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    int expected_z, expected_c;
38799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    if (expected == -1) {
39799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar        expected_z = 0;
40799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar        expected_c = 0;
41799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    } else if (expected == 0) {
42799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar        expected_z = 1;
43799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar        expected_c = 1;
44799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    } else {
45799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar        // a or b is NaN, or a > b
46799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar        expected_z = 0;
47799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar        expected_c = 1;
48799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    }
49799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
50799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    union cpsr cpsr = { .value = cpsr_value };
51799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    if (expected_z != cpsr.flags.z || expected_c != cpsr.flags.c) {
52799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar        printf("error in __aeabi_cdcmple(%f, %f) => (Z = %d, C = %d), expected (Z = %d, C = %d)\n",
53799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar               a, b, cpsr.flags.z, cpsr.flags.c, expected_z, expected_c);
54799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar        return 1;
55799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    }
56799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
57799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    cpsr.value = r_cpsr_value;
58799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    if (expected_z != cpsr.flags.z || expected_c != cpsr.flags.c) {
59799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar        printf("error in __aeabi_cdrcmple(%f, %f) => (Z = %d, C = %d), expected (Z = %d, C = %d)\n",
60799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar               a, b, cpsr.flags.z, cpsr.flags.c, expected_z, expected_c);
61799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar        return 1;
62799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    }
63799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    return 0;
64799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar}
65799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#endif
66799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
67799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainarint main()
68799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar{
69799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#if __arm__
70799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    if (test__aeabi_cdcmple(1.0, 1.0, 0))
71799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar        return 1;
72799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    if (test__aeabi_cdcmple(1234.567, 765.4321, 1))
73799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar        return 1;
74799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    if (test__aeabi_cdcmple(765.4321, 1234.567, -1))
75799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar        return 1;
76799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    if (test__aeabi_cdcmple(-123.0, -678.0, 1))
77799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar        return 1;
78799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    if (test__aeabi_cdcmple(-678.0, -123.0, -1))
79799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar        return 1;
80799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    if (test__aeabi_cdcmple(0.0, -0.0, 0))
81799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar        return 1;
82799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    if (test__aeabi_cdcmple(1.0, NAN, 1))
83799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar        return 1;
84799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    if (test__aeabi_cdcmple(NAN, 1.0, 1))
85799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar        return 1;
86799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    if (test__aeabi_cdcmple(NAN, NAN, 1))
87799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar        return 1;
88799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#else
89799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    printf("skipped\n");
90799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#endif
91799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    return 0;
92799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar}
93