# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 5
# RUN: llc -mtriple=aarch64 -mattr=+sve -run-pass=aarch64-expand-pseudo -verify-machineinstrs %s -o - | FileCheck %s

# Test the expansion of constructive binary operations into their
# destructive counterparts.


# EXT_ZZI_CONSTRUCTIVE

---
name:            test_ext_zzi_unique
body:             |
  bb.0:
    ; CHECK-LABEL: name: test_ext_zzi_unique
    ; CHECK: BUNDLE implicit-def $z2, implicit killed $z0 {
    ; CHECK-NEXT:   $z2 = MOVPRFX_ZZ $z0
    ; CHECK-NEXT:   $z2 = EXT_ZZI internal killed $z2, killed $z0, 1
    ; CHECK-NEXT: }
    ; CHECK-NEXT: RET undef $lr, implicit killed $z2
    $z2 = EXT_ZZI_CONSTRUCTIVE killed $z0, 1
    RET_ReallyLR implicit killed $z2
...

---
name:            test_ext_zzi_already_destructive
body:             |
  bb.0:
    ; CHECK-LABEL: name: test_ext_zzi_already_destructive
    ; CHECK: $z2 = EXT_ZZI killed $z2, killed $z2, 1
    ; CHECK-NEXT: RET undef $lr, implicit killed $z2
    $z2 = EXT_ZZI_CONSTRUCTIVE killed $z2, 1
    RET_ReallyLR implicit killed $z2
...

---
name:            test_ext_zzi_unique_implicit_ops
body:             |
  bb.0:
    ; CHECK-LABEL: name: test_ext_zzi_unique_implicit_ops
    ; CHECK: BUNDLE implicit-def $z2, implicit-def $q2, implicit killed $z0, implicit killed $q0 {
    ; CHECK-NEXT:   $z2 = MOVPRFX_ZZ $z0, implicit killed $q0
    ; CHECK-NEXT:   $z2 = EXT_ZZI internal killed $z2, killed $z0, 1, implicit-def $q2
    ; CHECK-NEXT: }
    ; CHECK-NEXT: RET undef $lr, implicit killed $q2
    $z2 = EXT_ZZI_CONSTRUCTIVE killed $z0, 1, implicit-def $q2, implicit killed $q0
    RET_ReallyLR implicit killed $q2
...

---
name:            test_ext_zzi_undef
body:             |
  bb.0:
    ; CHECK-LABEL: name: test_ext_zzi_undef
    ; CHECK: BUNDLE implicit-def $z2, implicit undef $z0 {
    ; CHECK-NEXT:   $z2 = MOVPRFX_ZZ undef $z0
    ; CHECK-NEXT:   $z2 = EXT_ZZI internal killed $z2, undef $z0, 1
    ; CHECK-NEXT: }
    ; CHECK-NEXT: RET undef $lr, implicit killed $z2
    $z2 = EXT_ZZI_CONSTRUCTIVE undef $z0, 1
    RET_ReallyLR implicit killed $z2
...
