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_cdcmpeq(double a, double b);13 14int test__aeabi_cdcmpeq(double a, double b, int expected)15{16 uint32_t cpsr_value = call_apsr_d(a, b, __aeabi_cdcmpeq);17 union cpsr cpsr = { .value = cpsr_value };18 if (expected != cpsr.flags.z) {19 printf("error in __aeabi_cdcmpeq(%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_cdcmpeq(1.0, 1.0, 1))31 return 1;32 if (test__aeabi_cdcmpeq(1234.567, 765.4321, 0))33 return 1;34 if (test__aeabi_cdcmpeq(-123.0, -678.0, 0))35 return 1;36 if (test__aeabi_cdcmpeq(0.0, -0.0, 1))37 return 1;38 if (test__aeabi_cdcmpeq(1.0, NAN, 0))39 return 1;40 if (test__aeabi_cdcmpeq(NAN, 1.0, 0))41 return 1;42 if (test__aeabi_cdcmpeq(NAN, NAN, 0))43 return 1;44 if (test__aeabi_cdcmpeq(INFINITY, 1.0, 0))45 return 1;46 if (test__aeabi_cdcmpeq(0.0, INFINITY, 0))47 return 1;48 if (test__aeabi_cdcmpeq(-INFINITY, 0.0, 0))49 return 1;50 if (test__aeabi_cdcmpeq(0.0, -INFINITY, 0))51 return 1;52 if (test__aeabi_cdcmpeq(INFINITY, INFINITY, 1))53 return 1;54 if (test__aeabi_cdcmpeq(-INFINITY, -INFINITY, 1))55 return 1;56#else57 printf("skipped\n");58#endif59 return 0;60}61