1 ; RUN: llc < %s -asm-verbose=false -mtriple=aarch64-none-eabi -mattr=-fullfp16 | FileCheck -allow-deprecated-dag-overlap %s --check-prefix=CHECK-CVT --check-prefix=CHECK 2 ; RUN: llc < %s -asm-verbose=false -mtriple=aarch64-none-eabi -mattr=+fullfp16 | FileCheck -allow-deprecated-dag-overlap %s --check-prefix=CHECK-FP16 --check-prefix=CHECK 3 4 define <8 x half> @add_h(<8 x half> %a, <8 x half> %b) { 5 entry: 6 ; CHECK-CVT-LABEL: add_h: 7 ; CHECK-CVT: fcvt 8 ; CHECK-CVT: fcvt 9 ; CHECK-CVT-DAG: fadd 10 ; CHECK-CVT-DAG: fcvt 11 ; CHECK-CVT-DAG: fcvt 12 ; CHECK-CVT-DAG: fadd 13 ; CHECK-CVT-DAG: fcvt 14 ; CHECK-CVT-DAG: fcvt 15 ; CHECK-CVT-DAG: fadd 16 ; CHECK-CVT-DAG: fcvt 17 ; CHECK-CVT-DAG: fcvt 18 ; CHECK-CVT-DAG: fadd 19 ; CHECK-CVT-DAG: fcvt 20 ; CHECK-CVT-DAG: fcvt 21 ; CHECK-CVT-DAG: fadd 22 ; CHECK-CVT-DAG: fcvt 23 ; CHECK-CVT-DAG: fcvt 24 ; CHECK-CVT-DAG: fadd 25 ; CHECK-CVT-DAG: fcvt 26 ; CHECK-CVT-DAG: fcvt 27 ; CHECK-CVT-DAG: fadd 28 ; CHECK-CVT-DAG: fcvt 29 ; CHECK-CVT-DAG: fcvt 30 ; CHECK-CVT-DAG: fadd 31 ; CHECK-CVT-DAG: fcvt 32 ; CHECK-CVT-DAG: fcvt 33 ; CHECK-CVT-DAG: fcvt 34 ; CHECK-CVT-DAG: fcvt 35 ; CHECK-CVT-DAG: fcvt 36 ; CHECK-CVT-DAG: fcvt 37 ; CHECK-CVT-DAG: fcvt 38 ; CHECK-CVT: fcvt 39 40 ; CHECK-FP16-LABEL: add_h: 41 ; CHECK-FP16: fadd v0.8h, v0.8h, v1.8h 42 ; CHECK-FP16-NEXT: ret 43 44 %0 = fadd <8 x half> %a, %b 45 ret <8 x half> %0 46 } 47 48 49 define <8 x half> @sub_h(<8 x half> %a, <8 x half> %b) { 50 entry: 51 ; CHECK-CVT-LABEL: sub_h: 52 ; CHECK-CVT: fcvt 53 ; CHECK-CVT: fcvt 54 ; CHECK-CVT-DAG: fsub 55 ; CHECK-CVT-DAG: fcvt 56 ; CHECK-CVT-DAG: fcvt 57 ; CHECK-CVT-DAG: fsub 58 ; CHECK-CVT-DAG: fcvt 59 ; CHECK-CVT-DAG: fcvt 60 ; CHECK-CVT-DAG: fsub 61 ; CHECK-CVT-DAG: fcvt 62 ; CHECK-CVT-DAG: fcvt 63 ; CHECK-CVT-DAG: fsub 64 ; CHECK-CVT-DAG: fcvt 65 ; CHECK-CVT-DAG: fcvt 66 ; CHECK-CVT-DAG: fsub 67 ; CHECK-CVT-DAG: fcvt 68 ; CHECK-CVT-DAG: fcvt 69 ; CHECK-CVT-DAG: fsub 70 ; CHECK-CVT-DAG: fcvt 71 ; CHECK-CVT-DAG: fcvt 72 ; CHECK-CVT-DAG: fsub 73 ; CHECK-CVT-DAG: fcvt 74 ; CHECK-CVT-DAG: fcvt 75 ; CHECK-CVT-DAG: fsub 76 ; CHECK-CVT-DAG: fcvt 77 ; CHECK-CVT-DAG: fcvt 78 ; CHECK-CVT-DAG: fcvt 79 ; CHECK-CVT-DAG: fcvt 80 ; CHECK-CVT-DAG: fcvt 81 ; CHECK-CVT-DAG: fcvt 82 ; CHECK-CVT-DAG: fcvt 83 ; CHECK-CVT: fcvt 84 85 ; CHECK-FP16-LABEL: sub_h: 86 ; CHECK-FP16: fsub v0.8h, v0.8h, v1.8h 87 ; CHECK-FP16-NEXT: ret 88 89 %0 = fsub <8 x half> %a, %b 90 ret <8 x half> %0 91 } 92 93 94 define <8 x half> @mul_h(<8 x half> %a, <8 x half> %b) { 95 entry: 96 ; CHECK-CVT-LABEL: mul_h: 97 ; CHECK-CVT: fcvt 98 ; CHECK-CVT: fcvt 99 ; CHECK-CVT-DAG: fmul 100 ; CHECK-CVT-DAG: fcvt 101 ; CHECK-CVT-DAG: fcvt 102 ; CHECK-CVT-DAG: fmul 103 ; CHECK-CVT-DAG: fcvt 104 ; CHECK-CVT-DAG: fcvt 105 ; CHECK-CVT-DAG: fmul 106 ; CHECK-CVT-DAG: fcvt 107 ; CHECK-CVT-DAG: fcvt 108 ; CHECK-CVT-DAG: fmul 109 ; CHECK-CVT-DAG: fcvt 110 ; CHECK-CVT-DAG: fcvt 111 ; CHECK-CVT-DAG: fmul 112 ; CHECK-CVT-DAG: fcvt 113 ; CHECK-CVT-DAG: fcvt 114 ; CHECK-CVT-DAG: fmul 115 ; CHECK-CVT-DAG: fcvt 116 ; CHECK-CVT-DAG: fcvt 117 ; CHECK-CVT-DAG: fmul 118 ; CHECK-CVT-DAG: fcvt 119 ; CHECK-CVT-DAG: fcvt 120 ; CHECK-CVT-DAG: fmul 121 ; CHECK-CVT-DAG: fcvt 122 ; CHECK-CVT-DAG: fcvt 123 ; CHECK-CVT-DAG: fcvt 124 ; CHECK-CVT-DAG: fcvt 125 ; CHECK-CVT-DAG: fcvt 126 ; CHECK-CVT-DAG: fcvt 127 ; CHECK-CVT-DAG: fcvt 128 ; CHECK-CVT: fcvt 129 130 ; CHECK-FP16-LABEL: mul_h: 131 ; CHECK-FP16: fmul v0.8h, v0.8h, v1.8h 132 ; CHECK-FP16-NEXT: ret 133 134 %0 = fmul <8 x half> %a, %b 135 ret <8 x half> %0 136 } 137 138 139 define <8 x half> @div_h(<8 x half> %a, <8 x half> %b) { 140 entry: 141 ; CHECK-CVT-LABEL: div_h: 142 ; CHECK-CVT: fcvt 143 ; CHECK-CVT: fcvt 144 ; CHECK-CVT-DAG: fdiv 145 ; CHECK-CVT-DAG: fcvt 146 ; CHECK-CVT-DAG: fcvt 147 ; CHECK-CVT-DAG: fdiv 148 ; CHECK-CVT-DAG: fcvt 149 ; CHECK-CVT-DAG: fcvt 150 ; CHECK-CVT-DAG: fdiv 151 ; CHECK-CVT-DAG: fcvt 152 ; CHECK-CVT-DAG: fcvt 153 ; CHECK-CVT-DAG: fdiv 154 ; CHECK-CVT-DAG: fcvt 155 ; CHECK-CVT-DAG: fcvt 156 ; CHECK-CVT-DAG: fdiv 157 ; CHECK-CVT-DAG: fcvt 158 ; CHECK-CVT-DAG: fcvt 159 ; CHECK-CVT-DAG: fdiv 160 ; CHECK-CVT-DAG: fcvt 161 ; CHECK-CVT-DAG: fcvt 162 ; CHECK-CVT-DAG: fdiv 163 ; CHECK-CVT-DAG: fcvt 164 ; CHECK-CVT-DAG: fcvt 165 ; CHECK-CVT-DAG: fdiv 166 ; CHECK-CVT-DAG: fcvt 167 ; CHECK-CVT-DAG: fcvt 168 ; CHECK-CVT-DAG: fcvt 169 ; CHECK-CVT-DAG: fcvt 170 ; CHECK-CVT-DAG: fcvt 171 ; CHECK-CVT-DAG: fcvt 172 ; CHECK-CVT-DAG: fcvt 173 ; CHECK-CVT: fcvt 174 175 ; CHECK-FP16-LABEL: div_h: 176 ; CHECK-FP16: fdiv v0.8h, v0.8h, v1.8h 177 ; CHECK-FP16-NEXT: ret 178 179 %0 = fdiv <8 x half> %a, %b 180 ret <8 x half> %0 181 } 182 183 184 define <8 x half> @load_h(<8 x half>* %a) { 185 entry: 186 ; CHECK-LABEL: load_h: 187 ; CHECK: ldr q0, [x0] 188 %0 = load <8 x half>, <8 x half>* %a, align 4 189 ret <8 x half> %0 190 } 191 192 193 define void @store_h(<8 x half>* %a, <8 x half> %b) { 194 entry: 195 ; CHECK-LABEL: store_h: 196 ; CHECK: str q0, [x0] 197 store <8 x half> %b, <8 x half>* %a, align 4 198 ret void 199 } 200 201 define <8 x half> @s_to_h(<8 x float> %a) { 202 ; CHECK-LABEL: s_to_h: 203 ; CHECK-DAG: fcvtn v0.4h, v0.4s 204 ; CHECK-DAG: fcvtn [[REG:v[0-9+]]].4h, v1.4s 205 ; CHECK: mov v0.d[1], [[REG]].d[0] 206 %1 = fptrunc <8 x float> %a to <8 x half> 207 ret <8 x half> %1 208 } 209 210 define <8 x half> @d_to_h(<8 x double> %a) { 211 ; CHECK-LABEL: d_to_h: 212 ; CHECK-DAG: mov d{{[0-9]+}}, v{{[0-9]+}}.d[1] 213 ; CHECK-DAG: mov d{{[0-9]+}}, v{{[0-9]+}}.d[1] 214 ; CHECK-DAG: mov d{{[0-9]+}}, v{{[0-9]+}}.d[1] 215 ; CHECK-DAG: mov d{{[0-9]+}}, v{{[0-9]+}}.d[1] 216 ; CHECK-DAG: fcvt h 217 ; CHECK-DAG: fcvt h 218 ; CHECK-DAG: fcvt h 219 ; CHECK-DAG: fcvt h 220 ; CHECK-DAG: fcvt h 221 ; CHECK-DAG: fcvt h 222 ; CHECK-DAG: fcvt h 223 ; CHECK-DAG: fcvt h 224 ; CHECK-DAG: mov v{{[0-9]+}}.h 225 ; CHECK-DAG: mov v{{[0-9]+}}.h 226 ; CHECK-DAG: mov v{{[0-9]+}}.h 227 ; CHECK-DAG: mov v{{[0-9]+}}.h 228 ; CHECK-DAG: mov v{{[0-9]+}}.h 229 ; CHECK-DAG: mov v{{[0-9]+}}.h 230 ; CHECK-DAG: mov v{{[0-9]+}}.h 231 ; CHECK-DAG: mov v{{[0-9]+}}.h 232 %1 = fptrunc <8 x double> %a to <8 x half> 233 ret <8 x half> %1 234 } 235 236 define <8 x float> @h_to_s(<8 x half> %a) { 237 ; CHECK-LABEL: h_to_s: 238 ; CHECK: fcvtl2 v1.4s, v0.8h 239 ; CHECK: fcvtl v0.4s, v0.4h 240 %1 = fpext <8 x half> %a to <8 x float> 241 ret <8 x float> %1 242 } 243 244 define <8 x double> @h_to_d(<8 x half> %a) { 245 ; CHECK-LABEL: h_to_d: 246 ; CHECK-DAG: mov h{{[0-9]+}}, v0.h 247 ; CHECK-DAG: mov h{{[0-9]+}}, v0.h 248 ; CHECK-DAG: mov h{{[0-9]+}}, v0.h 249 ; CHECK-DAG: mov h{{[0-9]+}}, v0.h 250 ; CHECK-DAG: mov h{{[0-9]+}}, v0.h 251 ; CHECK-DAG: mov h{{[0-9]+}}, v0.h 252 ; CHECK-DAG: mov h{{[0-9]+}}, v0.h 253 ; CHECK-DAG: fcvt d 254 ; CHECK-DAG: fcvt d 255 ; CHECK-DAG: fcvt d 256 ; CHECK-DAG: fcvt d 257 ; CHECK-DAG: fcvt d 258 ; CHECK-DAG: fcvt d 259 ; CHECK-DAG: fcvt d 260 ; CHECK-DAG: fcvt d 261 %1 = fpext <8 x half> %a to <8 x double> 262 ret <8 x double> %1 263 } 264 265 266 define <8 x half> @bitcast_i_to_h(float, <8 x i16> %a) { 267 ; CHECK-LABEL: bitcast_i_to_h: 268 ; CHECK: mov v0.16b, v1.16b 269 %2 = bitcast <8 x i16> %a to <8 x half> 270 ret <8 x half> %2 271 } 272 273 define <8 x i16> @bitcast_h_to_i(float, <8 x half> %a) { 274 ; CHECK-LABEL: bitcast_h_to_i: 275 ; CHECK: mov v0.16b, v1.16b 276 %2 = bitcast <8 x half> %a to <8 x i16> 277 ret <8 x i16> %2 278 } 279 280 281 define <8 x half> @sitofp_i8(<8 x i8> %a) #0 { 282 ; CHECK-LABEL: sitofp_i8: 283 ; CHECK-NEXT: sshll v[[REG1:[0-9]+]].8h, v0.8b, #0 284 ; CHECK-NEXT: sshll2 [[LO:v[0-9]+\.4s]], v[[REG1]].8h, #0 285 ; CHECK-NEXT: sshll [[HI:v[0-9]+\.4s]], v[[REG1]].4h, #0 286 ; CHECK-DAG: scvtf [[HIF:v[0-9]+\.4s]], [[HI]] 287 ; CHECK-DAG: scvtf [[LOF:v[0-9]+\.4s]], [[LO]] 288 ; CHECK-DAG: fcvtn v[[LOREG:[0-9]+]].4h, [[LOF]] 289 ; CHECK-DAG: fcvtn v0.4h, [[HIF]] 290 ; CHECK: mov v0.d[1], v[[LOREG]].d[0] 291 %1 = sitofp <8 x i8> %a to <8 x half> 292 ret <8 x half> %1 293 } 294 295 296 define <8 x half> @sitofp_i16(<8 x i16> %a) #0 { 297 ; CHECK-LABEL: sitofp_i16: 298 ; CHECK-NEXT: sshll2 [[LO:v[0-9]+\.4s]], v0.8h, #0 299 ; CHECK-NEXT: sshll [[HI:v[0-9]+\.4s]], v0.4h, #0 300 ; CHECK-DAG: scvtf [[HIF:v[0-9]+\.4s]], [[HI]] 301 ; CHECK-DAG: scvtf [[LOF:v[0-9]+\.4s]], [[LO]] 302 ; CHECK-DAG: fcvtn v[[LOREG:[0-9]+]].4h, [[LOF]] 303 ; CHECK-DAG: fcvtn v0.4h, [[HIF]] 304 ; CHECK: mov v0.d[1], v[[LOREG]].d[0] 305 %1 = sitofp <8 x i16> %a to <8 x half> 306 ret <8 x half> %1 307 } 308 309 310 define <8 x half> @sitofp_i32(<8 x i32> %a) #0 { 311 ; CHECK-LABEL: sitofp_i32: 312 ; CHECK-DAG: scvtf [[OP1:v[0-9]+\.4s]], v0.4s 313 ; CHECK-DAG: scvtf [[OP2:v[0-9]+\.4s]], v1.4s 314 ; CHECK-DAG: fcvtn v[[REG:[0-9]+]].4h, [[OP2]] 315 ; CHECK-DAG: fcvtn v0.4h, [[OP1]] 316 ; CHECK: mov v0.d[1], v[[REG]].d[0] 317 %1 = sitofp <8 x i32> %a to <8 x half> 318 ret <8 x half> %1 319 } 320 321 322 define <8 x half> @sitofp_i64(<8 x i64> %a) #0 { 323 ; CHECK-LABEL: sitofp_i64: 324 ; CHECK-DAG: scvtf [[OP1:v[0-9]+\.2d]], v0.2d 325 ; CHECK-DAG: scvtf [[OP2:v[0-9]+\.2d]], v1.2d 326 ; CHECK-DAG: fcvtn [[OP3:v[0-9]+]].2s, [[OP1]] 327 ; CHECK-DAG: fcvtn2 [[OP3]].4s, [[OP2]] 328 ; CHECK: fcvtn v0.4h, [[OP3]].4s 329 %1 = sitofp <8 x i64> %a to <8 x half> 330 ret <8 x half> %1 331 } 332 333 define <8 x half> @uitofp_i8(<8 x i8> %a) #0 { 334 ; CHECK-LABEL: uitofp_i8: 335 ; CHECK-NEXT: ushll v[[REG1:[0-9]+]].8h, v0.8b, #0 336 ; CHECK-NEXT: ushll2 [[LO:v[0-9]+\.4s]], v[[REG1]].8h, #0 337 ; CHECK-NEXT: ushll [[HI:v[0-9]+\.4s]], v[[REG1]].4h, #0 338 ; CHECK-DAG: ucvtf [[HIF:v[0-9]+\.4s]], [[HI]] 339 ; CHECK-DAG: ucvtf [[LOF:v[0-9]+\.4s]], [[LO]] 340 ; CHECK-DAG: fcvtn v[[LOREG:[0-9]+]].4h, [[LOF]] 341 ; CHECK-DAG: fcvtn v0.4h, [[HIF]] 342 ; CHECK: mov v0.d[1], v[[LOREG]].d[0] 343 %1 = uitofp <8 x i8> %a to <8 x half> 344 ret <8 x half> %1 345 } 346 347 348 define <8 x half> @uitofp_i16(<8 x i16> %a) #0 { 349 ; CHECK-LABEL: uitofp_i16: 350 ; CHECK-NEXT: ushll2 [[LO:v[0-9]+\.4s]], v0.8h, #0 351 ; CHECK-NEXT: ushll [[HI:v[0-9]+\.4s]], v0.4h, #0 352 ; CHECK-DAG: ucvtf [[HIF:v[0-9]+\.4s]], [[HI]] 353 ; CHECK-DAG: ucvtf [[LOF:v[0-9]+\.4s]], [[LO]] 354 ; CHECK-DAG: fcvtn v[[LOREG:[0-9]+]].4h, [[LOF]] 355 ; CHECK-DAG: fcvtn v0.4h, [[HIF]] 356 ; CHECK: mov v0.d[1], v[[LOREG]].d[0] 357 %1 = uitofp <8 x i16> %a to <8 x half> 358 ret <8 x half> %1 359 } 360 361 362 define <8 x half> @uitofp_i32(<8 x i32> %a) #0 { 363 ; CHECK-LABEL: uitofp_i32: 364 ; CHECK-DAG: ucvtf [[OP1:v[0-9]+\.4s]], v0.4s 365 ; CHECK-DAG: ucvtf [[OP2:v[0-9]+\.4s]], v1.4s 366 ; CHECK-DAG: fcvtn v[[REG:[0-9]+]].4h, [[OP2]] 367 ; CHECK-DAG: fcvtn v0.4h, [[OP1]] 368 ; CHECK: mov v0.d[1], v[[REG]].d[0] 369 %1 = uitofp <8 x i32> %a to <8 x half> 370 ret <8 x half> %1 371 } 372 373 374 define <8 x half> @uitofp_i64(<8 x i64> %a) #0 { 375 ; CHECK-LABEL: uitofp_i64: 376 ; CHECK-DAG: ucvtf [[OP1:v[0-9]+\.2d]], v0.2d 377 ; CHECK-DAG: ucvtf [[OP2:v[0-9]+\.2d]], v1.2d 378 ; CHECK-DAG: fcvtn [[OP3:v[0-9]+]].2s, [[OP1]] 379 ; CHECK-DAG: fcvtn2 [[OP3]].4s, [[OP2]] 380 ; CHECK: fcvtn v0.4h, [[OP3]].4s 381 %1 = uitofp <8 x i64> %a to <8 x half> 382 ret <8 x half> %1 383 } 384 385 define void @test_insert_at_zero(half %a, <8 x half>* %b) #0 { 386 ; CHECK-LABEL: test_insert_at_zero: 387 ; CHECK-NEXT: str q0, [x0] 388 ; CHECK-NEXT: ret 389 %1 = insertelement <8 x half> undef, half %a, i64 0 390 store <8 x half> %1, <8 x half>* %b, align 4 391 ret void 392 } 393 394 define <8 x i8> @fptosi_i8(<8 x half> %a) #0 { 395 ; CHECK-LABEL: fptosi_i8: 396 ; CHECK-DAG: fcvtl [[LO:v[0-9]+\.4s]], v0.4h 397 ; CHECK-DAG: fcvtl2 [[HI:v[0-9]+\.4s]], v0.8h 398 ; CHECK-DAG: fcvtzs [[LOF32:v[0-9]+\.4s]], [[LO]] 399 ; CHECK-DAG: xtn [[I16:v[0-9]+]].4h, [[LOF32]] 400 ; CHECK-DAG: fcvtzs [[HIF32:v[0-9]+\.4s]], [[HI]] 401 ; CHECK-DAG: xtn2 [[I16]].8h, [[HIF32]] 402 ; CHECK-NEXT: xtn v0.8b, [[I16]].8h 403 ; CHECK-NEXT: ret 404 %1 = fptosi<8 x half> %a to <8 x i8> 405 ret <8 x i8> %1 406 } 407 408 define <8 x i16> @fptosi_i16(<8 x half> %a) #0 { 409 ; CHECK-LABEL: fptosi_i16: 410 ; CHECK-DAG: fcvtl [[LO:v[0-9]+\.4s]], v0.4h 411 ; CHECK-DAG: fcvtl2 [[HI:v[0-9]+\.4s]], v0.8h 412 ; CHECK-DAG: fcvtzs [[LOF32:v[0-9]+\.4s]], [[LO]] 413 ; CHECK-DAG: xtn [[I16:v[0-9]+]].4h, [[LOF32]] 414 ; CHECK-DAG: fcvtzs [[HIF32:v[0-9]+\.4s]], [[HI]] 415 ; CHECK-NEXT: xtn2 [[I16]].8h, [[HIF32]] 416 ; CHECK-NEXT: ret 417 %1 = fptosi<8 x half> %a to <8 x i16> 418 ret <8 x i16> %1 419 } 420 421 define <8 x i8> @fptoui_i8(<8 x half> %a) #0 { 422 ; CHECK-LABEL: fptoui_i8: 423 ; CHECK-DAG: fcvtl [[LO:v[0-9]+\.4s]], v0.4h 424 ; CHECK-DAG: fcvtl2 [[HI:v[0-9]+\.4s]], v0.8h 425 ; CHECK-DAG: fcvtzu [[LOF32:v[0-9]+\.4s]], [[LO]] 426 ; CHECK-DAG: xtn [[I16:v[0-9]+]].4h, [[LOF32]] 427 ; CHECK-DAG: fcvtzu [[HIF32:v[0-9]+\.4s]], [[HI]] 428 ; CHECK-DAG: xtn2 [[I16]].8h, [[HIF32]] 429 ; CHECK-NEXT: xtn v0.8b, [[I16]].8h 430 ; CHECK-NEXT: ret 431 %1 = fptoui<8 x half> %a to <8 x i8> 432 ret <8 x i8> %1 433 } 434 435 define <8 x i16> @fptoui_i16(<8 x half> %a) #0 { 436 ; CHECK-LABEL: fptoui_i16: 437 ; CHECK-DAG: fcvtl [[LO:v[0-9]+\.4s]], v0.4h 438 ; CHECK-DAG: fcvtl2 [[HI:v[0-9]+\.4s]], v0.8h 439 ; CHECK-DAG: fcvtzu [[LOF32:v[0-9]+\.4s]], [[LO]] 440 ; CHECK-DAG: xtn [[I16:v[0-9]+]].4h, [[LOF32]] 441 ; CHECK-DAG: fcvtzu [[HIF32:v[0-9]+\.4s]], [[HI]] 442 ; CHECK-NEXT: xtn2 [[I16]].8h, [[HIF32]] 443 ; CHECK-NEXT: ret 444 %1 = fptoui<8 x half> %a to <8 x i16> 445 ret <8 x i16> %1 446 } 447 448 define <8 x i1> @test_fcmp_une(<8 x half> %a, <8 x half> %b) #0 { 449 ; FileCheck checks are unwieldy with 16 fcvt and 8 csel tests, so skipped for -fullfp16. 450 451 ; CHECK-FP16-LABEL: test_fcmp_une: 452 ; CHECK-FP16-NOT: fcvt 453 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 454 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 455 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 456 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 457 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 458 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 459 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 460 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 461 462 %1 = fcmp une <8 x half> %a, %b 463 ret <8 x i1> %1 464 } 465 466 define <8 x i1> @test_fcmp_ueq(<8 x half> %a, <8 x half> %b) #0 { 467 ; FileCheck checks are unwieldy with 16 fcvt and 8 csel tests, so skipped for -fullfp16. 468 469 ; CHECK-FP16-LABEL: test_fcmp_ueq: 470 ; CHECK-FP16-NOT: fcvt 471 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 472 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 473 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 474 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 475 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 476 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 477 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 478 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 479 480 %1 = fcmp ueq <8 x half> %a, %b 481 ret <8 x i1> %1 482 } 483 484 define <8 x i1> @test_fcmp_ugt(<8 x half> %a, <8 x half> %b) #0 { 485 ; FileCheck checks are unwieldy with 16 fcvt and 8 csel tests, so skipped for -fullfp16. 486 487 ; CHECK-FP16-LABEL: test_fcmp_ugt: 488 ; CHECK-FP16-NOT: fcvt 489 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 490 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 491 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 492 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 493 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 494 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 495 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 496 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 497 498 %1 = fcmp ugt <8 x half> %a, %b 499 ret <8 x i1> %1 500 } 501 502 define <8 x i1> @test_fcmp_uge(<8 x half> %a, <8 x half> %b) #0 { 503 ; FileCheck checks are unwieldy with 16 fcvt and 8 csel tests, so skipped for -fullfp16. 504 505 ; CHECK-FP16-LABEL: test_fcmp_uge: 506 ; CHECK-FP16-NOT: fcvt 507 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 508 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 509 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 510 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 511 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 512 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 513 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 514 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 515 516 %1 = fcmp uge <8 x half> %a, %b 517 ret <8 x i1> %1 518 } 519 520 define <8 x i1> @test_fcmp_ult(<8 x half> %a, <8 x half> %b) #0 { 521 ; FileCheck checks are unwieldy with 16 fcvt and 8 csel tests, so skipped for -fullfp16. 522 523 ; CHECK-FP16-LABEL: test_fcmp_ult: 524 ; CHECK-FP16-NOT: fcvt 525 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 526 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 527 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 528 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 529 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 530 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 531 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 532 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 533 534 %1 = fcmp ult <8 x half> %a, %b 535 ret <8 x i1> %1 536 } 537 538 define <8 x i1> @test_fcmp_ule(<8 x half> %a, <8 x half> %b) #0 { 539 ; FileCheck checks are unwieldy with 16 fcvt and 8 csel tests, so skipped for -fullfp16. 540 541 ; CHECK-FP16-LABEL: test_fcmp_ule: 542 ; CHECK-FP16-NOT: fcvt 543 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 544 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 545 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 546 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 547 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 548 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 549 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 550 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 551 552 %1 = fcmp ule <8 x half> %a, %b 553 ret <8 x i1> %1 554 } 555 556 define <8 x i1> @test_fcmp_uno(<8 x half> %a, <8 x half> %b) #0 { 557 ; FileCheck checks are unwieldy with 16 fcvt and 8 csel tests, so skipped for -fullfp16. 558 559 ; CHECK-FP16-LABEL: test_fcmp_uno: 560 ; CHECK-FP16-NOT: fcvt 561 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 562 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 563 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 564 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 565 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 566 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 567 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 568 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 569 570 %1 = fcmp uno <8 x half> %a, %b 571 ret <8 x i1> %1 572 } 573 574 define <8 x i1> @test_fcmp_one(<8 x half> %a, <8 x half> %b) #0 { 575 ; FileCheck checks are unwieldy with 16 fcvt and 8 csel tests, so skipped for -fullfp16. 576 577 ; CHECK-FP16-LABEL: test_fcmp_one: 578 ; CHECK-FP16-NOT: fcvt 579 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 580 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 581 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 582 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 583 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 584 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 585 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 586 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 587 588 %1 = fcmp one <8 x half> %a, %b 589 ret <8 x i1> %1 590 } 591 592 define <8 x i1> @test_fcmp_oeq(<8 x half> %a, <8 x half> %b) #0 { 593 ; FileCheck checks are unwieldy with 16 fcvt and 8 csel tests, so skipped for -fullfp16. 594 595 ; CHECK-FP16-LABEL: test_fcmp_oeq: 596 ; CHECK-FP16-NOT: fcvt 597 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 598 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 599 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 600 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 601 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 602 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 603 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 604 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 605 606 %1 = fcmp oeq <8 x half> %a, %b 607 ret <8 x i1> %1 608 } 609 610 define <8 x i1> @test_fcmp_ogt(<8 x half> %a, <8 x half> %b) #0 { 611 ; FileCheck checks are unwieldy with 16 fcvt and 8 csel tests, so skipped for -fullfp16. 612 613 ; CHECK-FP16-LABEL: test_fcmp_ogt: 614 ; CHECK-FP16-NOT: fcvt 615 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 616 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 617 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 618 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 619 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 620 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 621 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 622 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 623 624 %1 = fcmp ogt <8 x half> %a, %b 625 ret <8 x i1> %1 626 } 627 628 define <8 x i1> @test_fcmp_oge(<8 x half> %a, <8 x half> %b) #0 { 629 ; FileCheck checks are unwieldy with 16 fcvt and 8 csel tests, so skipped for -fullfp16. 630 631 ; CHECK-FP16-LABEL: test_fcmp_oge: 632 ; CHECK-FP16-NOT: fcvt 633 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 634 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 635 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 636 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 637 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 638 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 639 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 640 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 641 642 %1 = fcmp oge <8 x half> %a, %b 643 ret <8 x i1> %1 644 } 645 646 define <8 x i1> @test_fcmp_olt(<8 x half> %a, <8 x half> %b) #0 { 647 ; FileCheck checks are unwieldy with 16 fcvt and 8 csel tests, so skipped for -fullfp16. 648 649 ; CHECK-FP16-LABEL: test_fcmp_olt: 650 ; CHECK-FP16-NOT: fcvt 651 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 652 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 653 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 654 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 655 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 656 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 657 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 658 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 659 660 %1 = fcmp olt <8 x half> %a, %b 661 ret <8 x i1> %1 662 } 663 664 define <8 x i1> @test_fcmp_ole(<8 x half> %a, <8 x half> %b) #0 { 665 ; FileCheck checks are unwieldy with 16 fcvt and 8 csel tests, so skipped for -fullfp16. 666 667 ; CHECK-FP16-LABEL: test_fcmp_ole: 668 ; CHECK-FP16-NOT: fcvt 669 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 670 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 671 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 672 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 673 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 674 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 675 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 676 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 677 678 %1 = fcmp ole <8 x half> %a, %b 679 ret <8 x i1> %1 680 } 681 682 define <8 x i1> @test_fcmp_ord(<8 x half> %a, <8 x half> %b) #0 { 683 ; FileCheck checks are unwieldy with 16 fcvt and 8 csel tests, so skipped for -fullfp16. 684 685 ; CHECK-FP16-LABEL: test_fcmp_ord: 686 ; CHECK-FP16-NOT: fcvt 687 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 688 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 689 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 690 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 691 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 692 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 693 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 694 ; CHECK-FP16-DAG: fcmp h{{[0-9]}}, h{{[0-9]}} 695 696 %1 = fcmp ord <8 x half> %a, %b 697 ret <8 x i1> %1 698 } 699 700 attributes #0 = { nounwind } 701