1 // REQUIRES: arm-registered-target 2 // RUN: %clang_cc1 -emit-llvm -o - -triple arm-none-linux-gnueabi %s | FileCheck %s 3 typedef unsigned cond_t; 4 5 volatile cond_t test; 6 volatile __fp16 h0 = 0.0, h1 = 1.0, h2; 7 volatile float f0, f1, f2; 8 foo(void)9void foo(void) { 10 // CHECK-LABEL: define void @foo() 11 12 // Check unary ops 13 14 // CHECK: call float @llvm.convert.from.fp16.f32( 15 // CHECK fptoi float 16 test = (h0); 17 // CHECK: call float @llvm.convert.from.fp16.f32( 18 // CHECK: fcmp une float 19 test = (!h1); 20 // CHECK: call float @llvm.convert.from.fp16.f32( 21 // CHECK: fsub float 22 // CHECK: call i16 @llvm.convert.to.fp16.f32( 23 h1 = -h1; 24 // CHECK: call float @llvm.convert.from.fp16.f32( 25 // CHECK: call i16 @llvm.convert.to.fp16.f32( 26 h1 = +h1; 27 // CHECK: call float @llvm.convert.from.fp16.f32( 28 // CHECK: fadd float 29 // CHECK: call i16 @llvm.convert.to.fp16.f32( 30 h1++; 31 // CHECK: call float @llvm.convert.from.fp16.f32( 32 // CHECK: fadd float 33 // CHECK: call i16 @llvm.convert.to.fp16.f32( 34 ++h1; 35 // CHECK: call float @llvm.convert.from.fp16.f32( 36 // CHECK: fadd float 37 // CHECK: call i16 @llvm.convert.to.fp16.f32( 38 --h1; 39 // CHECK: call float @llvm.convert.from.fp16.f32( 40 // CHECK: fadd float 41 // CHECK: call i16 @llvm.convert.to.fp16.f32( 42 h1--; 43 44 // Check binary ops with various operands 45 // CHECK: call float @llvm.convert.from.fp16.f32( 46 // CHECK: call float @llvm.convert.from.fp16.f32( 47 // CHECK: fmul float 48 // CHECK: call i16 @llvm.convert.to.fp16.f32( 49 h1 = h0 * h2; 50 // CHECK: call float @llvm.convert.from.fp16.f32( 51 // CHECK: call i16 @llvm.convert.to.fp16.f32( 52 // CHECK: call float @llvm.convert.from.fp16.f32( 53 // CHECK: fmul float 54 // CHECK: call i16 @llvm.convert.to.fp16.f32( 55 h1 = h0 * (__fp16) -2.0; 56 // CHECK: call float @llvm.convert.from.fp16.f32( 57 // CHECK: fmul float 58 // CHECK: call i16 @llvm.convert.to.fp16.f32( 59 h1 = h0 * f2; 60 // CHECK: call float @llvm.convert.from.fp16.f32( 61 // CHECK: fmul float 62 // CHECK: call i16 @llvm.convert.to.fp16.f32( 63 h1 = f0 * h2; 64 65 // CHECK: call float @llvm.convert.from.fp16.f32( 66 // CHECK: call float @llvm.convert.from.fp16.f32( 67 // CHECK: fdiv float 68 // CHECK: call i16 @llvm.convert.to.fp16.f32( 69 h1 = (h0 / h2); 70 // CHECK: call float @llvm.convert.from.fp16.f32( 71 // CHECK: call float @llvm.convert.from.fp16.f32( 72 // CHECK: fdiv float 73 // CHECK: call i16 @llvm.convert.to.fp16.f32( 74 h1 = (h0 / (__fp16) -2.0); 75 // CHECK: call float @llvm.convert.from.fp16.f32( 76 // CHECK: fdiv float 77 // CHECK: call i16 @llvm.convert.to.fp16.f32( 78 h1 = (h0 / f2); 79 // CHECK: call float @llvm.convert.from.fp16.f32( 80 // CHECK: fdiv float 81 // CHECK: call i16 @llvm.convert.to.fp16.f32( 82 h1 = (f0 / h2); 83 84 // CHECK: call float @llvm.convert.from.fp16.f32( 85 // CHECK: call float @llvm.convert.from.fp16.f32( 86 // CHECK: fadd float 87 // CHECK: call i16 @llvm.convert.to.fp16.f32( 88 h1 = (h2 + h0); 89 // CHECK: call float @llvm.convert.from.fp16.f32( 90 // CHECK: call float @llvm.convert.from.fp16.f32( 91 // CHECK: fadd float 92 // CHECK: call i16 @llvm.convert.to.fp16.f32( 93 h1 = ((__fp16)-2.0 + h0); 94 // CHECK: call float @llvm.convert.from.fp16.f32( 95 // CHECK: fadd float 96 // CHECK: call i16 @llvm.convert.to.fp16.f32( 97 h1 = (h2 + f0); 98 // CHECK: call float @llvm.convert.from.fp16.f32( 99 // CHECK: fadd float 100 // CHECK: call i16 @llvm.convert.to.fp16.f32( 101 h1 = (f2 + h0); 102 103 // CHECK: call float @llvm.convert.from.fp16.f32( 104 // CHECK: call float @llvm.convert.from.fp16.f32( 105 // CHECK: fsub float 106 // CHECK: call i16 @llvm.convert.to.fp16.f32( 107 h1 = (h2 - h0); 108 // CHECK: call float @llvm.convert.from.fp16.f32( 109 // CHECK: call float @llvm.convert.from.fp16.f32( 110 // CHECK: fsub float 111 // CHECK: call i16 @llvm.convert.to.fp16.f32( 112 h1 = ((__fp16)-2.0 - h0); 113 // CHECK: call float @llvm.convert.from.fp16.f32( 114 // CHECK: fsub float 115 // CHECK: call i16 @llvm.convert.to.fp16.f32( 116 h1 = (h2 - f0); 117 // CHECK: call float @llvm.convert.from.fp16.f32( 118 // CHECK: fsub float 119 // CHECK: call i16 @llvm.convert.to.fp16.f32( 120 h1 = (f2 - h0); 121 122 // CHECK: call float @llvm.convert.from.fp16.f32( 123 // CHECK: call float @llvm.convert.from.fp16.f32( 124 // CHECK: fcmp olt 125 test = (h2 < h0); 126 // CHECK: call float @llvm.convert.from.fp16.f32( 127 // CHECK: call float @llvm.convert.from.fp16.f32( 128 // CHECK: fcmp olt 129 test = (h2 < (__fp16)42.0); 130 // CHECK: call float @llvm.convert.from.fp16.f32( 131 // CHECK: fcmp olt 132 test = (h2 < f0); 133 // CHECK: call float @llvm.convert.from.fp16.f32( 134 // CHECK: fcmp olt 135 test = (f2 < h0); 136 137 // CHECK: call float @llvm.convert.from.fp16.f32( 138 // CHECK: call float @llvm.convert.from.fp16.f32( 139 // CHECK: fcmp ogt 140 test = (h0 > h2); 141 // CHECK: call float @llvm.convert.from.fp16.f32( 142 // CHECK: call float @llvm.convert.from.fp16.f32( 143 // CHECK: fcmp ogt 144 test = ((__fp16)42.0 > h2); 145 // CHECK: call float @llvm.convert.from.fp16.f32( 146 // CHECK: fcmp ogt 147 test = (h0 > f2); 148 // CHECK: call float @llvm.convert.from.fp16.f32( 149 // CHECK: fcmp ogt 150 test = (f0 > h2); 151 152 // CHECK: call float @llvm.convert.from.fp16.f32( 153 // CHECK: call float @llvm.convert.from.fp16.f32( 154 // CHECK: fcmp ole 155 test = (h2 <= h0); 156 // CHECK: call float @llvm.convert.from.fp16.f32( 157 // CHECK: call float @llvm.convert.from.fp16.f32( 158 // CHECK: fcmp ole 159 test = (h2 <= (__fp16)42.0); 160 // CHECK: call float @llvm.convert.from.fp16.f32( 161 // CHECK: fcmp ole 162 test = (h2 <= f0); 163 // CHECK: call float @llvm.convert.from.fp16.f32( 164 // CHECK: fcmp ole 165 test = (f2 <= h0); 166 167 // CHECK: call float @llvm.convert.from.fp16.f32( 168 // CHECK: call float @llvm.convert.from.fp16.f32( 169 // CHECK: fcmp oge 170 test = (h0 >= h2); 171 // CHECK: call float @llvm.convert.from.fp16.f32( 172 // CHECK: call float @llvm.convert.from.fp16.f32( 173 // CHECK: fcmp oge 174 test = (h0 >= (__fp16)-2.0); 175 // CHECK: call float @llvm.convert.from.fp16.f32( 176 // CHECK: fcmp oge 177 test = (h0 >= f2); 178 // CHECK: call float @llvm.convert.from.fp16.f32( 179 // CHECK: fcmp oge 180 test = (f0 >= h2); 181 182 // CHECK: call float @llvm.convert.from.fp16.f32( 183 // CHECK: call float @llvm.convert.from.fp16.f32( 184 // CHECK: fcmp oeq 185 test = (h1 == h2); 186 // CHECK: call float @llvm.convert.from.fp16.f32( 187 // CHECK: call float @llvm.convert.from.fp16.f32( 188 // CHECK: fcmp oeq 189 test = (h1 == (__fp16)1.0); 190 // CHECK: call float @llvm.convert.from.fp16.f32( 191 // CHECK: fcmp oeq 192 test = (h1 == f1); 193 // CHECK: call float @llvm.convert.from.fp16.f32( 194 // CHECK: fcmp oeq 195 test = (f1 == h1); 196 197 // CHECK: call float @llvm.convert.from.fp16.f32( 198 // CHECK: call float @llvm.convert.from.fp16.f32( 199 // CHECK: fcmp une 200 test = (h1 != h2); 201 // CHECK: call float @llvm.convert.from.fp16.f32( 202 // CHECK: call float @llvm.convert.from.fp16.f32( 203 // CHECK: fcmp une 204 test = (h1 != (__fp16)1.0); 205 // CHECK: call float @llvm.convert.from.fp16.f32( 206 // CHECK: fcmp une 207 test = (h1 != f1); 208 // CHECK: call float @llvm.convert.from.fp16.f32( 209 // CHECK: fcmp une 210 test = (f1 != h1); 211 212 // CHECK: call float @llvm.convert.from.fp16.f32( 213 // CHECK: fcmp une 214 // CHECK: call float @llvm.convert.from.fp16.f32( 215 // CHECK: call float @llvm.convert.from.fp16.f32( 216 // CHECK: call i16 @llvm.convert.to.fp16.f32( 217 h1 = (h1 ? h2 : h0); 218 // Check assignments (inc. compound) 219 h0 = h1; 220 // CHECK: call i16 @llvm.convert.to.fp16.f32( 221 h0 = (__fp16)-2.0; 222 // CHECK: call i16 @llvm.convert.to.fp16.f32( 223 h0 = f0; 224 225 // CHECK: call float @llvm.convert.from.fp16.f32( 226 // CHECK: call float @llvm.convert.from.fp16.f32( 227 // CHECK: fadd float 228 // CHECK: call i16 @llvm.convert.to.fp16.f32( 229 h0 += h1; 230 // CHECK: call float @llvm.convert.from.fp16.f32( 231 // CHECK: call float @llvm.convert.from.fp16.f32( 232 // CHECK: fadd 233 // CHECK: call i16 @llvm.convert.to.fp16.f32( 234 h0 += (__fp16)1.0; 235 // CHECK: call float @llvm.convert.from.fp16.f32( 236 // CHECK: fadd 237 // CHECK: call i16 @llvm.convert.to.fp16.f32( 238 h0 += f2; 239 240 // CHECK: call float @llvm.convert.from.fp16.f32( 241 // CHECK: call float @llvm.convert.from.fp16.f32( 242 // CHECK: fsub 243 // CHECK: call i16 @llvm.convert.to.fp16.f32( 244 h0 -= h1; 245 // CHECK: call float @llvm.convert.from.fp16.f32( 246 // CHECK: call float @llvm.convert.from.fp16.f32( 247 // CHECK: fsub 248 // CHECK: call i16 @llvm.convert.to.fp16.f32( 249 h0 -= (__fp16)1.0; 250 // CHECK: call float @llvm.convert.from.fp16.f32( 251 // CHECK: fsub 252 // CHECK: call i16 @llvm.convert.to.fp16.f32( 253 h0 -= f2; 254 255 // CHECK: call float @llvm.convert.from.fp16.f32( 256 // CHECK: call float @llvm.convert.from.fp16.f32( 257 // CHECK: fmul 258 // CHECK: call i16 @llvm.convert.to.fp16.f32( 259 h0 *= h1; 260 // CHECK: call float @llvm.convert.from.fp16.f32( 261 // CHECK: call float @llvm.convert.from.fp16.f32( 262 // CHECK: fmul 263 // CHECK: call i16 @llvm.convert.to.fp16.f32( 264 h0 *= (__fp16)1.0; 265 // CHECK: call float @llvm.convert.from.fp16.f32( 266 // CHECK: fmul 267 // CHECK: call i16 @llvm.convert.to.fp16.f32( 268 h0 *= f2; 269 270 // CHECK: call float @llvm.convert.from.fp16.f32( 271 // CHECK: call float @llvm.convert.from.fp16.f32( 272 // CHECK: fdiv 273 // CHECK: call i16 @llvm.convert.to.fp16.f32( 274 h0 /= h1; 275 // CHECK: call float @llvm.convert.from.fp16.f32( 276 // CHECK: call float @llvm.convert.from.fp16.f32( 277 // CHECK: fdiv 278 // CHECK: call i16 @llvm.convert.to.fp16.f32( 279 h0 /= (__fp16)1.0; 280 // CHECK: call float @llvm.convert.from.fp16.f32( 281 // CHECK: fdiv 282 // CHECK: call i16 @llvm.convert.to.fp16.f32( 283 h0 /= f2; 284 } 285