Skip to content

Commit 4fba5d3

Browse files
[LLVM][SVE] Add isel for bfloat based (de)interleave operations.
1 parent 01371d6 commit 4fba5d3

File tree

4 files changed

+72
-0
lines changed

4 files changed

+72
-0
lines changed

llvm/lib/Target/AArch64/AArch64ISelLowering.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1702,6 +1702,8 @@ AArch64TargetLowering::AArch64TargetLowering(const TargetMachine &TM,
17021702
setOperationAction(ISD::MLOAD, VT, Custom);
17031703
setOperationAction(ISD::INSERT_SUBVECTOR, VT, Custom);
17041704
setOperationAction(ISD::SPLAT_VECTOR, VT, Legal);
1705+
setOperationAction(ISD::VECTOR_DEINTERLEAVE, VT, Custom);
1706+
setOperationAction(ISD::VECTOR_INTERLEAVE, VT, Custom);
17051707
setOperationAction(ISD::VECTOR_SPLICE, VT, Custom);
17061708

17071709
if (Subtarget->hasSVEB16B16()) {

llvm/lib/Target/AArch64/SVEInstrFormats.td

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3079,6 +3079,8 @@ multiclass sve_int_perm_bin_perm_zz<bits<3> opc, string asm,
30793079
def : SVE_2_Op_Pat<nxv2f64, op, nxv2f64, nxv2f64, !cast<Instruction>(NAME # _D)>;
30803080

30813081
def : SVE_2_Op_Pat<nxv8bf16, op, nxv8bf16, nxv8bf16, !cast<Instruction>(NAME # _H)>;
3082+
def : SVE_2_Op_Pat<nxv4bf16, op, nxv4bf16, nxv4bf16, !cast<Instruction>(NAME # _S)>;
3083+
def : SVE_2_Op_Pat<nxv2bf16, op, nxv2bf16, nxv2bf16, !cast<Instruction>(NAME # _D)>;
30823084
}
30833085

30843086
//===----------------------------------------------------------------------===//

llvm/test/CodeGen/AArch64/sve-vector-deinterleave.ll

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,41 @@ define {<vscale x 2 x double>, <vscale x 2 x double>} @vector_deinterleave_nxv2f
7070
ret {<vscale x 2 x double>, <vscale x 2 x double>} %retval
7171
}
7272

73+
define {<vscale x 2 x bfloat>, <vscale x 2 x bfloat>} @vector_deinterleave_nxv2bf16_nxv4bf16(<vscale x 4 x bfloat> %vec) {
74+
; CHECK-LABEL: vector_deinterleave_nxv2bf16_nxv4bf16:
75+
; CHECK: // %bb.0:
76+
; CHECK-NEXT: uzp1 z1.s, z0.s, z0.s
77+
; CHECK-NEXT: uzp2 z2.s, z0.s, z0.s
78+
; CHECK-NEXT: uunpklo z0.d, z1.s
79+
; CHECK-NEXT: uunpklo z1.d, z2.s
80+
; CHECK-NEXT: ret
81+
%retval = call {<vscale x 2 x bfloat>, <vscale x 2 x bfloat>} @llvm.vector.deinterleave2.nxv4bf16(<vscale x 4 x bfloat> %vec)
82+
ret {<vscale x 2 x bfloat>, <vscale x 2 x bfloat>} %retval
83+
}
84+
85+
define {<vscale x 4 x bfloat>, <vscale x 4 x bfloat>} @vector_deinterleave_nxv4bf16_nxv8bf16(<vscale x 8 x bfloat> %vec) {
86+
; CHECK-LABEL: vector_deinterleave_nxv4bf16_nxv8bf16:
87+
; CHECK: // %bb.0:
88+
; CHECK-NEXT: uzp1 z1.h, z0.h, z0.h
89+
; CHECK-NEXT: uzp2 z2.h, z0.h, z0.h
90+
; CHECK-NEXT: uunpklo z0.s, z1.h
91+
; CHECK-NEXT: uunpklo z1.s, z2.h
92+
; CHECK-NEXT: ret
93+
%retval = call {<vscale x 4 x bfloat>, <vscale x 4 x bfloat>} @llvm.vector.deinterleave2.nxv8bf16(<vscale x 8 x bfloat> %vec)
94+
ret {<vscale x 4 x bfloat>, <vscale x 4 x bfloat>} %retval
95+
}
96+
97+
define {<vscale x 8 x bfloat>, <vscale x 8 x bfloat>} @vector_deinterleave_nxv8bf16_nxv16bf16(<vscale x 16 x bfloat> %vec) {
98+
; CHECK-LABEL: vector_deinterleave_nxv8bf16_nxv16bf16:
99+
; CHECK: // %bb.0:
100+
; CHECK-NEXT: uzp1 z2.h, z0.h, z1.h
101+
; CHECK-NEXT: uzp2 z1.h, z0.h, z1.h
102+
; CHECK-NEXT: mov z0.d, z2.d
103+
; CHECK-NEXT: ret
104+
%retval = call {<vscale x 8 x bfloat>, <vscale x 8 x bfloat>} @llvm.vector.deinterleave2.nxv16bf16(<vscale x 16 x bfloat> %vec)
105+
ret {<vscale x 8 x bfloat>, <vscale x 8 x bfloat>} %retval
106+
}
107+
73108
; Integers
74109

75110
define {<vscale x 16 x i8>, <vscale x 16 x i8>} @vector_deinterleave_nxv16i8_nxv32i8(<vscale x 32 x i8> %vec) {

llvm/test/CodeGen/AArch64/sve-vector-interleave.ll

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,39 @@ define <vscale x 4 x double> @interleave2_nxv4f64(<vscale x 2 x double> %vec0, <
6767
ret <vscale x 4 x double> %retval
6868
}
6969

70+
define <vscale x 4 x bfloat> @interleave2_nxv4bf16(<vscale x 2 x bfloat> %vec0, <vscale x 2 x bfloat> %vec1) {
71+
; CHECK-LABEL: interleave2_nxv4bf16:
72+
; CHECK: // %bb.0:
73+
; CHECK-NEXT: zip2 z2.d, z0.d, z1.d
74+
; CHECK-NEXT: zip1 z0.d, z0.d, z1.d
75+
; CHECK-NEXT: uzp1 z0.s, z0.s, z2.s
76+
; CHECK-NEXT: ret
77+
%retval = call <vscale x 4 x bfloat> @llvm.vector.interleave2.nxv4bf16(<vscale x 2 x bfloat> %vec0, <vscale x 2 x bfloat> %vec1)
78+
ret <vscale x 4 x bfloat> %retval
79+
}
80+
81+
define <vscale x 8 x bfloat> @interleave2_nxv8bf16(<vscale x 4 x bfloat> %vec0, <vscale x 4 x bfloat> %vec1) {
82+
; CHECK-LABEL: interleave2_nxv8bf16:
83+
; CHECK: // %bb.0:
84+
; CHECK-NEXT: zip2 z2.s, z0.s, z1.s
85+
; CHECK-NEXT: zip1 z0.s, z0.s, z1.s
86+
; CHECK-NEXT: uzp1 z0.h, z0.h, z2.h
87+
; CHECK-NEXT: ret
88+
%retval = call <vscale x 8 x bfloat> @llvm.vector.interleave2.nxv8bf16(<vscale x 4 x bfloat> %vec0, <vscale x 4 x bfloat> %vec1)
89+
ret <vscale x 8 x bfloat> %retval
90+
}
91+
92+
define <vscale x 16 x bfloat> @interleave2_nxv16bf16(<vscale x 8 x bfloat> %vec0, <vscale x 8 x bfloat> %vec1) {
93+
; CHECK-LABEL: interleave2_nxv16bf16:
94+
; CHECK: // %bb.0:
95+
; CHECK-NEXT: zip1 z2.h, z0.h, z1.h
96+
; CHECK-NEXT: zip2 z1.h, z0.h, z1.h
97+
; CHECK-NEXT: mov z0.d, z2.d
98+
; CHECK-NEXT: ret
99+
%retval = call <vscale x 16 x bfloat> @llvm.vector.interleave2.nxv16bf16(<vscale x 8 x bfloat> %vec0, <vscale x 8 x bfloat> %vec1)
100+
ret <vscale x 16 x bfloat> %retval
101+
}
102+
70103
; Integers
71104

72105
define <vscale x 32 x i8> @interleave2_nxv32i8(<vscale x 16 x i8> %vec0, <vscale x 16 x i8> %vec1) {

0 commit comments

Comments
 (0)