diff options
Diffstat (limited to 'test/CodeGen')
-rw-r--r-- | test/CodeGen/blocks.c | 2 | ||||
-rw-r--r-- | test/CodeGen/builtins.c | 32 | ||||
-rw-r--r-- | test/CodeGen/complex.c | 4 | ||||
-rw-r--r-- | test/CodeGen/microsoft-call-conv.c | 50 | ||||
-rw-r--r-- | test/CodeGen/stdcall-fastcall.c | 37 |
5 files changed, 114 insertions, 11 deletions
diff --git a/test/CodeGen/blocks.c b/test/CodeGen/blocks.c index e7625b1..a0f5dae 100644 --- a/test/CodeGen/blocks.c +++ b/test/CodeGen/blocks.c @@ -12,7 +12,7 @@ struct s0 { int a[64]; }; -// RUN: grep 'internal void @__f2_block_invoke_(.struct.s0\* sret .*, .*, .* byval .*)' %t +// RUN: grep 'internal void @__f2_block_invoke_0(.struct.s0\* sret .*, .*, .* byval .*)' %t struct s0 f2(struct s0 a0) { return ^(struct s0 a1){ return a1; }(a0); } diff --git a/test/CodeGen/builtins.c b/test/CodeGen/builtins.c index a4424d7..8b61258 100644 --- a/test/CodeGen/builtins.c +++ b/test/CodeGen/builtins.c @@ -163,3 +163,35 @@ void bar() { } // CHECK: } + + +// CHECK: define void @test_float_builtins +void test_float_builtins(float F, double D, long double LD) { + volatile int res; + res = __builtin_isinf(F); + // CHECK: call float @fabsf(float + // CHECK: fcmp oeq float {{.*}}, 0x7FF0000000000000 + + res = __builtin_isinf(D); + // CHECK: call double @fabs(double + // CHECK: fcmp oeq double {{.*}}, 0x7FF0000000000000 + + res = __builtin_isinf(LD); + // CHECK: call x86_fp80 @fabsl(x86_fp80 + // CHECK: fcmp oeq x86_fp80 {{.*}}, 0xK7FFF8000000000000000 + + res = __builtin_isfinite(F); + // CHECK: fcmp oeq float + // CHECK: call float @fabsf + // CHECK: fcmp une float {{.*}}, 0x7FF0000000000000 + // CHECK: and i1 + + res = __builtin_isnormal(F); + // CHECK: fcmp oeq float + // CHECK: call float @fabsf + // CHECK: fcmp ult float {{.*}}, 0x7FF0000000000000 + // CHECK: fcmp uge float {{.*}}, 0x3810000000000000 + // CHECK: and i1 + // CHECK: and i1 +} + diff --git a/test/CodeGen/complex.c b/test/CodeGen/complex.c index ca60610..055383e 100644 --- a/test/CodeGen/complex.c +++ b/test/CodeGen/complex.c @@ -89,3 +89,7 @@ void t6() { --ci1; } +// <rdar://problem/7958272> +double t7(double _Complex c) { + return __builtin_fabs(__real__(c)); +} diff --git a/test/CodeGen/microsoft-call-conv.c b/test/CodeGen/microsoft-call-conv.c new file mode 100644 index 0000000..95f5fa3 --- /dev/null +++ b/test/CodeGen/microsoft-call-conv.c @@ -0,0 +1,50 @@ +// RUN: %clang_cc1 -emit-llvm < %s | FileCheck %s + +void __fastcall f1(void); +void __stdcall f2(void); +void __thiscall f3(void); +void __fastcall f4(void) { +// CHECK: define x86_fastcallcc void @f4() + f1(); +// CHECK: call x86_fastcallcc void @f1() +} +void __stdcall f5(void) { +// CHECK: define x86_stdcallcc void @f5() + f2(); +// CHECK: call x86_stdcallcc void @f2() +} +void __thiscall f6(void) { +// CHECK: define x86_thiscallcc void @f6() + f3(); +// CHECK: call x86_thiscallcc void @f3() +} + +// PR5280 +void (__fastcall *pf1)(void) = f1; +void (__stdcall *pf2)(void) = f2; +void (__thiscall *pf3)(void) = f3; +void (__fastcall *pf4)(void) = f4; +void (__stdcall *pf5)(void) = f5; +void (__thiscall *pf6)(void) = f6; + +int main(void) { + f4(); f5(); f6(); + // CHECK: call x86_fastcallcc void @f4() + // CHECK: call x86_stdcallcc void @f5() + // CHECK: call x86_thiscallcc void @f6() + pf1(); pf2(); pf3(); pf4(); pf5(); pf6(); + // CHECK: call x86_fastcallcc void %{{.*}}() + // CHECK: call x86_stdcallcc void %{{.*}}() + // CHECK: call x86_thiscallcc void %{{.*}}() + // CHECK: call x86_fastcallcc void %{{.*}}() + // CHECK: call x86_stdcallcc void %{{.*}}() + // CHECK: call x86_thiscallcc void %{{.*}}() + return 0; +} + +// PR7117 +void __stdcall f7(foo) int foo; {} +void f8(void) { + f7(0); + // CHECK: call x86_stdcallcc void (...)* bitcast +} diff --git a/test/CodeGen/stdcall-fastcall.c b/test/CodeGen/stdcall-fastcall.c index bea6df3..6f3b003 100644 --- a/test/CodeGen/stdcall-fastcall.c +++ b/test/CodeGen/stdcall-fastcall.c @@ -2,32 +2,49 @@ void __attribute__((fastcall)) f1(void); void __attribute__((stdcall)) f2(void); -void __attribute__((fastcall)) f3(void) { -// CHECK: define x86_fastcallcc void @f3() +void __attribute__((thiscall)) f3(void); +void __attribute__((fastcall)) f4(void) { +// CHECK: define x86_fastcallcc void @f4() f1(); // CHECK: call x86_fastcallcc void @f1() } -void __attribute__((stdcall)) f4(void) { -// CHECK: define x86_stdcallcc void @f4() +void __attribute__((stdcall)) f5(void) { +// CHECK: define x86_stdcallcc void @f5() f2(); // CHECK: call x86_stdcallcc void @f2() } +void __attribute__((thiscall)) f6(void) { +// CHECK: define x86_thiscallcc void @f6() + f3(); +// CHECK: call x86_thiscallcc void @f3() +} // PR5280 void (__attribute__((fastcall)) *pf1)(void) = f1; void (__attribute__((stdcall)) *pf2)(void) = f2; -void (__attribute__((fastcall)) *pf3)(void) = f3; -void (__attribute__((stdcall)) *pf4)(void) = f4; +void (__attribute__((thiscall)) *pf3)(void) = f3; +void (__attribute__((fastcall)) *pf4)(void) = f4; +void (__attribute__((stdcall)) *pf5)(void) = f5; +void (__attribute__((thiscall)) *pf6)(void) = f6; int main(void) { - f3(); f4(); - // CHECK: call x86_fastcallcc void @f3() - // CHECK: call x86_stdcallcc void @f4() - pf1(); pf2(); pf3(); pf4(); + f4(); f5(); f6(); + // CHECK: call x86_fastcallcc void @f4() + // CHECK: call x86_stdcallcc void @f5() + // CHECK: call x86_thiscallcc void @f6() + pf1(); pf2(); pf3(); pf4(); pf5(); pf6(); // CHECK: call x86_fastcallcc void %{{.*}}() // CHECK: call x86_stdcallcc void %{{.*}}() + // CHECK: call x86_thiscallcc void %{{.*}}() // CHECK: call x86_fastcallcc void %{{.*}}() // CHECK: call x86_stdcallcc void %{{.*}}() + // CHECK: call x86_thiscallcc void %{{.*}}() return 0; } +// PR7117 +void __attribute((stdcall)) f7(foo) int foo; {} +void f8(void) { + f7(0); + // CHECK: call x86_stdcallcc void (...)* bitcast +} |