blob: fe0fa2c2667edbcb3c03f66b8e5f178fb6dcd407 [file] [log] [blame]
Jim Grosbachf7947052012-07-09 18:34:21 +00001// REQUIRES: arm-registered-target
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07002// RUN: %clang_cc1 -emit-llvm -o - -triple arm-none-linux-gnueabi %s | FileCheck %s --check-prefix=NOHALF --check-prefix=CHECK
3// RUN: %clang_cc1 -emit-llvm -o - -triple aarch64-none-linux-gnueabi %s | FileCheck %s --check-prefix=NOHALF --check-prefix=CHECK
4// RUN: %clang_cc1 -emit-llvm -o - -triple arm-none-linux-gnueabi -fallow-half-arguments-and-returns %s | FileCheck %s --check-prefix=HALF --check-prefix=CHECK
5// RUN: %clang_cc1 -emit-llvm -o - -triple aarch64-none-linux-gnueabi -fallow-half-arguments-and-returns %s | FileCheck %s --check-prefix=HALF --check-prefix=CHECK
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -07006// RUN: %clang_cc1 -emit-llvm -o - -triple arm-none-linux-gnueabi -fnative-half-type %s \
7// RUN: | FileCheck %s --check-prefix=NATIVE-HALF
8// RUN: %clang_cc1 -emit-llvm -o - -triple aarch64-none-linux-gnueabi -fnative-half-type %s \
9// RUN: | FileCheck %s --check-prefix=NATIVE-HALF
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +000010typedef unsigned cond_t;
11
12volatile cond_t test;
13volatile __fp16 h0 = 0.0, h1 = 1.0, h2;
14volatile float f0, f1, f2;
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070015volatile double d0;
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +000016
17void foo(void) {
Stephen Lin93ab6bf2013-08-15 06:47:53 +000018 // CHECK-LABEL: define void @foo()
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +000019
20 // Check unary ops
21
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070022 // NOHALF: [[F16TOF32:call float @llvm.convert.from.fp16.f32]]
23 // HALF: [[F16TOF32:fpext half]]
24 // CHECK: fptoui float
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -070025 // NATIVE-HALF: fptoui half
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +000026 test = (h0);
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070027 // CHECK: uitofp i32
28 // NOHALF: [[F32TOF16:call i16 @llvm.convert.to.fp16.f32]]
29 // HALF: [[F32TOF16:fptrunc float]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -070030 // NATIVE-HALF: uitofp i32 {{.*}} to half
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070031 h0 = (test);
32 // CHECK: [[F16TOF32]]
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +000033 // CHECK: fcmp une float
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -070034 // NATIVE-HALF: fcmp une half
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +000035 test = (!h1);
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070036 // CHECK: [[F16TOF32]]
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +000037 // CHECK: fsub float
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070038 // NOHALF: [[F32TOF16]]
39 // HALF: [[F32TOF16]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -070040 // NATIVE-HALF: fsub half
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +000041 h1 = -h1;
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070042 // CHECK: [[F16TOF32]]
43 // CHECK: [[F32TOF16]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -070044 // NATIVE-HALF: load volatile half
45 // NATIVE-HALF-NEXT: store volatile half
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +000046 h1 = +h1;
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070047 // CHECK: [[F16TOF32]]
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +000048 // CHECK: fadd float
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070049 // CHECK: [[F32TOF16]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -070050 // NATIVE-HALF: fadd half
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +000051 h1++;
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070052 // CHECK: [[F16TOF32]]
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +000053 // CHECK: fadd float
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070054 // CHECK: [[F32TOF16]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -070055 // NATIVE-HALF: fadd half
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +000056 ++h1;
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070057 // CHECK: [[F16TOF32]]
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +000058 // CHECK: fadd float
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070059 // CHECK: [[F32TOF16]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -070060 // NATIVE-HALF: fadd half
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +000061 --h1;
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070062 // CHECK: [[F16TOF32]]
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +000063 // CHECK: fadd float
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070064 // CHECK: [[F32TOF16]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -070065 // NATIVE-HALF: fadd half
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +000066 h1--;
67
68 // Check binary ops with various operands
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070069 // CHECK: [[F16TOF32]]
70 // CHECK: [[F16TOF32]]
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +000071 // CHECK: fmul float
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070072 // CHECK: [[F32TOF16]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -070073 // NATIVE-HALF: fmul half
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +000074 h1 = h0 * h2;
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070075 // CHECK: [[F16TOF32]]
76 // NOHALF: [[F32TOF16]]
77 // NOHALF: [[F16TOF32]]
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +000078 // CHECK: fmul float
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070079 // CHECK: [[F32TOF16]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -070080 // NATIVE-HALF: fmul half
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070081 h1 = h0 * (__fp16) -2.0f;
82 // CHECK: [[F16TOF32]]
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +000083 // CHECK: fmul float
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070084 // CHECK: [[F32TOF16]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -070085 // NATIVE-HALF: fpext half
86 // NATIVE-HALF: fmul float
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +000087 h1 = h0 * f2;
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070088 // CHECK: [[F16TOF32]]
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +000089 // CHECK: fmul float
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070090 // CHECK: [[F32TOF16]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -070091 // NATIVE-HALF: fpext half
92 // NATIVE-HALF: fmul float
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +000093 h1 = f0 * h2;
94
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070095 // CHECK: [[F16TOF32]]
96 // CHECK: [[F16TOF32]]
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +000097 // CHECK: fdiv float
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070098 // CHECK: [[F32TOF16]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -070099 // NATIVE-HALF: fdiv half
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000100 h1 = (h0 / h2);
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700101 // CHECK: [[F16TOF32]]
102 // NOHALF: [[F16TOF32]]
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000103 // CHECK: fdiv float
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700104 // CHECK: [[F32TOF16]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700105 // NATIVE-HALF: fdiv half
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700106 h1 = (h0 / (__fp16) -2.0f);
107 // CHECK: [[F16TOF32]]
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000108 // CHECK: fdiv float
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700109 // CHECK: [[F32TOF16]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700110 // NATIVE-HALF: fpext half
111 // NATIVE-HALF: fdiv float
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000112 h1 = (h0 / f2);
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700113 // CHECK: [[F16TOF32]]
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000114 // CHECK: fdiv float
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700115 // CHECK: [[F32TOF16]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700116 // NATIVE-HALF: fpext half
117 // NATIVE-HALF: fdiv float
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000118 h1 = (f0 / h2);
119
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700120 // CHECK: [[F16TOF32]]
121 // CHECK: [[F16TOF32]]
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000122 // CHECK: fadd float
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700123 // CHECK: [[F32TOF16]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700124 // NATIVE-HALF: fadd half
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000125 h1 = (h2 + h0);
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700126 // CHECK: [[F16TOF32]]
127 // NOHALF: [[F16TOF32]]
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000128 // CHECK: fadd float
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700129 // CHECK: [[F32TOF16]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700130 // NATIVE-HALF: fadd half
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000131 h1 = ((__fp16)-2.0 + h0);
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700132 // CHECK: [[F16TOF32]]
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000133 // CHECK: fadd float
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700134 // CHECK: [[F32TOF16]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700135 // NATIVE-HALF: fpext half
136 // NATIVE-HALF: fadd float
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000137 h1 = (h2 + f0);
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700138 // CHECK: [[F16TOF32]]
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000139 // CHECK: fadd float
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700140 // CHECK: [[F32TOF16]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700141 // NATIVE-HALF: fpext half
142 // NATIVE-HALF: fadd float
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000143 h1 = (f2 + h0);
144
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700145 // CHECK: [[F16TOF32]]
146 // CHECK: [[F16TOF32]]
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000147 // CHECK: fsub float
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700148 // CHECK: [[F32TOF16]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700149 // NATIVE-HALF: fsub half
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000150 h1 = (h2 - h0);
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700151 // CHECK: [[F16TOF32]]
152 // NOHALF: [[F16TOF32]]
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000153 // CHECK: fsub float
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700154 // CHECK: [[F32TOF16]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700155 // NATIVE-HALF: fsub half
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700156 h1 = ((__fp16)-2.0f - h0);
157 // CHECK: [[F16TOF32]]
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000158 // CHECK: fsub float
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700159 // CHECK: [[F32TOF16]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700160 // NATIVE-HALF: fpext half
161 // NATIVE-HALF: fsub float
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000162 h1 = (h2 - f0);
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700163 // CHECK: [[F16TOF32]]
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000164 // CHECK: fsub float
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700165 // CHECK: [[F32TOF16]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700166 // NATIVE-HALF: fpext half
167 // NATIVE-HALF: fsub float
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000168 h1 = (f2 - h0);
169
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700170 // CHECK: [[F16TOF32]]
171 // CHECK: [[F16TOF32]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700172 // CHECK: fcmp olt float
173 // NATIVE-HALF: fcmp olt half
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000174 test = (h2 < h0);
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700175 // CHECK: [[F16TOF32]]
176 // NOHALF: [[F16TOF32]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700177 // CHECK: fcmp olt float
178 // NATIVE-HALF: fcmp olt half
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000179 test = (h2 < (__fp16)42.0);
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700180 // CHECK: [[F16TOF32]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700181 // CHECK: fcmp olt float
182 // NATIVE-HALF: fpext half
183 // NATIVE-HALF: fcmp olt float
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000184 test = (h2 < f0);
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700185 // CHECK: [[F16TOF32]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700186 // CHECK: fcmp olt float
187 // NATIVE-HALF: fpext half
188 // NATIVE-HALF: fcmp olt float
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000189 test = (f2 < h0);
190
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700191 // CHECK: [[F16TOF32]]
192 // CHECK: [[F16TOF32]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700193 // CHECK: fcmp ogt float
194 // NATIVE-HALF: fcmp ogt half
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000195 test = (h0 > h2);
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700196 // CHECK: [[F16TOF32]]
197 // NOHALF: [[F16TOF32]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700198 // CHECK: fcmp ogt float
199 // NATIVE-HALF: fcmp ogt half
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000200 test = ((__fp16)42.0 > h2);
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700201 // CHECK: [[F16TOF32]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700202 // CHECK: fcmp ogt float
203 // NATIVE-HALF: fpext half
204 // NATIVE-HALF: fcmp ogt float
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000205 test = (h0 > f2);
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700206 // CHECK: [[F16TOF32]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700207 // CHECK: fcmp ogt float
208 // NATIVE-HALF: fpext half
209 // NATIVE-HALF: fcmp ogt float
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000210 test = (f0 > h2);
211
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700212 // CHECK: [[F16TOF32]]
213 // CHECK: [[F16TOF32]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700214 // CHECK: fcmp ole float
215 // NATIVE-HALF: fcmp ole half
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000216 test = (h2 <= h0);
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700217 // CHECK: [[F16TOF32]]
218 // NOHALF: [[F16TOF32]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700219 // CHECK: fcmp ole float
220 // NATIVE-HALF: fcmp ole half
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000221 test = (h2 <= (__fp16)42.0);
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700222 // CHECK: [[F16TOF32]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700223 // CHECK: fcmp ole float
224 // NATIVE-HALF: fpext half
225 // NATIVE-HALF: fcmp ole float
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000226 test = (h2 <= f0);
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700227 // CHECK: [[F16TOF32]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700228 // CHECK: fcmp ole float
229 // NATIVE-HALF: fpext half
230 // NATIVE-HALF: fcmp ole float
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000231 test = (f2 <= h0);
232
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700233 // CHECK: [[F16TOF32]]
234 // CHECK: [[F16TOF32]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700235 // CHECK: fcmp oge float
236 // NATIVE-HALF: fcmp oge half
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000237 test = (h0 >= h2);
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700238 // CHECK: [[F16TOF32]]
239 // NOHALF: [[F16TOF32]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700240 // CHECK: fcmp oge float
241 // NATIVE-HALF: fcmp oge half
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000242 test = (h0 >= (__fp16)-2.0);
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700243 // CHECK: [[F16TOF32]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700244 // CHECK: fcmp oge float
245 // NATIVE-HALF: fpext half
246 // NATIVE-HALF: fcmp oge float
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000247 test = (h0 >= f2);
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700248 // CHECK: [[F16TOF32]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700249 // CHECK: fcmp oge float
250 // NATIVE-HALF: fpext half
251 // NATIVE-HALF: fcmp oge float
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000252 test = (f0 >= h2);
253
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700254 // CHECK: [[F16TOF32]]
255 // CHECK: [[F16TOF32]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700256 // CHECK: fcmp oeq float
257 // NATIVE-HALF: fcmp oeq half
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000258 test = (h1 == h2);
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700259 // CHECK: [[F16TOF32]]
260 // NOHALF: [[F16TOF32]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700261 // CHECK: fcmp oeq float
262 // NATIVE-HALF: fcmp oeq half
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000263 test = (h1 == (__fp16)1.0);
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700264 // CHECK: [[F16TOF32]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700265 // CHECK: fcmp oeq float
266 // NATIVE-HALF: fpext half
267 // NATIVE-HALF: fcmp oeq float
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000268 test = (h1 == f1);
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700269 // CHECK: [[F16TOF32]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700270 // CHECK: fcmp oeq float
271 // NATIVE-HALF: fpext half
272 // NATIVE-HALF: fcmp oeq float
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000273 test = (f1 == h1);
274
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700275 // CHECK: [[F16TOF32]]
276 // CHECK: [[F16TOF32]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700277 // CHECK: fcmp une float
278 // NATIVE-HALF: fcmp une half
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000279 test = (h1 != h2);
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700280 // CHECK: [[F16TOF32]]
281 // NOHALF: [[F16TOF32]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700282 // CHECK: fcmp une float
283 // NATIVE-HALF: fcmp une half
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000284 test = (h1 != (__fp16)1.0);
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700285 // CHECK: [[F16TOF32]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700286 // CHECK: fcmp une float
287 // NATIVE-HALF: fpext half
288 // NATIVE-HALF: fcmp une float
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000289 test = (h1 != f1);
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700290 // CHECK: [[F16TOF32]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700291 // CHECK: fcmp une float
292 // NATIVE-HALF: fpext half
293 // NATIVE-HALF: fcmp une float
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000294 test = (f1 != h1);
295
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700296 // CHECK: [[F16TOF32]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700297 // CHECK: fcmp une float
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700298 // CHECK: [[F16TOF32]]
299 // CHECK: [[F16TOF32]]
300 // CHECK: [[F32TOF16]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700301 // NATIVE-HALF: fcmp une half {{.*}}, 0xH0000
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000302 h1 = (h1 ? h2 : h0);
303 // Check assignments (inc. compound)
304 h0 = h1;
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700305 // NOHALF: [[F32TOF16]]
306 // HALF: store {{.*}} half 0xHC000
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700307 // NATIVE-HALF: store {{.*}} half 0xHC000
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700308 h0 = (__fp16)-2.0f;
309 // CHECK: [[F32TOF16]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700310 // NATIVE-HALF: fptrunc float
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000311 h0 = f0;
312
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700313 // CHECK: [[F16TOF32]]
314 // CHECK: [[F16TOF32]]
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000315 // CHECK: fadd float
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700316 // CHECK: [[F32TOF16]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700317 // NATIVE-HALF: fadd half
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000318 h0 += h1;
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700319 // CHECK: [[F16TOF32]]
320 // NOHALF: [[F16TOF32]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700321 // CHECK: fadd float
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700322 // CHECK: [[F32TOF16]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700323 // NATIVE-HALF: fadd half
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700324 h0 += (__fp16)1.0f;
325 // CHECK: [[F16TOF32]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700326 // CHECK: fadd float
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700327 // CHECK: [[F32TOF16]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700328 // NATIVE-HALF: fpext half
329 // NATIVE-HALF: fadd float
330 // NATIVE-HALF: fptrunc float
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000331 h0 += f2;
332
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700333 // CHECK: [[F16TOF32]]
334 // CHECK: [[F16TOF32]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700335 // CHECK: fsub float
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700336 // CHECK: [[F32TOF16]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700337 // NATIVE-HALF: fsub half
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000338 h0 -= h1;
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700339 // CHECK: [[F16TOF32]]
340 // NOHALF: [[F16TOF32]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700341 // CHECK: fsub float
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700342 // CHECK: [[F32TOF16]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700343 // NATIVE-HALF: fsub half
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000344 h0 -= (__fp16)1.0;
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700345 // CHECK: [[F16TOF32]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700346 // CHECK: fsub float
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700347 // CHECK: [[F32TOF16]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700348 // NATIVE-HALF: fpext half
349 // NATIVE-HALF: fsub float
350 // NATIVE-HALF: fptrunc float
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000351 h0 -= f2;
352
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700353 // CHECK: [[F16TOF32]]
354 // CHECK: [[F16TOF32]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700355 // CHECK: fmul float
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700356 // CHECK: [[F32TOF16]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700357 // NATIVE-HALF: fmul half
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000358 h0 *= h1;
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700359 // CHECK: [[F16TOF32]]
360 // NOHALF: [[F16TOF32]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700361 // CHECK: fmul float
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700362 // CHECK: [[F32TOF16]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700363 // NATIVE-HALF: fmul half
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000364 h0 *= (__fp16)1.0;
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700365 // CHECK: [[F16TOF32]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700366 // CHECK: fmul float
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700367 // CHECK: [[F32TOF16]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700368 // NATIVE-HALF: fpext half
369 // NATIVE-HALF: fmul float
370 // NATIVE-HALF: fptrunc float
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000371 h0 *= f2;
372
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700373 // CHECK: [[F16TOF32]]
374 // CHECK: [[F16TOF32]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700375 // CHECK: fdiv float
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700376 // CHECK: [[F32TOF16]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700377 // NATIVE-HALF: fdiv half
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000378 h0 /= h1;
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700379 // CHECK: [[F16TOF32]]
380 // NOHALF: [[F16TOF32]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700381 // CHECK: fdiv float
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700382 // CHECK: [[F32TOF16]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700383 // NATIVE-HALF: fdiv half
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000384 h0 /= (__fp16)1.0;
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700385 // CHECK: [[F16TOF32]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700386 // CHECK: fdiv float
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700387 // CHECK: [[F32TOF16]]
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700388 // NATIVE-HALF: fpext half
389 // NATIVE-HALF: fdiv float
390 // NATIVE-HALF: fptrunc float
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000391 h0 /= f2;
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700392
393 // Check conversions to/from double
394 // NOHALF: call i16 @llvm.convert.to.fp16.f64(
395 // HALF: fptrunc double {{.*}} to half
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700396 // NATIVE-HALF: fptrunc double {{.*}} to half
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700397 h0 = d0;
398
399 // CHECK: [[MID:%.*]] = fptrunc double {{%.*}} to float
400 // NOHALF: call i16 @llvm.convert.to.fp16.f32(float [[MID]])
401 // HALF: fptrunc float [[MID]] to half
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700402 // NATIVE-HALF: [[MID:%.*]] = fptrunc double {{%.*}} to float
403 // NATIVE-HALF: fptrunc float {{.*}} to half
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700404 h0 = (float)d0;
405
406 // NOHALF: call double @llvm.convert.from.fp16.f64(
407 // HALF: fpext half {{.*}} to double
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700408 // NATIVE-HALF: fpext half {{.*}} to double
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700409 d0 = h0;
410
411 // NOHALF: [[MID:%.*]] = call float @llvm.convert.from.fp16.f32(
412 // HALF: [[MID:%.*]] = fpext half {{.*}} to float
413 // CHECK: fpext float [[MID]] to double
Pirama Arumuga Nainar6270ca62015-05-20 13:00:06 -0700414 // NATIVE-HALF: [[MID:%.*]] = fpext half {{.*}} to float
415 // NATIVE-HALF: fpext float [[MID]] to double
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700416 d0 = (float)h0;
Anton Korobeynikov8eb5b292011-10-14 23:32:50 +0000417}