|
1 | 1 | ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6 |
2 | | -; RUN: llc -mtriple=aarch64 -mattr=+v9a,+sve2,+crypto,+bf16,+sm4,+i8mm,+sve2-bitperm,+sve2-sha3,+sve2-aes,+sve2-sm4 %s -o - | FileCheck %s --check-prefixes=CHECK |
| 2 | +; RUN: llc -mattr=+sve %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SVE |
| 3 | +; RUN: llc -mattr=+sme -force-streaming %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SME |
| 4 | + |
| 5 | +target triple = "aarch64" |
3 | 6 |
|
4 | 7 | define <vscale x 2 x double> @fmsub_nxv2f64(<vscale x 2 x double> %a, <vscale x 2 x double> %b, <vscale x 2 x double> %c) { |
5 | 8 | ; CHECK-LABEL: fmsub_nxv2f64: |
@@ -274,3 +277,113 @@ entry: |
274 | 277 | %0 = tail call <8 x half> @llvm.fmuladd(<8 x half> %neg, <8 x half> %b, <8 x half> %neg1) |
275 | 278 | ret <8 x half> %0 |
276 | 279 | } |
| 280 | + |
| 281 | +; Illegal types |
| 282 | + |
| 283 | +define <vscale x 3 x float> @fmsub_illegal_nxv3f32(<vscale x 3 x float> %a, <vscale x 3 x float> %b, <vscale x 3 x float> %c) { |
| 284 | +; CHECK-LABEL: fmsub_illegal_nxv3f32: |
| 285 | +; CHECK: // %bb.0: // %entry |
| 286 | +; CHECK-NEXT: ptrue p0.s |
| 287 | +; CHECK-NEXT: fnmsb z0.s, p0/m, z1.s, z2.s |
| 288 | +; CHECK-NEXT: ret |
| 289 | +entry: |
| 290 | + %neg = fneg <vscale x 3 x float> %c |
| 291 | + %0 = tail call <vscale x 3 x float> @llvm.fmuladd(<vscale x 3 x float> %a, <vscale x 3 x float> %b, <vscale x 3 x float> %neg) |
| 292 | + ret <vscale x 3 x float> %0 |
| 293 | +} |
| 294 | + |
| 295 | +define <1 x double> @fmsub_illegal_v1f64(<1 x double> %a, <1 x double> %b, <1 x double> %c) { |
| 296 | +; CHECK-SVE-LABEL: fmsub_illegal_v1f64: |
| 297 | +; CHECK-SVE: // %bb.0: // %entry |
| 298 | +; CHECK-SVE-NEXT: ptrue p0.d, vl1 |
| 299 | +; CHECK-SVE-NEXT: // kill: def $d0 killed $d0 def $z0 |
| 300 | +; CHECK-SVE-NEXT: // kill: def $d2 killed $d2 def $z2 |
| 301 | +; CHECK-SVE-NEXT: // kill: def $d1 killed $d1 def $z1 |
| 302 | +; CHECK-SVE-NEXT: fnmsb z0.d, p0/m, z1.d, z2.d |
| 303 | +; CHECK-SVE-NEXT: // kill: def $d0 killed $d0 killed $z0 |
| 304 | +; CHECK-SVE-NEXT: ret |
| 305 | +; |
| 306 | +; CHECK-SME-LABEL: fmsub_illegal_v1f64: |
| 307 | +; CHECK-SME: // %bb.0: // %entry |
| 308 | +; CHECK-SME-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill |
| 309 | +; CHECK-SME-NEXT: addvl sp, sp, #-1 |
| 310 | +; CHECK-SME-NEXT: .cfi_escape 0x0f, 0x08, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 // sp + 16 + 8 * VG |
| 311 | +; CHECK-SME-NEXT: .cfi_offset w29, -16 |
| 312 | +; CHECK-SME-NEXT: ptrue p0.d, vl1 |
| 313 | +; CHECK-SME-NEXT: // kill: def $d0 killed $d0 def $z0 |
| 314 | +; CHECK-SME-NEXT: // kill: def $d2 killed $d2 def $z2 |
| 315 | +; CHECK-SME-NEXT: // kill: def $d1 killed $d1 def $z1 |
| 316 | +; CHECK-SME-NEXT: fnmsb z0.d, p0/m, z1.d, z2.d |
| 317 | +; CHECK-SME-NEXT: str z0, [sp] |
| 318 | +; CHECK-SME-NEXT: ldr d0, [sp] |
| 319 | +; CHECK-SME-NEXT: addvl sp, sp, #1 |
| 320 | +; CHECK-SME-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload |
| 321 | +; CHECK-SME-NEXT: ret |
| 322 | +entry: |
| 323 | + %neg = fneg <1 x double> %c |
| 324 | + %0 = tail call <1 x double> @llvm.fmuladd(<1 x double> %a, <1 x double> %b, <1 x double> %neg) |
| 325 | + ret <1 x double> %0 |
| 326 | +} |
| 327 | + |
| 328 | +define <3 x float> @fmsub_flipped_illegal_v3f32(<3 x float> %c, <3 x float> %a, <3 x float> %b) { |
| 329 | +; CHECK-LABEL: fmsub_flipped_illegal_v3f32: |
| 330 | +; CHECK: // %bb.0: // %entry |
| 331 | +; CHECK-NEXT: ptrue p0.s, vl4 |
| 332 | +; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 |
| 333 | +; CHECK-NEXT: // kill: def $q2 killed $q2 def $z2 |
| 334 | +; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 |
| 335 | +; CHECK-NEXT: fnmls z0.s, p0/m, z1.s, z2.s |
| 336 | +; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 |
| 337 | +; CHECK-NEXT: ret |
| 338 | +entry: |
| 339 | + %neg = fneg <3 x float> %c |
| 340 | + %0 = tail call <3 x float> @llvm.fmuladd(<3 x float> %a, <3 x float> %b, <3 x float> %neg) |
| 341 | + ret <3 x float> %0 |
| 342 | +} |
| 343 | + |
| 344 | +define <vscale x 7 x half> @fnmsub_illegal_nxv7f16(<vscale x 7 x half> %a, <vscale x 7 x half> %b, <vscale x 7 x half> %c) { |
| 345 | +; CHECK-LABEL: fnmsub_illegal_nxv7f16: |
| 346 | +; CHECK: // %bb.0: // %entry |
| 347 | +; CHECK-NEXT: ptrue p0.h |
| 348 | +; CHECK-NEXT: fnmad z0.h, p0/m, z1.h, z2.h |
| 349 | +; CHECK-NEXT: ret |
| 350 | +entry: |
| 351 | + %neg = fneg <vscale x 7 x half> %a |
| 352 | + %neg1 = fneg <vscale x 7 x half> %c |
| 353 | + %0 = tail call <vscale x 7 x half> @llvm.fmuladd(<vscale x 7 x half> %neg, <vscale x 7 x half> %b, <vscale x 7 x half> %neg1) |
| 354 | + ret <vscale x 7 x half> %0 |
| 355 | +} |
| 356 | + |
| 357 | +define <3 x float> @fnmsub_illegal_v3f32(<3 x float> %a, <3 x float> %b, <3 x float> %c) { |
| 358 | +; CHECK-LABEL: fnmsub_illegal_v3f32: |
| 359 | +; CHECK: // %bb.0: // %entry |
| 360 | +; CHECK-NEXT: ptrue p0.s, vl4 |
| 361 | +; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 |
| 362 | +; CHECK-NEXT: // kill: def $q2 killed $q2 def $z2 |
| 363 | +; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 |
| 364 | +; CHECK-NEXT: fnmad z0.s, p0/m, z1.s, z2.s |
| 365 | +; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 |
| 366 | +; CHECK-NEXT: ret |
| 367 | +entry: |
| 368 | + %neg = fneg <3 x float> %a |
| 369 | + %neg1 = fneg <3 x float> %c |
| 370 | + %0 = tail call <3 x float> @llvm.fmuladd(<3 x float> %neg, <3 x float> %b, <3 x float> %neg1) |
| 371 | + ret <3 x float> %0 |
| 372 | +} |
| 373 | + |
| 374 | +define <7 x half> @fnmsub_flipped_illegal_v7f16(<7 x half> %c, <7 x half> %a, <7 x half> %b) { |
| 375 | +; CHECK-LABEL: fnmsub_flipped_illegal_v7f16: |
| 376 | +; CHECK: // %bb.0: // %entry |
| 377 | +; CHECK-NEXT: ptrue p0.h, vl8 |
| 378 | +; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 |
| 379 | +; CHECK-NEXT: // kill: def $q2 killed $q2 def $z2 |
| 380 | +; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 |
| 381 | +; CHECK-NEXT: fnmla z0.h, p0/m, z1.h, z2.h |
| 382 | +; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 |
| 383 | +; CHECK-NEXT: ret |
| 384 | +entry: |
| 385 | + %neg = fneg <7 x half> %a |
| 386 | + %neg1 = fneg <7 x half> %c |
| 387 | + %0 = tail call <7 x half> @llvm.fmuladd(<7 x half> %neg, <7 x half> %b, <7 x half> %neg1) |
| 388 | + ret <7 x half> %0 |
| 389 | +} |
0 commit comments