#include <assert.h>
#include <stdio.h>
#include <sys/utsname.h>
typedef int si_int;
typedef unsigned su_int;
typedef long long di_int;
typedef unsigned long long du_int;
di_int __ashldi3(di_int a, si_int b); di_int __ashrdi3(di_int a, si_int b); di_int __lshrdi3(di_int a, si_int b);
si_int __clzsi2(si_int a); si_int __clzdi2(di_int a); si_int __ctzsi2(si_int a); si_int __ctzdi2(di_int a);
si_int __ffsdi2(di_int a);
si_int __paritysi2(si_int a); si_int __paritydi2(di_int a);
si_int __popcountsi2(si_int a); si_int __popcountdi2(di_int a);
di_int __negdi2 (di_int a); di_int __muldi3 (di_int a, di_int b); di_int __divdi3 (di_int a, di_int b); du_int __udivdi3 (du_int a, du_int b); di_int __moddi3 (di_int a, di_int b); du_int __umoddi3 (du_int a, du_int b); du_int __udivmoddi4(du_int a, du_int b, du_int* rem);
si_int __absvsi2(si_int a); di_int __absvdi2(di_int a);
si_int __negvsi2(si_int a); di_int __negvdi2(di_int a);
si_int __addvsi3(si_int a, si_int b); di_int __addvdi3(di_int a, di_int b);
si_int __subvsi3(si_int a, si_int b); di_int __subvdi3(di_int a, di_int b);
si_int __mulvsi3(si_int a, si_int b); di_int __mulvdi3(di_int a, di_int b);
si_int __cmpdi2 (di_int a, di_int b);
si_int __ucmpdi2(du_int a, du_int b);
di_int __fixsfdi( float a);
di_int __fixdfdi( double a);
di_int __fixxfdi(long double a);
su_int __fixunssfsi( float a);
su_int __fixunsdfsi( double a);
su_int __fixunsxfsi(long double a);
du_int __fixunssfdi( float a);
du_int __fixunsdfdi( double a);
du_int __fixunsxfdi(long double a);
float __floatdisf(di_int a);
double __floatdidf(di_int a);
long double __floatdixf(di_int a);
float __floatundisf(du_int a);
double __floatundidf(du_int a);
long double __floatundixf(du_int a);
float __powisf2( float a, si_int b); double __powidf2( double a, si_int b); long double __powixf2(long double a, si_int b);
float _Complex __mulsc3( float a, float b, float c, float d);
double _Complex __muldc3(double a, double b, double c, double d);
long double _Complex __mulxc3(long double a, long double b,
long double c, long double d);
float _Complex __divsc3( float a, float b, float c, float d);
double _Complex __divdc3(double a, double b, double c, double d);
long double _Complex __divxc3(long double a, long double b,
long double c, long double d);
#ifndef __arm
#define HAS_LONG_DOUBLE
#endif
int main(int argc, char **argv) {
du_int du_tmp;
struct utsname name;
#ifdef __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__
const char *target_name = "OS X";
unsigned target_version = __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__;
unsigned target_maj = target_version / 100;
unsigned target_min = (target_version / 10) % 10;
unsigned target_micro = target_version % 10;
#else
const char *target_name = "iPhoneOS";
unsigned target_version = __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__;
unsigned target_maj = target_version / 10000;
unsigned target_min = (target_version / 100) % 100;
unsigned target_micro = target_version % 100;
#endif
if (uname(&name))
return 1;
fprintf(stderr, "%s: clang_rt test:\n", argv[0]);
fprintf(stderr, " target : %s %d.%d.%d\n\n", target_name,
target_maj, target_min, target_micro);
fprintf(stderr, " sysname : %s\n", name.sysname);
fprintf(stderr, " nodename: %s\n", name.nodename);
fprintf(stderr, " release : %s\n", name.release);
fprintf(stderr, " version : %s\n", name.version);
fprintf(stderr, " machine : %s\n", name.machine);
assert(__ashldi3(1, 1) == 2);
assert(__ashrdi3(2, 1) == 1);
assert(__lshrdi3(2, 1) == 1);
assert(__clzsi2(1) == 31);
assert(__clzdi2(1) == 63);
assert(__ctzsi2(2) == 1);
assert(__ctzdi2(2) == 1);
assert(__ffsdi2(12) == 3);
assert(__paritysi2(13) == 1);
assert(__paritydi2(13) == 1);
assert(__popcountsi2(13) == 3);
assert(__popcountdi2(13) == 3);
assert(__negdi2(3) == -3);
assert(__muldi3(2,2) == 4);
assert(__divdi3(-4,2) == -2);
assert(__udivdi3(4,2) == 2);
assert(__moddi3(3,2) == 1);
assert(__umoddi3(3,2) == 1);
assert(__udivmoddi4(5,2,&du_tmp) == 2 && du_tmp == 1);
assert(__absvsi2(-2) == 2);
assert(__absvdi2(-2) == 2);
assert(__negvsi2(2) == -2);
assert(__negvdi2(2) == -2);
assert(__addvsi3(2, 3) == 5);
assert(__addvdi3(2, 3) == 5);
assert(__subvsi3(2, 3) == -1);
assert(__subvdi3(2, 3) == -1);
assert(__mulvsi3(2, 3) == 6);
assert(__mulvdi3(2, 3) == 6);
assert(__cmpdi2(3, 2) == 2);
assert(__ucmpdi2(3, 2) == 2);
assert(__fixsfdi(2.0) == 2);
assert(__fixdfdi(2.0) == 2);
assert(__fixunssfsi(2.0) == 2);
assert(__fixunsdfsi(2.0) == 2);
assert(__fixunssfdi(2.0) == 2);
assert(__fixunsdfdi(2.0) == 2);
assert(__floatdisf(2) == 2.0);
assert(__floatdidf(2) == 2.0);
assert(__floatundisf(2) == 2.0);
assert(__floatundidf(2) == 2.0);
assert(__powisf2(2.0, 2) == 4.0);
assert(__powidf2(2.0, 2) == 4.0);
#ifndef __arm
{
_Complex float a = __mulsc3(1.0, 2.0, 4.0, 8.0);
_Complex float b = (-12.0 + 16.0j);
fprintf(stderr, "a: (%f + %f), b: (%f + %f)\n",
__real a, __imag a, __real b, __imag b);
}
assert(__mulsc3(1.0, 2.0, 4.0, 8.0) == (-12.0 + 16.0j));
assert(__muldc3(1.0, 2.0, 4.0, 8.0) == (-12.0 + 16.0j));
assert(__divsc3(1.0, 2.0, 4.0, 8.0) == (0.25 + 0j));
assert(__divdc3(1.0, 2.0, 4.0, 8.0) == (0.25 + 0j));
#endif
#ifdef HAS_LONG_DOUBLE
assert(__divxc3(1.0, 2.0, 4.0, 8.0) == (0.25 + 0j));
assert(__fixunsxfdi(2.0) == 2);
assert(__fixunsxfsi(2.0) == 2);
assert(__fixxfdi(2.0) == 2);
assert(__floatdixf(2) == 2.0);
assert(__floatundixf(2) == 2);
assert(__mulxc3(1.0, 2.0, 4.0, 8.0) == (-12.0 + 16.0j));
assert(__powixf2(2.0, 2) == 4.0);
#endif
#if defined(__arm) && defined(__ARM_ARCH_6K__) && defined(__thumb__)
if (argc == 100) {
extern void __restore_vfp_d8_d15_regs(void), __save_vfp_d8_d15_regs(void);
extern void __switch8(void), __switchu8(void),
__switch16(void), __switch32(void);
extern void __addsf3vfp(void);
__addsf3vfp();
__restore_vfp_d8_d15_regs();
__save_vfp_d8_d15_regs();
__switch8();
__switchu8();
__switch16();
__switch32();
}
#endif
fprintf(stderr, " OK!\n");
return 0;
}