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