aeabi_cfcmple_test.c revision 799172d60d32feb1acba1a6867f3a9c39a999e5c
16cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK//===-- aeabi_cfcmple.c - Test __aeabi_cfcmple and __aeabi_cfrcmple -------===//
22228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project//
32228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project//                     The LLVM Compiler Infrastructure
46cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK//
56cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK// This file is dual licensed under the MIT and the University of Illinois Open
62228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project// Source Licenses. See LICENSE.TXT for details.
72228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project//
86cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK//===----------------------------------------------------------------------===//
96cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK//
106cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK// This file tests __aeabi_cfcmple and __aeabi_cfrcmple for the compiler_rt
116cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK// library.
126cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK//
136cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK//===----------------------------------------------------------------------===//
146cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK
156cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK#include <stdint.h>
166cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK#include <stdio.h>
176cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK#include <stdlib.h>
186cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK#include <math.h>
196cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK
206cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK#include "call_apsr.h"
216cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK
226cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK#if __arm__
236cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK
246cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKextern __attribute__((pcs("aapcs"))) void __aeabi_cfcmple(float a, float b);
256cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKextern __attribute__((pcs("aapcs"))) void __aeabi_cfrcmple(float a, float b);
266cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK
276cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKint test__aeabi_cfcmple(float a, float b, int expected)
286cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK{
296cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    int32_t cpsr_value = call_apsr_f(a, b, __aeabi_cfcmple);
306cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    int32_t r_cpsr_value = call_apsr_f(b, a, __aeabi_cfrcmple);
316cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK
326cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    if (cpsr_value != r_cpsr_value) {
332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        printf("error: __aeabi_cfcmple(%f, %f) != __aeabi_cfrcmple(%f, %f)\n", a, b, b, a);
342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        return 1;
352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
366cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK
376cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    int expected_z, expected_c;
386cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    if (expected == -1) {
392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        expected_z = 0;
406cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        expected_c = 0;
416cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    } else if (expected == 0) {
422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        expected_z = 1;
436cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        expected_c = 1;
446cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    } else {
456cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        // a or b is NaN, or a > b
466cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        expected_z = 0;
472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        expected_c = 1;
482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
496cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK
506cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    union cpsr cpsr = { .value = cpsr_value };
512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (expected_z != cpsr.flags.z || expected_c != cpsr.flags.c) {
526cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        printf("error in __aeabi_cfcmple(%f, %f) => (Z = %d, C = %d), expected (Z = %d, C = %d)\n",
536cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK               a, b, cpsr.flags.z, cpsr.flags.c, expected_z, expected_c);
542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        return 1;
556cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    }
566cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK
576cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    cpsr.value = r_cpsr_value;
586cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    if (expected_z != cpsr.flags.z || expected_c != cpsr.flags.c) {
596cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        printf("error in __aeabi_cfrcmple(%f, %f) => (Z = %d, C = %d), expected (Z = %d, C = %d)\n",
602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project               a, b, cpsr.flags.z, cpsr.flags.c, expected_z, expected_c);
612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        return 1;
622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
636cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    return 0;
646cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK}
656cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK#endif
666cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK
672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectint main()
686cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK{
696cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK#if __arm__
702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (test__aeabi_cfcmple(1.0, 1.0, 0))
712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        return 1;
722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (test__aeabi_cfcmple(1234.567, 765.4321, 1))
736cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        return 1;
746cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    if (test__aeabi_cfcmple(765.4321, 1234.567, -1))
756cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        return 1;
766cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    if (test__aeabi_cfcmple(-123.0, -678.0, 1))
776cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        return 1;
786cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    if (test__aeabi_cfcmple(-678.0, -123.0, -1))
796cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        return 1;
806cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    if (test__aeabi_cfcmple(0.0, -0.0, 0))
816cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK        return 1;
826cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK    if (test__aeabi_cfcmple(1.0, NAN, 1))
832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        return 1;
842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (test__aeabi_cfcmple(NAN, 1.0, 1))
852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        return 1;
862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (test__aeabi_cfcmple(NAN, NAN, 1))
872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        return 1;
882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#else
892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    printf("skipped\n");
902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif
912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return 0;
922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
936cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK