Jessica Paquette 3495b884de [AArch64][GlobalISel] Add G_EXT and select ext using it
Add selection support for ext via a new opcode, G_EXT and a post-legalizer
combine which matches it.

Add an `applyEXT` function, because the AArch64ext patterns require a register
for the immediate. So, we have to create a G_CONSTANT to get these without
writing new patterns or modifying the existing ones.

Tests are the same as arm64-ext.ll.

Also prevent ext from firing on the zip test. It has higher priority, so we
don't want it potentially getting in the way of mask tests.

Also fix up the shuffle-splat test, because ext is now selected there. The
test was incorrectly regbank selected before, which could cause a verifier
failure when you emit copies.

Differential Revision: https://reviews.llvm.org/D81436
2020-06-15 12:20:59 -07:00

154 lines
3.8 KiB
YAML

# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
# RUN: llc -mtriple=aarch64 -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s
#
# Test G_EXT selection using AArch64ext patterns.
...
---
name: v8s8_EXTv8i8
alignment: 4
legalized: true
regBankSelected: true
tracksRegLiveness: true
body: |
bb.0:
liveins: $d0, $d1
; CHECK-LABEL: name: v8s8_EXTv8i8
; CHECK: liveins: $d0, $d1
; CHECK: %v1:fpr64 = COPY $d0
; CHECK: %v2:fpr64 = COPY $d1
; CHECK: %shuf:fpr64 = EXTv8i8 %v1, %v2, 3
%v1:fpr(<8 x s8>) = COPY $d0
%v2:fpr(<8 x s8>) = COPY $d1
%3:gpr(s32) = G_CONSTANT i32 3
%shuf:fpr(<8 x s8>) = G_EXT %v1, %v2, %3(s32)
...
---
name: v16s8_EXTv16i8
alignment: 4
legalized: true
regBankSelected: true
tracksRegLiveness: true
body: |
bb.0:
liveins: $q0, $q1
; CHECK-LABEL: name: v16s8_EXTv16i8
; CHECK: liveins: $q0, $q1
; CHECK: %v1:fpr128 = COPY $q0
; CHECK: %v2:fpr128 = COPY $q1
; CHECK: %shuf:fpr128 = EXTv16i8 %v1, %v2, 3
%v1:fpr(<16 x s8>) = COPY $q0
%v2:fpr(<16 x s8>) = COPY $q1
%3:gpr(s32) = G_CONSTANT i32 3
%shuf:fpr(<16 x s8>) = G_EXT %v1, %v2, %3(s32)
...
---
name: v4s16_EXTv8i8
alignment: 4
legalized: true
regBankSelected: true
tracksRegLiveness: true
body: |
bb.0:
liveins: $d0, $d1
; CHECK-LABEL: name: v4s16_EXTv8i8
; CHECK: liveins: $d0, $d1
; CHECK: %v1:fpr64 = COPY $d0
; CHECK: %v2:fpr64 = COPY $d1
; CHECK: %shuf:fpr64 = EXTv8i8 %v1, %v2, 6
%v1:fpr(<4 x s16>) = COPY $d0
%v2:fpr(<4 x s16>) = COPY $d1
%3:gpr(s32) = G_CONSTANT i32 6
%shuf:fpr(<4 x s16>) = G_EXT %v1, %v2, %3(s32)
...
---
name: v8s16_EXTv16i8
alignment: 4
legalized: true
regBankSelected: true
tracksRegLiveness: true
body: |
bb.0:
liveins: $q0, $q1
; CHECK-LABEL: name: v8s16_EXTv16i8
; CHECK: liveins: $q0, $q1
; CHECK: %v1:fpr128 = COPY $q0
; CHECK: %v2:fpr128 = COPY $q1
; CHECK: %shuf:fpr128 = EXTv16i8 %v2, %v1, 10
%v1:fpr(<8 x s16>) = COPY $q0
%v2:fpr(<8 x s16>) = COPY $q1
%3:gpr(s32) = G_CONSTANT i32 10
%shuf:fpr(<8 x s16>) = G_EXT %v2, %v1, %3(s32)
...
...
---
name: v4s32_EXTv16i8
alignment: 4
legalized: true
regBankSelected: true
tracksRegLiveness: true
body: |
bb.0:
liveins: $q0, $q1
; CHECK-LABEL: name: v4s32_EXTv16i8
; CHECK: liveins: $q0, $q1
; CHECK: %v1:fpr128 = COPY $q0
; CHECK: %v2:fpr128 = COPY $q1
; CHECK: %shuf:fpr128 = EXTv16i8 %v1, %v2, 12
%v1:fpr(<4 x s32>) = COPY $q0
%v2:fpr(<4 x s32>) = COPY $q1
%3:gpr(s32) = G_CONSTANT i32 12
%shuf:fpr(<4 x s32>) = G_EXT %v1, %v2, %3(s32)
...
---
name: v2s32_EXTv8i8
alignment: 4
legalized: true
regBankSelected: true
tracksRegLiveness: true
body: |
bb.0:
liveins: $d0, $d1
; CHECK-LABEL: name: v2s32_EXTv8i8
; CHECK: liveins: $d0, $d1
; CHECK: %v1:fpr64 = COPY $d0
; CHECK: %v2:fpr64 = COPY $d1
; CHECK: %shuf:fpr64 = EXTv8i8 %v1, %v2, 2
%v1:fpr(<2 x s32>) = COPY $d0
%v2:fpr(<2 x s32>) = COPY $d1
%3:gpr(s32) = G_CONSTANT i32 2
%shuf:fpr(<2 x s32>) = G_EXT %v1, %v2, %3(s32)
...
---
name: v2s64_EXTv16i8
alignment: 4
legalized: true
regBankSelected: true
tracksRegLiveness: true
body: |
bb.0:
liveins: $q0, $q1
; CHECK-LABEL: name: v2s64_EXTv16i8
; CHECK: liveins: $q0, $q1
; CHECK: %v1:fpr128 = COPY $q0
; CHECK: %v2:fpr128 = COPY $q1
; CHECK: %shuf:fpr128 = EXTv16i8 %v1, %v2, 2
%v1:fpr(<2 x s64>) = COPY $q0
%v2:fpr(<2 x s64>) = COPY $q1
%3:gpr(s32) = G_CONSTANT i32 2
%shuf:fpr(<2 x s64>) = G_EXT %v1, %v2, %3(s32)
...