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