It will get expanded into MOVPRFX_ZZ and EXT_ZZI by the AArch64ExpandPseudo pass. This instruction takes a single Z register as input, as opposed to the existing destructive EXT_ZZI instruction. Note this patch only defines the pseudo, it isn't used in any ISel pattern yet. It will later be used for vector.extract.
62 lines
2.1 KiB
YAML
62 lines
2.1 KiB
YAML
# 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
|
|
...
|