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