xref: /llvm-project/clang/test/CodeGen/X86/bfloat-abi.c (revision e4888a37d36780872d685c68ef8b26b2e14d6d39)
1 // RUN: %clang_cc1 -triple x86_64-linux -emit-llvm  -target-feature +sse2 < %s | FileCheck %s --check-prefixes=CHECK
2 
3 struct bfloat1 {
4   __bf16 a;
5 };
6 
h1(__bf16 a)7 struct bfloat1 h1(__bf16 a) {
8   // CHECK: define{{.*}}bfloat @
9   struct bfloat1 x;
10   x.a = a;
11   return x;
12 }
13 
14 struct bfloat2 {
15   __bf16 a;
16   __bf16 b;
17 };
18 
h2(__bf16 a,__bf16 b)19 struct bfloat2 h2(__bf16 a, __bf16 b) {
20   // CHECK: define{{.*}}<2 x bfloat> @
21   struct bfloat2 x;
22   x.a = a;
23   x.b = b;
24   return x;
25 }
26 
27 struct bfloat3 {
28   __bf16 a;
29   __bf16 b;
30   __bf16 c;
31 };
32 
h3(__bf16 a,__bf16 b,__bf16 c)33 struct bfloat3 h3(__bf16 a, __bf16 b, __bf16 c) {
34   // CHECK: define{{.*}}<4 x bfloat> @
35   struct bfloat3 x;
36   x.a = a;
37   x.b = b;
38   x.c = c;
39   return x;
40 }
41 
42 struct bfloat4 {
43   __bf16 a;
44   __bf16 b;
45   __bf16 c;
46   __bf16 d;
47 };
48 
h4(__bf16 a,__bf16 b,__bf16 c,__bf16 d)49 struct bfloat4 h4(__bf16 a, __bf16 b, __bf16 c, __bf16 d) {
50   // CHECK: define{{.*}}<4 x bfloat> @
51   struct bfloat4 x;
52   x.a = a;
53   x.b = b;
54   x.c = c;
55   x.d = d;
56   return x;
57 }
58 
59 struct floatbfloat {
60   float a;
61   __bf16 b;
62 };
63 
fh(float a,__bf16 b)64 struct floatbfloat fh(float a, __bf16 b) {
65   // CHECK: define{{.*}}<4 x half> @
66   struct floatbfloat x;
67   x.a = a;
68   x.b = b;
69   return x;
70 }
71 
72 struct floatbfloat2 {
73   float a;
74   __bf16 b;
75   __bf16 c;
76 };
77 
fh2(float a,__bf16 b,__bf16 c)78 struct floatbfloat2 fh2(float a, __bf16 b, __bf16 c) {
79   // CHECK: define{{.*}}<4 x half> @
80   struct floatbfloat2 x;
81   x.a = a;
82   x.b = b;
83   x.c = c;
84   return x;
85 }
86 
87 struct bfloatfloat {
88   __bf16 a;
89   float b;
90 };
91 
hf(__bf16 a,float b)92 struct bfloatfloat hf(__bf16 a, float b) {
93   // CHECK: define{{.*}}<4 x half> @
94   struct bfloatfloat x;
95   x.a = a;
96   x.b = b;
97   return x;
98 }
99 
100 struct bfloat2float {
101   __bf16 a;
102   __bf16 b;
103   float c;
104 };
105 
h2f(__bf16 a,__bf16 b,float c)106 struct bfloat2float h2f(__bf16 a, __bf16 b, float c) {
107   // CHECK: define{{.*}}<4 x bfloat> @
108   struct bfloat2float x;
109   x.a = a;
110   x.b = b;
111   x.c = c;
112   return x;
113 }
114 
115 struct floatbfloat3 {
116   float a;
117   __bf16 b;
118   __bf16 c;
119   __bf16 d;
120 };
121 
fh3(float a,__bf16 b,__bf16 c,__bf16 d)122 struct floatbfloat3 fh3(float a, __bf16 b, __bf16 c, __bf16 d) {
123   // CHECK: define{{.*}}{ <4 x half>, bfloat } @
124   struct floatbfloat3 x;
125   x.a = a;
126   x.b = b;
127   x.c = c;
128   x.d = d;
129   return x;
130 }
131 
132 struct bfloat5 {
133   __bf16 a;
134   __bf16 b;
135   __bf16 c;
136   __bf16 d;
137   __bf16 e;
138 };
139 
h5(__bf16 a,__bf16 b,__bf16 c,__bf16 d,__bf16 e)140 struct bfloat5 h5(__bf16 a, __bf16 b, __bf16 c, __bf16 d, __bf16 e) {
141   // CHECK: define{{.*}}{ <4 x bfloat>, bfloat } @
142   struct bfloat5 x;
143   x.a = a;
144   x.b = b;
145   x.c = c;
146   x.d = d;
147   x.e = e;
148   return x;
149 }
150