blob: 5438cf94661bd218b436693da36eab6d326f4f2b [file] [edit]
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve2p2 < %s | FileCheck %s --check-prefixes=CHECK,CHECK-SVE2p2
; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve,+sme2p2 < %s | FileCheck %s --check-prefixes=CHECK,CHECK-SVE2p2
; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sme2p2 -force-streaming < %s | FileCheck %s --check-prefixes=CHECK,CHECK-SME2p2-STREAMING
; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sme2p2,+sve2p2 -force-streaming-compatible < %s | FileCheck %s --check-prefixes=CHECK,CHECK-STREAMING-COMPAT
define <vscale x 16 x i8> @compress_nv16i8(<vscale x 16 x i8> %vec, <vscale x 16 x i1> %mask) {
; CHECK-LABEL: compress_nv16i8:
; CHECK: // %bb.0:
; CHECK-NEXT: compact z0.b, p0, z0.b
; CHECK-NEXT: ret
%out = call <vscale x 16 x i8> @llvm.experimental.vector.compress(
<vscale x 16 x i8> %vec, <vscale x 16 x i1> %mask, <vscale x 16 x i8> poison)
ret <vscale x 16 x i8> %out
}
define <vscale x 8 x i16> @compress_nxv8i16(<vscale x 8 x i16> %vec, <vscale x 8 x i1> %mask) {
; CHECK-LABEL: compress_nxv8i16:
; CHECK: // %bb.0:
; CHECK-NEXT: compact z0.h, p0, z0.h
; CHECK-NEXT: ret
%out = call <vscale x 8 x i16> @llvm.experimental.vector.compress(
<vscale x 8 x i16> %vec, <vscale x 8 x i1> %mask, <vscale x 8 x i16> poison)
ret <vscale x 8 x i16> %out
}
define <vscale x 8 x half> @compress_nxv8f16(<vscale x 8 x half> %vec, <vscale x 8 x i1> %mask) {
; CHECK-LABEL: compress_nxv8f16:
; CHECK: // %bb.0:
; CHECK-NEXT: compact z0.h, p0, z0.h
; CHECK-NEXT: ret
%out = call <vscale x 8 x half> @llvm.experimental.vector.compress(
<vscale x 8 x half> %vec, <vscale x 8 x i1> %mask, <vscale x 8 x half> poison)
ret <vscale x 8 x half> %out
}
define <vscale x 8 x bfloat> @compress_nxv8bf16(<vscale x 8 x bfloat> %vec, <vscale x 8 x i1> %mask) {
; CHECK-LABEL: compress_nxv8bf16:
; CHECK: // %bb.0:
; CHECK-NEXT: compact z0.h, p0, z0.h
; CHECK-NEXT: ret
%out = call <vscale x 8 x bfloat> @llvm.experimental.vector.compress(
<vscale x 8 x bfloat> %vec, <vscale x 8 x i1> %mask, <vscale x 8 x bfloat> poison)
ret <vscale x 8 x bfloat> %out
}
define <16 x i8> @compress_v16i8(<16 x i8> %vec, <16 x i1> %mask) {
; CHECK-SVE2p2-LABEL: compress_v16i8:
; CHECK-SVE2p2: // %bb.0:
; CHECK-SVE2p2-NEXT: shl v1.16b, v1.16b, #7
; CHECK-SVE2p2-NEXT: ptrue p0.b, vl16
; CHECK-SVE2p2-NEXT: // kill: def $q0 killed $q0 def $z0
; CHECK-SVE2p2-NEXT: cmpne p1.b, p0/z, z1.b, #0
; CHECK-SVE2p2-NEXT: compact z0.b, p1, z0.b
; CHECK-SVE2p2-NEXT: // kill: def $q0 killed $q0 killed $z0
; CHECK-SVE2p2-NEXT: ret
;
; CHECK-SME2p2-STREAMING-LABEL: compress_v16i8:
; CHECK-SME2p2-STREAMING: // %bb.0:
; CHECK-SME2p2-STREAMING-NEXT: lsl z1.b, z1.b, #7
; CHECK-SME2p2-STREAMING-NEXT: ptrue p0.b, vl16
; CHECK-SME2p2-STREAMING-NEXT: asr z1.b, z1.b, #7
; CHECK-SME2p2-STREAMING-NEXT: cmpne p1.b, p0/z, z1.b, #0
; CHECK-SME2p2-STREAMING-NEXT: compact z0.b, p1, z0.b
; CHECK-SME2p2-STREAMING-NEXT: ret
;
; CHECK-STREAMING-COMPAT-LABEL: compress_v16i8:
; CHECK-STREAMING-COMPAT: // %bb.0:
; CHECK-STREAMING-COMPAT-NEXT: // kill: def $q1 killed $q1 def $z1
; CHECK-STREAMING-COMPAT-NEXT: ptrue p0.b, vl16
; CHECK-STREAMING-COMPAT-NEXT: // kill: def $q0 killed $q0 def $z0
; CHECK-STREAMING-COMPAT-NEXT: lsl z1.b, z1.b, #7
; CHECK-STREAMING-COMPAT-NEXT: asr z1.b, z1.b, #7
; CHECK-STREAMING-COMPAT-NEXT: cmpne p1.b, p0/z, z1.b, #0
; CHECK-STREAMING-COMPAT-NEXT: compact z0.b, p1, z0.b
; CHECK-STREAMING-COMPAT-NEXT: // kill: def $q0 killed $q0 killed $z0
; CHECK-STREAMING-COMPAT-NEXT: ret
%out = call <16 x i8> @llvm.experimental.vector.compress(
<16 x i8> %vec, <16 x i1> %mask, <16 x i8> poison)
ret <16 x i8> %out
}
define <8 x i16> @compress_v8i16(<8 x i16> %vec, <8 x i1> %mask) {
; CHECK-SVE2p2-LABEL: compress_v8i16:
; CHECK-SVE2p2: // %bb.0:
; CHECK-SVE2p2-NEXT: ushll v1.8h, v1.8b, #0
; CHECK-SVE2p2-NEXT: ptrue p0.h, vl8
; CHECK-SVE2p2-NEXT: // kill: def $q0 killed $q0 def $z0
; CHECK-SVE2p2-NEXT: shl v1.8h, v1.8h, #15
; CHECK-SVE2p2-NEXT: cmpne p1.h, p0/z, z1.h, #0
; CHECK-SVE2p2-NEXT: compact z0.h, p1, z0.h
; CHECK-SVE2p2-NEXT: // kill: def $q0 killed $q0 killed $z0
; CHECK-SVE2p2-NEXT: ret
;
; CHECK-SME2p2-STREAMING-LABEL: compress_v8i16:
; CHECK-SME2p2-STREAMING: // %bb.0:
; CHECK-SME2p2-STREAMING-NEXT: uunpklo z1.h, z1.b
; CHECK-SME2p2-STREAMING-NEXT: ptrue p0.h, vl8
; CHECK-SME2p2-STREAMING-NEXT: lsl z1.h, z1.h, #15
; CHECK-SME2p2-STREAMING-NEXT: asr z1.h, z1.h, #15
; CHECK-SME2p2-STREAMING-NEXT: cmpne p1.h, p0/z, z1.h, #0
; CHECK-SME2p2-STREAMING-NEXT: compact z0.h, p1, z0.h
; CHECK-SME2p2-STREAMING-NEXT: ret
;
; CHECK-STREAMING-COMPAT-LABEL: compress_v8i16:
; CHECK-STREAMING-COMPAT: // %bb.0:
; CHECK-STREAMING-COMPAT-NEXT: // kill: def $d1 killed $d1 def $z1
; CHECK-STREAMING-COMPAT-NEXT: ptrue p0.h, vl8
; CHECK-STREAMING-COMPAT-NEXT: // kill: def $q0 killed $q0 def $z0
; CHECK-STREAMING-COMPAT-NEXT: uunpklo z1.h, z1.b
; CHECK-STREAMING-COMPAT-NEXT: lsl z1.h, z1.h, #15
; CHECK-STREAMING-COMPAT-NEXT: asr z1.h, z1.h, #15
; CHECK-STREAMING-COMPAT-NEXT: cmpne p1.h, p0/z, z1.h, #0
; CHECK-STREAMING-COMPAT-NEXT: compact z0.h, p1, z0.h
; CHECK-STREAMING-COMPAT-NEXT: // kill: def $q0 killed $q0 killed $z0
; CHECK-STREAMING-COMPAT-NEXT: ret
%out = call <8 x i16> @llvm.experimental.vector.compress(
<8 x i16> %vec, <8 x i1> %mask, <8 x i16> poison)
ret <8 x i16> %out
}
define <8 x half> @compress_v8f16(<8 x half> %vec, <8 x i1> %mask) {
; CHECK-SVE2p2-LABEL: compress_v8f16:
; CHECK-SVE2p2: // %bb.0:
; CHECK-SVE2p2-NEXT: ushll v1.8h, v1.8b, #0
; CHECK-SVE2p2-NEXT: ptrue p0.h, vl8
; CHECK-SVE2p2-NEXT: // kill: def $q0 killed $q0 def $z0
; CHECK-SVE2p2-NEXT: shl v1.8h, v1.8h, #15
; CHECK-SVE2p2-NEXT: cmpne p1.h, p0/z, z1.h, #0
; CHECK-SVE2p2-NEXT: compact z0.h, p1, z0.h
; CHECK-SVE2p2-NEXT: // kill: def $q0 killed $q0 killed $z0
; CHECK-SVE2p2-NEXT: ret
;
; CHECK-SME2p2-STREAMING-LABEL: compress_v8f16:
; CHECK-SME2p2-STREAMING: // %bb.0:
; CHECK-SME2p2-STREAMING-NEXT: uunpklo z1.h, z1.b
; CHECK-SME2p2-STREAMING-NEXT: ptrue p0.h, vl8
; CHECK-SME2p2-STREAMING-NEXT: lsl z1.h, z1.h, #15
; CHECK-SME2p2-STREAMING-NEXT: asr z1.h, z1.h, #15
; CHECK-SME2p2-STREAMING-NEXT: cmpne p1.h, p0/z, z1.h, #0
; CHECK-SME2p2-STREAMING-NEXT: compact z0.h, p1, z0.h
; CHECK-SME2p2-STREAMING-NEXT: ret
;
; CHECK-STREAMING-COMPAT-LABEL: compress_v8f16:
; CHECK-STREAMING-COMPAT: // %bb.0:
; CHECK-STREAMING-COMPAT-NEXT: // kill: def $d1 killed $d1 def $z1
; CHECK-STREAMING-COMPAT-NEXT: ptrue p0.h, vl8
; CHECK-STREAMING-COMPAT-NEXT: // kill: def $q0 killed $q0 def $z0
; CHECK-STREAMING-COMPAT-NEXT: uunpklo z1.h, z1.b
; CHECK-STREAMING-COMPAT-NEXT: lsl z1.h, z1.h, #15
; CHECK-STREAMING-COMPAT-NEXT: asr z1.h, z1.h, #15
; CHECK-STREAMING-COMPAT-NEXT: cmpne p1.h, p0/z, z1.h, #0
; CHECK-STREAMING-COMPAT-NEXT: compact z0.h, p1, z0.h
; CHECK-STREAMING-COMPAT-NEXT: // kill: def $q0 killed $q0 killed $z0
; CHECK-STREAMING-COMPAT-NEXT: ret
%out = call <8 x half> @llvm.experimental.vector.compress(
<8 x half> %vec, <8 x i1> %mask, <8 x half> poison)
ret <8 x half> %out
}
define <8 x bfloat> @compress_v8bf16(<8 x bfloat> %vec, <8 x i1> %mask) {
; CHECK-SVE2p2-LABEL: compress_v8bf16:
; CHECK-SVE2p2: // %bb.0:
; CHECK-SVE2p2-NEXT: ushll v1.8h, v1.8b, #0
; CHECK-SVE2p2-NEXT: ptrue p0.h, vl8
; CHECK-SVE2p2-NEXT: // kill: def $q0 killed $q0 def $z0
; CHECK-SVE2p2-NEXT: shl v1.8h, v1.8h, #15
; CHECK-SVE2p2-NEXT: cmpne p1.h, p0/z, z1.h, #0
; CHECK-SVE2p2-NEXT: compact z0.h, p1, z0.h
; CHECK-SVE2p2-NEXT: // kill: def $q0 killed $q0 killed $z0
; CHECK-SVE2p2-NEXT: ret
;
; CHECK-SME2p2-STREAMING-LABEL: compress_v8bf16:
; CHECK-SME2p2-STREAMING: // %bb.0:
; CHECK-SME2p2-STREAMING-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill
; CHECK-SME2p2-STREAMING-NEXT: addvl sp, sp, #-1
; CHECK-SME2p2-STREAMING-NEXT: .cfi_escape 0x0f, 0x08, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 // sp + 16 + 8 * VG
; CHECK-SME2p2-STREAMING-NEXT: .cfi_offset w29, -16
; CHECK-SME2p2-STREAMING-NEXT: uunpklo z1.h, z1.b
; CHECK-SME2p2-STREAMING-NEXT: ptrue p0.h, vl8
; CHECK-SME2p2-STREAMING-NEXT: lsl z1.h, z1.h, #15
; CHECK-SME2p2-STREAMING-NEXT: asr z1.h, z1.h, #15
; CHECK-SME2p2-STREAMING-NEXT: cmpne p1.h, p0/z, z1.h, #0
; CHECK-SME2p2-STREAMING-NEXT: compact z0.h, p1, z0.h
; CHECK-SME2p2-STREAMING-NEXT: str z0, [sp]
; CHECK-SME2p2-STREAMING-NEXT: ldr q0, [sp]
; CHECK-SME2p2-STREAMING-NEXT: addvl sp, sp, #1
; CHECK-SME2p2-STREAMING-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload
; CHECK-SME2p2-STREAMING-NEXT: ret
;
; CHECK-STREAMING-COMPAT-LABEL: compress_v8bf16:
; CHECK-STREAMING-COMPAT: // %bb.0:
; CHECK-STREAMING-COMPAT-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill
; CHECK-STREAMING-COMPAT-NEXT: addvl sp, sp, #-1
; CHECK-STREAMING-COMPAT-NEXT: .cfi_escape 0x0f, 0x08, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 // sp + 16 + 8 * VG
; CHECK-STREAMING-COMPAT-NEXT: .cfi_offset w29, -16
; CHECK-STREAMING-COMPAT-NEXT: // kill: def $d1 killed $d1 def $z1
; CHECK-STREAMING-COMPAT-NEXT: ptrue p0.h, vl8
; CHECK-STREAMING-COMPAT-NEXT: // kill: def $q0 killed $q0 def $z0
; CHECK-STREAMING-COMPAT-NEXT: uunpklo z1.h, z1.b
; CHECK-STREAMING-COMPAT-NEXT: lsl z1.h, z1.h, #15
; CHECK-STREAMING-COMPAT-NEXT: asr z1.h, z1.h, #15
; CHECK-STREAMING-COMPAT-NEXT: cmpne p1.h, p0/z, z1.h, #0
; CHECK-STREAMING-COMPAT-NEXT: compact z0.h, p1, z0.h
; CHECK-STREAMING-COMPAT-NEXT: str z0, [sp]
; CHECK-STREAMING-COMPAT-NEXT: ldr q0, [sp]
; CHECK-STREAMING-COMPAT-NEXT: addvl sp, sp, #1
; CHECK-STREAMING-COMPAT-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload
; CHECK-STREAMING-COMPAT-NEXT: ret
%out = call <8 x bfloat> @llvm.experimental.vector.compress(
<8 x bfloat> %vec, <8 x i1> %mask, <8 x bfloat> poison)
ret <8 x bfloat> %out
}