| // RUN: %clang_cc1 -triple x86_64-linux -emit-llvm -target-feature +avx512fp16 < %s | FileCheck %s --check-prefixes=CHECK,CHECK-C |
| // RUN: %clang_cc1 -triple x86_64-linux -emit-llvm -target-feature +avx512fp16 -x c++ -std=c++11 < %s | FileCheck %s --check-prefixes=CHECK,CHECK-CPP |
| |
| struct half1 { |
| _Float16 a; |
| }; |
| |
| struct half1 h1(_Float16 a) { |
| // CHECK: define{{.*}}half @ |
| struct half1 x; |
| x.a = a; |
| return x; |
| } |
| |
| struct half2 { |
| _Float16 a; |
| _Float16 b; |
| }; |
| |
| struct half2 h2(_Float16 a, _Float16 b) { |
| // CHECK: define{{.*}}<2 x half> @ |
| struct half2 x; |
| x.a = a; |
| x.b = b; |
| return x; |
| } |
| |
| struct half3 { |
| _Float16 a; |
| _Float16 b; |
| _Float16 c; |
| }; |
| |
| struct half3 h3(_Float16 a, _Float16 b, _Float16 c) { |
| // CHECK: define{{.*}}<4 x half> @ |
| struct half3 x; |
| x.a = a; |
| x.b = b; |
| x.c = c; |
| return x; |
| } |
| |
| struct half4 { |
| _Float16 a; |
| _Float16 b; |
| _Float16 c; |
| _Float16 d; |
| }; |
| |
| struct half4 h4(_Float16 a, _Float16 b, _Float16 c, _Float16 d) { |
| // CHECK: define{{.*}}<4 x half> @ |
| struct half4 x; |
| x.a = a; |
| x.b = b; |
| x.c = c; |
| x.d = d; |
| return x; |
| } |
| |
| struct floathalf { |
| float a; |
| _Float16 b; |
| }; |
| |
| struct floathalf fh(float a, _Float16 b) { |
| // CHECK: define{{.*}}<4 x half> @ |
| struct floathalf x; |
| x.a = a; |
| x.b = b; |
| return x; |
| } |
| |
| struct floathalf2 { |
| float a; |
| _Float16 b; |
| _Float16 c; |
| }; |
| |
| struct floathalf2 fh2(float a, _Float16 b, _Float16 c) { |
| // CHECK: define{{.*}}<4 x half> @ |
| struct floathalf2 x; |
| x.a = a; |
| x.b = b; |
| x.c = c; |
| return x; |
| } |
| |
| struct halffloat { |
| _Float16 a; |
| float b; |
| }; |
| |
| struct halffloat hf(_Float16 a, float b) { |
| // CHECK: define{{.*}}<4 x half> @ |
| struct halffloat x; |
| x.a = a; |
| x.b = b; |
| return x; |
| } |
| |
| struct half2float { |
| _Float16 a; |
| _Float16 b; |
| float c; |
| }; |
| |
| struct half2float h2f(_Float16 a, _Float16 b, float c) { |
| // CHECK: define{{.*}}<4 x half> @ |
| struct half2float x; |
| x.a = a; |
| x.b = b; |
| x.c = c; |
| return x; |
| } |
| |
| struct floathalf3 { |
| float a; |
| _Float16 b; |
| _Float16 c; |
| _Float16 d; |
| }; |
| |
| struct floathalf3 fh3(float a, _Float16 b, _Float16 c, _Float16 d) { |
| // CHECK: define{{.*}}{ <4 x half>, half } @ |
| struct floathalf3 x; |
| x.a = a; |
| x.b = b; |
| x.c = c; |
| x.d = d; |
| return x; |
| } |
| |
| struct half5 { |
| _Float16 a; |
| _Float16 b; |
| _Float16 c; |
| _Float16 d; |
| _Float16 e; |
| }; |
| |
| struct half5 h5(_Float16 a, _Float16 b, _Float16 c, _Float16 d, _Float16 e) { |
| // CHECK: define{{.*}}{ <4 x half>, half } @ |
| struct half5 x; |
| x.a = a; |
| x.b = b; |
| x.c = c; |
| x.d = d; |
| x.e = e; |
| return x; |
| } |
| |
| struct float2 { |
| struct {} s; |
| float a; |
| float b; |
| }; |
| |
| float pr51813(struct float2 s) { |
| // CHECK-C: define{{.*}} @pr51813(<2 x float> |
| // CHECK-CPP: define{{.*}} @_Z7pr518136float2(double {{.*}}, float |
| return s.a; |
| } |
| |
| struct float3 { |
| float a; |
| struct {} s; |
| float b; |
| }; |
| |
| float pr51813_2(struct float3 s) { |
| // CHECK-C: define{{.*}} @pr51813_2(<2 x float> |
| // CHECK-CPP: define{{.*}} @_Z9pr51813_26float3(double {{.*}}, float |
| return s.a; |
| } |
| |
| struct shalf2 { |
| struct {} s; |
| _Float16 a; |
| _Float16 b; |
| }; |
| |
| _Float16 sf2(struct shalf2 s) { |
| // CHECK-C: define{{.*}} @sf2(<2 x half> |
| // CHECK-CPP: define{{.*}} @_Z3sf26shalf2(double {{.*}} |
| return s.a; |
| }; |
| |
| struct halfs2 { |
| _Float16 a; |
| struct {} s1; |
| _Float16 b; |
| struct {} s2; |
| }; |
| |
| _Float16 fs2(struct shalf2 s) { |
| // CHECK-C: define{{.*}} @fs2(<2 x half> |
| // CHECK-CPP: define{{.*}} @_Z3fs26shalf2(double {{.*}} |
| return s.a; |
| }; |
| |
| struct fsd { |
| float a; |
| struct {}; |
| double b; |
| }; |
| |
| struct fsd pr52011() { |
| // CHECK: define{{.*}} { float, double } @ |
| } |
| |
| struct hsd { |
| _Float16 a; |
| struct {}; |
| double b; |
| }; |
| |
| struct hsd pr52011_2() { |
| // CHECK: define{{.*}} { half, double } @ |
| } |
| |
| struct hsf { |
| _Float16 a; |
| struct {}; |
| float b; |
| }; |
| |
| struct hsf pr52011_3() { |
| // CHECK: define{{.*}} <4 x half> @ |
| } |
| |
| struct fds { |
| float a; |
| double b; |
| struct {}; |
| }; |
| |
| struct fds pr52011_4() { |
| // CHECK-C: define{{.*}} { float, double } @pr52011_4 |
| // CHECK-CPP: define{{.*}} void @_Z9pr52011_4v({{.*}} sret |
| } |