brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.6 KiB · bfd67d1 Raw
61 lines · c
1// REQUIRES: arm-target-arch || armv6m-target-arch2// RUN: %clang_builtins %s %librt -o %t && %run %t3 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 12extern __attribute__((pcs("aapcs"))) void __aeabi_cfcmpeq(float a, float b);13 14int test__aeabi_cfcmpeq(float a, float b, int expected)15{16    uint32_t cpsr_value = call_apsr_f(a, b, __aeabi_cfcmpeq);17    union cpsr cpsr = { .value = cpsr_value };18    if (expected != cpsr.flags.z) {19        printf("error in __aeabi_cfcmpeq(%f, %f) => Z = %d, expected %d\n",20               a, b, cpsr.flags.z, expected);21        return 1;22    }23    return 0;24}25#endif26 27int main()28{29#if __arm__30    if (test__aeabi_cfcmpeq(1.0, 1.0, 1))31        return 1;32    if (test__aeabi_cfcmpeq(1234.567, 765.4321, 0))33        return 1;34    if (test__aeabi_cfcmpeq(-123.0, -678.0, 0))35        return 1;36    if (test__aeabi_cfcmpeq(0.0, -0.0, 1))37        return 1;38    if (test__aeabi_cfcmpeq(1.0, NAN, 0))39        return 1;40    if (test__aeabi_cfcmpeq(NAN, 1.0, 0))41        return 1;42    if (test__aeabi_cfcmpeq(NAN, NAN, 0))43        return 1;44    if (test__aeabi_cfcmpeq(INFINITY, 1.0, 0))45        return 1;46    if (test__aeabi_cfcmpeq(0.0, INFINITY, 0))47        return 1;48    if (test__aeabi_cfcmpeq(-INFINITY, 0.0, 0))49        return 1;50    if (test__aeabi_cfcmpeq(0.0, -INFINITY, 0))51        return 1;52    if (test__aeabi_cfcmpeq(INFINITY, INFINITY, 1))53        return 1;54    if (test__aeabi_cfcmpeq(-INFINITY, -INFINITY, 1))55        return 1;56#else57    printf("skipped\n");58#endif59    return 0;60}61