1 // RUN: %clang_cc1 %s -O0 -emit-llvm -triple x86_64-unknown-unknown -target-feature +avx512fp16 -o - | FileCheck %s --check-prefix=X86
2 // RUN: %clang_cc1 %s -O0 -emit-llvm -triple x86_64-unknown-unknown -o - | FileCheck %s --check-prefix=X86
3 
add_half_rr(_Float16 a,_Float16 b)4 _Float16 _Complex add_half_rr(_Float16 a, _Float16 b) {
5   // X86-LABEL: @add_half_rr(
6   // X86: fadd
7   // X86-NOT: fadd
8   // X86: ret
9   return a + b;
10 }
add_half_cr(_Float16 _Complex a,_Float16 b)11 _Float16 _Complex add_half_cr(_Float16 _Complex a, _Float16 b) {
12   // X86-LABEL: @add_half_cr(
13   // X86: fadd
14   // X86-NOT: fadd
15   // X86: ret
16   return a + b;
17 }
add_half_rc(_Float16 a,_Float16 _Complex b)18 _Float16 _Complex add_half_rc(_Float16 a, _Float16 _Complex b) {
19   // X86-LABEL: @add_half_rc(
20   // X86: fadd
21   // X86-NOT: fadd
22   // X86: ret
23   return a + b;
24 }
add_half_cc(_Float16 _Complex a,_Float16 _Complex b)25 _Float16 _Complex add_half_cc(_Float16 _Complex a, _Float16 _Complex b) {
26   // X86-LABEL: @add_half_cc(
27   // X86: fadd
28   // X86: fadd
29   // X86-NOT: fadd
30   // X86: ret
31   return a + b;
32 }
33 
sub_half_rr(_Float16 a,_Float16 b)34 _Float16 _Complex sub_half_rr(_Float16 a, _Float16 b) {
35   // X86-LABEL: @sub_half_rr(
36   // X86: fsub
37   // X86-NOT: fsub
38   // X86: ret
39   return a - b;
40 }
sub_half_cr(_Float16 _Complex a,_Float16 b)41 _Float16 _Complex sub_half_cr(_Float16 _Complex a, _Float16 b) {
42   // X86-LABEL: @sub_half_cr(
43   // X86: fsub
44   // X86-NOT: fsub
45   // X86: ret
46   return a - b;
47 }
sub_half_rc(_Float16 a,_Float16 _Complex b)48 _Float16 _Complex sub_half_rc(_Float16 a, _Float16 _Complex b) {
49   // X86-LABEL: @sub_half_rc(
50   // X86: fsub
51   // X86: fneg
52   // X86-NOT: fsub
53   // X86: ret
54   return a - b;
55 }
sub_half_cc(_Float16 _Complex a,_Float16 _Complex b)56 _Float16 _Complex sub_half_cc(_Float16 _Complex a, _Float16 _Complex b) {
57   // X86-LABEL: @sub_half_cc(
58   // X86: fsub
59   // X86: fsub
60   // X86-NOT: fsub
61   // X86: ret
62   return a - b;
63 }
64 
mul_half_rr(_Float16 a,_Float16 b)65 _Float16 _Complex mul_half_rr(_Float16 a, _Float16 b) {
66   // X86-LABEL: @mul_half_rr(
67   // X86: fmul
68   // X86-NOT: fmul
69   // X86: ret
70   return a * b;
71 }
mul_half_cr(_Float16 _Complex a,_Float16 b)72 _Float16 _Complex mul_half_cr(_Float16 _Complex a, _Float16 b) {
73   // X86-LABEL: @mul_half_cr(
74   // X86: fmul
75   // X86: fmul
76   // X86-NOT: fmul
77   // X86: ret
78   return a * b;
79 }
mul_half_rc(_Float16 a,_Float16 _Complex b)80 _Float16 _Complex mul_half_rc(_Float16 a, _Float16 _Complex b) {
81   // X86-LABEL: @mul_half_rc(
82   // X86: fmul
83   // X86: fmul
84   // X86-NOT: fmul
85   // X86: ret
86   return a * b;
87 }
mul_half_cc(_Float16 _Complex a,_Float16 _Complex b)88 _Float16 _Complex mul_half_cc(_Float16 _Complex a, _Float16 _Complex b) {
89   // X86-LABEL: @mul_half_cc(
90   // X86: %[[AC:[^ ]+]] = fmul
91   // X86: %[[BD:[^ ]+]] = fmul
92   // X86: %[[AD:[^ ]+]] = fmul
93   // X86: %[[BC:[^ ]+]] = fmul
94   // X86: %[[RR:[^ ]+]] = fsub half %[[AC]], %[[BD]]
95   // X86: %[[RI:[^ ]+]] = fadd half
96   // X86-DAG: %[[AD]]
97   // X86-DAG: ,
98   // X86-DAG: %[[BC]]
99   // X86: fcmp uno half %[[RR]]
100   // X86: fcmp uno half %[[RI]]
101   // X86: call {{.*}} @__mulhc3(
102   // X86: ret
103   return a * b;
104 }
105 
div_half_rr(_Float16 a,_Float16 b)106 _Float16 _Complex div_half_rr(_Float16 a, _Float16 b) {
107   // X86-LABEL: @div_half_rr(
108   // X86: fdiv
109   // X86-NOT: fdiv
110   // X86: ret
111   return a / b;
112 }
div_half_cr(_Float16 _Complex a,_Float16 b)113 _Float16 _Complex div_half_cr(_Float16 _Complex a, _Float16 b) {
114   // X86-LABEL: @div_half_cr(
115   // X86: fdiv
116   // X86: fdiv
117   // X86-NOT: fdiv
118   // X86: ret
119   return a / b;
120 }
div_half_rc(_Float16 a,_Float16 _Complex b)121 _Float16 _Complex div_half_rc(_Float16 a, _Float16 _Complex b) {
122   // X86-LABEL: @div_half_rc(
123   // X86-NOT: fdiv
124   // X86: call {{.*}} @__divhc3(
125   // X86: ret
126   return a / b;
127 }
div_half_cc(_Float16 _Complex a,_Float16 _Complex b)128 _Float16 _Complex div_half_cc(_Float16 _Complex a, _Float16 _Complex b) {
129   // X86-LABEL: @div_half_cc(
130   // X86-NOT: fdiv
131   // X86: call {{.*}} @__divhc3(
132   // X86: ret
133   return a / b;
134 }
135