blob: aad1f51b2107f3c866642d6286a21d229ee9d816 [file] [edit]
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
; RUN: llc < %s -mtriple=aarch64 -mattr=+sve2-bitperm | FileCheck %s --check-prefix=BITPERM
; RUN: llc < %s -mtriple=aarch64 -mattr=+sve2 | FileCheck %s --check-prefix=NOSVE2BITPERM
define i8 @pdep_i8(i8 %val, i8 %mask) nounwind {
; BITPERM-LABEL: pdep_i8:
; BITPERM: // %bb.0:
; BITPERM-NEXT: fmov s0, w1
; BITPERM-NEXT: fmov s1, w0
; BITPERM-NEXT: bdep z0.s, z1.s, z0.s
; BITPERM-NEXT: fmov w0, s0
; BITPERM-NEXT: ret
;
; NOSVE2BITPERM-LABEL: pdep_i8:
; NOSVE2BITPERM: // %bb.0:
; NOSVE2BITPERM-NEXT: mvn w9, w1
; NOSVE2BITPERM-NEXT: mov w8, #-1 // =0xffffffff
; NOSVE2BITPERM-NEXT: lsl w9, w9, #1
; NOSVE2BITPERM-NEXT: fmov s0, w8
; NOSVE2BITPERM-NEXT: fmov s1, w9
; NOSVE2BITPERM-NEXT: pmul v1.8b, v1.8b, v0.8b
; NOSVE2BITPERM-NEXT: fmov w8, s1
; NOSVE2BITPERM-NEXT: bic w9, w9, w8
; NOSVE2BITPERM-NEXT: and w8, w8, w1
; NOSVE2BITPERM-NEXT: fmov s1, w9
; NOSVE2BITPERM-NEXT: eor w11, w1, w8
; NOSVE2BITPERM-NEXT: and w12, w8, #0xfe
; NOSVE2BITPERM-NEXT: orr w11, w11, w12, lsr #1
; NOSVE2BITPERM-NEXT: pmul v1.8b, v1.8b, v0.8b
; NOSVE2BITPERM-NEXT: fmov w10, s1
; NOSVE2BITPERM-NEXT: bic w9, w9, w10
; NOSVE2BITPERM-NEXT: fmov s1, w9
; NOSVE2BITPERM-NEXT: and w9, w10, w11
; NOSVE2BITPERM-NEXT: eor w10, w11, w9
; NOSVE2BITPERM-NEXT: and w11, w9, #0xfc
; NOSVE2BITPERM-NEXT: orr w10, w10, w11, lsr #2
; NOSVE2BITPERM-NEXT: pmul v0.8b, v1.8b, v0.8b
; NOSVE2BITPERM-NEXT: fmov w11, s0
; NOSVE2BITPERM-NEXT: and w10, w11, w10
; NOSVE2BITPERM-NEXT: and w11, w10, w0, lsl #4
; NOSVE2BITPERM-NEXT: bic w10, w0, w10
; NOSVE2BITPERM-NEXT: orr w10, w10, w11
; NOSVE2BITPERM-NEXT: and w11, w9, w10, lsl #2
; NOSVE2BITPERM-NEXT: bic w9, w10, w9
; NOSVE2BITPERM-NEXT: orr w9, w9, w11
; NOSVE2BITPERM-NEXT: and w10, w8, w9, lsl #1
; NOSVE2BITPERM-NEXT: bic w8, w9, w8
; NOSVE2BITPERM-NEXT: orr w8, w8, w10
; NOSVE2BITPERM-NEXT: and w0, w8, w1
; NOSVE2BITPERM-NEXT: ret
%res = call i8 @llvm.pdep.i8(i8 %val, i8 %mask)
ret i8 %res
}
define i16 @pdep_i16(i16 %val, i16 %mask) nounwind {
; BITPERM-LABEL: pdep_i16:
; BITPERM: // %bb.0:
; BITPERM-NEXT: fmov s0, w1
; BITPERM-NEXT: fmov s1, w0
; BITPERM-NEXT: bdep z0.s, z1.s, z0.s
; BITPERM-NEXT: fmov w0, s0
; BITPERM-NEXT: ret
;
; NOSVE2BITPERM-LABEL: pdep_i16:
; NOSVE2BITPERM: // %bb.0:
; NOSVE2BITPERM-NEXT: mvn w8, w1
; NOSVE2BITPERM-NEXT: lsl w9, w8, #1
; NOSVE2BITPERM-NEXT: eor w8, w9, w8, lsl #2
; NOSVE2BITPERM-NEXT: eor w8, w8, w8, lsl #2
; NOSVE2BITPERM-NEXT: eor w8, w8, w8, lsl #4
; NOSVE2BITPERM-NEXT: eor w8, w8, w8, lsl #8
; NOSVE2BITPERM-NEXT: bic w9, w9, w8
; NOSVE2BITPERM-NEXT: and w8, w8, w1
; NOSVE2BITPERM-NEXT: eor w10, w9, w9, lsl #1
; NOSVE2BITPERM-NEXT: eor w12, w1, w8
; NOSVE2BITPERM-NEXT: and w13, w8, #0xfffe
; NOSVE2BITPERM-NEXT: orr w12, w12, w13, lsr #1
; NOSVE2BITPERM-NEXT: eor w10, w10, w10, lsl #2
; NOSVE2BITPERM-NEXT: eor w10, w10, w10, lsl #4
; NOSVE2BITPERM-NEXT: eor w10, w10, w10, lsl #8
; NOSVE2BITPERM-NEXT: bic w9, w9, w10
; NOSVE2BITPERM-NEXT: and w10, w10, w12
; NOSVE2BITPERM-NEXT: eor w11, w9, w9, lsl #1
; NOSVE2BITPERM-NEXT: eor w12, w12, w10
; NOSVE2BITPERM-NEXT: and w13, w10, #0xfffc
; NOSVE2BITPERM-NEXT: orr w12, w12, w13, lsr #2
; NOSVE2BITPERM-NEXT: eor w11, w11, w11, lsl #2
; NOSVE2BITPERM-NEXT: eor w11, w11, w11, lsl #4
; NOSVE2BITPERM-NEXT: eor w11, w11, w11, lsl #8
; NOSVE2BITPERM-NEXT: bic w9, w9, w11
; NOSVE2BITPERM-NEXT: and w11, w11, w12
; NOSVE2BITPERM-NEXT: eor w9, w9, w9, lsl #1
; NOSVE2BITPERM-NEXT: eor w12, w12, w11
; NOSVE2BITPERM-NEXT: and w13, w11, #0xfff0
; NOSVE2BITPERM-NEXT: orr w12, w12, w13, lsr #4
; NOSVE2BITPERM-NEXT: eor w9, w9, w9, lsl #2
; NOSVE2BITPERM-NEXT: eor w9, w9, w9, lsl #4
; NOSVE2BITPERM-NEXT: eor w9, w9, w9, lsl #8
; NOSVE2BITPERM-NEXT: and w9, w9, w12
; NOSVE2BITPERM-NEXT: and w12, w9, w0, lsl #8
; NOSVE2BITPERM-NEXT: bic w9, w0, w9
; NOSVE2BITPERM-NEXT: orr w9, w9, w12
; NOSVE2BITPERM-NEXT: and w12, w11, w9, lsl #4
; NOSVE2BITPERM-NEXT: bic w9, w9, w11
; NOSVE2BITPERM-NEXT: orr w9, w9, w12
; NOSVE2BITPERM-NEXT: and w11, w10, w9, lsl #2
; NOSVE2BITPERM-NEXT: bic w9, w9, w10
; NOSVE2BITPERM-NEXT: orr w9, w9, w11
; NOSVE2BITPERM-NEXT: and w10, w8, w9, lsl #1
; NOSVE2BITPERM-NEXT: bic w8, w9, w8
; NOSVE2BITPERM-NEXT: orr w8, w8, w10
; NOSVE2BITPERM-NEXT: and w0, w8, w1
; NOSVE2BITPERM-NEXT: ret
%res = call i16 @llvm.pdep.i16(i16 %val, i16 %mask)
ret i16 %res
}
define i32 @pdep_i32(i32 %val, i32 %mask) nounwind {
; BITPERM-LABEL: pdep_i32:
; BITPERM: // %bb.0:
; BITPERM-NEXT: fmov s0, w1
; BITPERM-NEXT: fmov s1, w0
; BITPERM-NEXT: bdep z0.s, z1.s, z0.s
; BITPERM-NEXT: fmov w0, s0
; BITPERM-NEXT: ret
;
; NOSVE2BITPERM-LABEL: pdep_i32:
; NOSVE2BITPERM: // %bb.0:
; NOSVE2BITPERM-NEXT: mvn w8, w1
; NOSVE2BITPERM-NEXT: lsl w9, w8, #1
; NOSVE2BITPERM-NEXT: eor w8, w9, w8, lsl #2
; NOSVE2BITPERM-NEXT: eor w8, w8, w8, lsl #2
; NOSVE2BITPERM-NEXT: eor w8, w8, w8, lsl #4
; NOSVE2BITPERM-NEXT: eor w8, w8, w8, lsl #8
; NOSVE2BITPERM-NEXT: eor w8, w8, w8, lsl #16
; NOSVE2BITPERM-NEXT: bic w9, w9, w8
; NOSVE2BITPERM-NEXT: and w8, w8, w1
; NOSVE2BITPERM-NEXT: eor w10, w9, w9, lsl #1
; NOSVE2BITPERM-NEXT: eor w13, w1, w8
; NOSVE2BITPERM-NEXT: orr w13, w13, w8, lsr #1
; NOSVE2BITPERM-NEXT: eor w10, w10, w10, lsl #2
; NOSVE2BITPERM-NEXT: eor w10, w10, w10, lsl #4
; NOSVE2BITPERM-NEXT: eor w10, w10, w10, lsl #8
; NOSVE2BITPERM-NEXT: eor w10, w10, w10, lsl #16
; NOSVE2BITPERM-NEXT: bic w9, w9, w10
; NOSVE2BITPERM-NEXT: and w10, w10, w13
; NOSVE2BITPERM-NEXT: eor w11, w9, w9, lsl #1
; NOSVE2BITPERM-NEXT: eor w13, w13, w10
; NOSVE2BITPERM-NEXT: orr w13, w13, w10, lsr #2
; NOSVE2BITPERM-NEXT: eor w11, w11, w11, lsl #2
; NOSVE2BITPERM-NEXT: eor w11, w11, w11, lsl #4
; NOSVE2BITPERM-NEXT: eor w11, w11, w11, lsl #8
; NOSVE2BITPERM-NEXT: eor w11, w11, w11, lsl #16
; NOSVE2BITPERM-NEXT: bic w9, w9, w11
; NOSVE2BITPERM-NEXT: and w11, w11, w13
; NOSVE2BITPERM-NEXT: eor w12, w9, w9, lsl #1
; NOSVE2BITPERM-NEXT: eor w13, w13, w11
; NOSVE2BITPERM-NEXT: orr w13, w13, w11, lsr #4
; NOSVE2BITPERM-NEXT: eor w12, w12, w12, lsl #2
; NOSVE2BITPERM-NEXT: eor w12, w12, w12, lsl #4
; NOSVE2BITPERM-NEXT: eor w12, w12, w12, lsl #8
; NOSVE2BITPERM-NEXT: eor w12, w12, w12, lsl #16
; NOSVE2BITPERM-NEXT: bic w9, w9, w12
; NOSVE2BITPERM-NEXT: and w12, w12, w13
; NOSVE2BITPERM-NEXT: eor w9, w9, w9, lsl #1
; NOSVE2BITPERM-NEXT: eor w13, w13, w12
; NOSVE2BITPERM-NEXT: orr w13, w13, w12, lsr #8
; NOSVE2BITPERM-NEXT: eor w9, w9, w9, lsl #2
; NOSVE2BITPERM-NEXT: eor w9, w9, w9, lsl #4
; NOSVE2BITPERM-NEXT: eor w9, w9, w9, lsl #8
; NOSVE2BITPERM-NEXT: eor w9, w9, w9, lsl #16
; NOSVE2BITPERM-NEXT: and w9, w9, w13
; NOSVE2BITPERM-NEXT: and w13, w9, w0, lsl #16
; NOSVE2BITPERM-NEXT: bic w9, w0, w9
; NOSVE2BITPERM-NEXT: orr w9, w9, w13
; NOSVE2BITPERM-NEXT: and w13, w12, w9, lsl #8
; NOSVE2BITPERM-NEXT: bic w9, w9, w12
; NOSVE2BITPERM-NEXT: orr w9, w9, w13
; NOSVE2BITPERM-NEXT: and w12, w11, w9, lsl #4
; NOSVE2BITPERM-NEXT: bic w9, w9, w11
; NOSVE2BITPERM-NEXT: orr w9, w9, w12
; NOSVE2BITPERM-NEXT: and w11, w10, w9, lsl #2
; NOSVE2BITPERM-NEXT: bic w9, w9, w10
; NOSVE2BITPERM-NEXT: orr w9, w9, w11
; NOSVE2BITPERM-NEXT: and w10, w8, w9, lsl #1
; NOSVE2BITPERM-NEXT: bic w8, w9, w8
; NOSVE2BITPERM-NEXT: orr w8, w8, w10
; NOSVE2BITPERM-NEXT: and w0, w8, w1
; NOSVE2BITPERM-NEXT: ret
%res = call i32 @llvm.pdep.i32(i32 %val, i32 %mask)
ret i32 %res
}
define i64 @pdep_i64(i64 %val, i64 %mask) nounwind {
; BITPERM-LABEL: pdep_i64:
; BITPERM: // %bb.0:
; BITPERM-NEXT: fmov d0, x1
; BITPERM-NEXT: fmov d1, x0
; BITPERM-NEXT: bdep z0.d, z1.d, z0.d
; BITPERM-NEXT: fmov x0, d0
; BITPERM-NEXT: ret
;
; NOSVE2BITPERM-LABEL: pdep_i64:
; NOSVE2BITPERM: // %bb.0:
; NOSVE2BITPERM-NEXT: mvn x8, x1
; NOSVE2BITPERM-NEXT: lsl x9, x8, #1
; NOSVE2BITPERM-NEXT: eor x8, x9, x8, lsl #2
; NOSVE2BITPERM-NEXT: eor x8, x8, x8, lsl #2
; NOSVE2BITPERM-NEXT: eor x8, x8, x8, lsl #4
; NOSVE2BITPERM-NEXT: eor x8, x8, x8, lsl #8
; NOSVE2BITPERM-NEXT: eor x8, x8, x8, lsl #16
; NOSVE2BITPERM-NEXT: eor x8, x8, x8, lsl #32
; NOSVE2BITPERM-NEXT: bic x9, x9, x8
; NOSVE2BITPERM-NEXT: and x8, x8, x1
; NOSVE2BITPERM-NEXT: eor x10, x9, x9, lsl #1
; NOSVE2BITPERM-NEXT: eor x14, x1, x8
; NOSVE2BITPERM-NEXT: orr x14, x14, x8, lsr #1
; NOSVE2BITPERM-NEXT: eor x10, x10, x10, lsl #2
; NOSVE2BITPERM-NEXT: eor x10, x10, x10, lsl #4
; NOSVE2BITPERM-NEXT: eor x10, x10, x10, lsl #8
; NOSVE2BITPERM-NEXT: eor x10, x10, x10, lsl #16
; NOSVE2BITPERM-NEXT: eor x10, x10, x10, lsl #32
; NOSVE2BITPERM-NEXT: bic x9, x9, x10
; NOSVE2BITPERM-NEXT: and x10, x10, x14
; NOSVE2BITPERM-NEXT: eor x11, x9, x9, lsl #1
; NOSVE2BITPERM-NEXT: eor x14, x14, x10
; NOSVE2BITPERM-NEXT: orr x14, x14, x10, lsr #2
; NOSVE2BITPERM-NEXT: eor x11, x11, x11, lsl #2
; NOSVE2BITPERM-NEXT: eor x11, x11, x11, lsl #4
; NOSVE2BITPERM-NEXT: eor x11, x11, x11, lsl #8
; NOSVE2BITPERM-NEXT: eor x11, x11, x11, lsl #16
; NOSVE2BITPERM-NEXT: eor x11, x11, x11, lsl #32
; NOSVE2BITPERM-NEXT: bic x9, x9, x11
; NOSVE2BITPERM-NEXT: and x11, x11, x14
; NOSVE2BITPERM-NEXT: eor x12, x9, x9, lsl #1
; NOSVE2BITPERM-NEXT: eor x14, x14, x11
; NOSVE2BITPERM-NEXT: orr x14, x14, x11, lsr #4
; NOSVE2BITPERM-NEXT: eor x12, x12, x12, lsl #2
; NOSVE2BITPERM-NEXT: eor x12, x12, x12, lsl #4
; NOSVE2BITPERM-NEXT: eor x12, x12, x12, lsl #8
; NOSVE2BITPERM-NEXT: eor x12, x12, x12, lsl #16
; NOSVE2BITPERM-NEXT: eor x12, x12, x12, lsl #32
; NOSVE2BITPERM-NEXT: bic x9, x9, x12
; NOSVE2BITPERM-NEXT: and x12, x12, x14
; NOSVE2BITPERM-NEXT: eor x13, x9, x9, lsl #1
; NOSVE2BITPERM-NEXT: eor x14, x14, x12
; NOSVE2BITPERM-NEXT: orr x14, x14, x12, lsr #8
; NOSVE2BITPERM-NEXT: eor x13, x13, x13, lsl #2
; NOSVE2BITPERM-NEXT: eor x13, x13, x13, lsl #4
; NOSVE2BITPERM-NEXT: eor x13, x13, x13, lsl #8
; NOSVE2BITPERM-NEXT: eor x13, x13, x13, lsl #16
; NOSVE2BITPERM-NEXT: eor x13, x13, x13, lsl #32
; NOSVE2BITPERM-NEXT: bic x9, x9, x13
; NOSVE2BITPERM-NEXT: and x13, x13, x14
; NOSVE2BITPERM-NEXT: eor x9, x9, x9, lsl #1
; NOSVE2BITPERM-NEXT: eor x14, x14, x13
; NOSVE2BITPERM-NEXT: orr x14, x14, x13, lsr #16
; NOSVE2BITPERM-NEXT: eor x9, x9, x9, lsl #2
; NOSVE2BITPERM-NEXT: eor x9, x9, x9, lsl #4
; NOSVE2BITPERM-NEXT: eor x9, x9, x9, lsl #8
; NOSVE2BITPERM-NEXT: eor x9, x9, x9, lsl #16
; NOSVE2BITPERM-NEXT: eor x9, x9, x9, lsl #32
; NOSVE2BITPERM-NEXT: and x9, x9, x14
; NOSVE2BITPERM-NEXT: and x14, x9, x0, lsl #32
; NOSVE2BITPERM-NEXT: bic x9, x0, x9
; NOSVE2BITPERM-NEXT: orr x9, x9, x14
; NOSVE2BITPERM-NEXT: and x14, x13, x9, lsl #16
; NOSVE2BITPERM-NEXT: bic x9, x9, x13
; NOSVE2BITPERM-NEXT: orr x9, x9, x14
; NOSVE2BITPERM-NEXT: and x13, x12, x9, lsl #8
; NOSVE2BITPERM-NEXT: bic x9, x9, x12
; NOSVE2BITPERM-NEXT: orr x9, x9, x13
; NOSVE2BITPERM-NEXT: and x12, x11, x9, lsl #4
; NOSVE2BITPERM-NEXT: bic x9, x9, x11
; NOSVE2BITPERM-NEXT: orr x9, x9, x12
; NOSVE2BITPERM-NEXT: and x11, x10, x9, lsl #2
; NOSVE2BITPERM-NEXT: bic x9, x9, x10
; NOSVE2BITPERM-NEXT: orr x9, x9, x11
; NOSVE2BITPERM-NEXT: and x10, x8, x9, lsl #1
; NOSVE2BITPERM-NEXT: bic x8, x9, x8
; NOSVE2BITPERM-NEXT: orr x8, x8, x10
; NOSVE2BITPERM-NEXT: and x0, x8, x1
; NOSVE2BITPERM-NEXT: ret
%res = call i64 @llvm.pdep.i64(i64 %val, i64 %mask)
ret i64 %res
}
define <vscale x 16 x i8> @pdep_nxv16i8(<vscale x 16 x i8> %val, <vscale x 16 x i8> %mask) nounwind {
; BITPERM-LABEL: pdep_nxv16i8:
; BITPERM: // %bb.0:
; BITPERM-NEXT: bdep z0.b, z0.b, z1.b
; BITPERM-NEXT: ret
;
; NOSVE2BITPERM-LABEL: pdep_nxv16i8:
; NOSVE2BITPERM: // %bb.0:
; NOSVE2BITPERM-NEXT: movprfx z3, z1
; NOSVE2BITPERM-NEXT: subr z3.b, z3.b, #255 // =0xff
; NOSVE2BITPERM-NEXT: mov z2.b, #-1 // =0xffffffffffffffff
; NOSVE2BITPERM-NEXT: lsl z3.b, z3.b, #1
; NOSVE2BITPERM-NEXT: pmul z4.b, z3.b, z2.b
; NOSVE2BITPERM-NEXT: and z5.d, z4.d, z1.d
; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z4.d
; NOSVE2BITPERM-NEXT: eor z6.d, z1.d, z5.d
; NOSVE2BITPERM-NEXT: pmul z4.b, z3.b, z2.b
; NOSVE2BITPERM-NEXT: usra z6.b, z5.b, #1
; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z4.d
; NOSVE2BITPERM-NEXT: and z7.d, z4.d, z6.d
; NOSVE2BITPERM-NEXT: pmul z2.b, z3.b, z2.b
; NOSVE2BITPERM-NEXT: lsl z3.b, z0.b, #4
; NOSVE2BITPERM-NEXT: eor z6.d, z6.d, z7.d
; NOSVE2BITPERM-NEXT: usra z6.b, z7.b, #2
; NOSVE2BITPERM-NEXT: and z2.d, z2.d, z6.d
; NOSVE2BITPERM-NEXT: bsl z3.d, z3.d, z0.d, z2.d
; NOSVE2BITPERM-NEXT: lsl z0.b, z3.b, #2
; NOSVE2BITPERM-NEXT: bsl z0.d, z0.d, z3.d, z7.d
; NOSVE2BITPERM-NEXT: lsl z2.b, z0.b, #1
; NOSVE2BITPERM-NEXT: bsl z2.d, z2.d, z0.d, z5.d
; NOSVE2BITPERM-NEXT: and z0.d, z2.d, z1.d
; NOSVE2BITPERM-NEXT: ret
%res = call <vscale x 16 x i8> @llvm.pdep.nxv16i8(<vscale x 16 x i8> %val, <vscale x 16 x i8> %mask)
ret <vscale x 16 x i8> %res
}
define <vscale x 8 x i16> @pdep_nxv8i16(<vscale x 8 x i16> %val, <vscale x 8 x i16> %mask) nounwind {
; BITPERM-LABEL: pdep_nxv8i16:
; BITPERM: // %bb.0:
; BITPERM-NEXT: bdep z0.h, z0.h, z1.h
; BITPERM-NEXT: ret
;
; NOSVE2BITPERM-LABEL: pdep_nxv8i16:
; NOSVE2BITPERM: // %bb.0:
; NOSVE2BITPERM-NEXT: movprfx z3, z1
; NOSVE2BITPERM-NEXT: subr z3.b, z3.b, #255 // =0xff
; NOSVE2BITPERM-NEXT: mov z2.h, #-1 // =0xffffffffffffffff
; NOSVE2BITPERM-NEXT: lsl z3.h, z3.h, #1
; NOSVE2BITPERM-NEXT: trn1 z4.b, z2.b, z3.b
; NOSVE2BITPERM-NEXT: trn2 z5.b, z3.b, z2.b
; NOSVE2BITPERM-NEXT: pmullb z6.h, z3.b, z2.b
; NOSVE2BITPERM-NEXT: pmul z4.b, z5.b, z4.b
; NOSVE2BITPERM-NEXT: eorbt z4.b, z4.b, z4.b
; NOSVE2BITPERM-NEXT: eortb z6.b, z6.b, z4.b
; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z6.d
; NOSVE2BITPERM-NEXT: and z6.d, z6.d, z1.d
; NOSVE2BITPERM-NEXT: trn1 z4.b, z2.b, z3.b
; NOSVE2BITPERM-NEXT: trn2 z5.b, z3.b, z2.b
; NOSVE2BITPERM-NEXT: pmullb z7.h, z3.b, z2.b
; NOSVE2BITPERM-NEXT: pmul z4.b, z5.b, z4.b
; NOSVE2BITPERM-NEXT: eorbt z4.b, z4.b, z4.b
; NOSVE2BITPERM-NEXT: eortb z7.b, z7.b, z4.b
; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z7.d
; NOSVE2BITPERM-NEXT: trn1 z4.b, z2.b, z3.b
; NOSVE2BITPERM-NEXT: trn2 z5.b, z3.b, z2.b
; NOSVE2BITPERM-NEXT: pmullb z24.h, z3.b, z2.b
; NOSVE2BITPERM-NEXT: pmul z4.b, z5.b, z4.b
; NOSVE2BITPERM-NEXT: eor z5.d, z1.d, z6.d
; NOSVE2BITPERM-NEXT: usra z5.h, z6.h, #1
; NOSVE2BITPERM-NEXT: eorbt z4.b, z4.b, z4.b
; NOSVE2BITPERM-NEXT: eortb z24.b, z24.b, z4.b
; NOSVE2BITPERM-NEXT: and z4.d, z7.d, z5.d
; NOSVE2BITPERM-NEXT: eor z5.d, z5.d, z4.d
; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z24.d
; NOSVE2BITPERM-NEXT: usra z5.h, z4.h, #2
; NOSVE2BITPERM-NEXT: trn1 z7.b, z2.b, z3.b
; NOSVE2BITPERM-NEXT: trn2 z25.b, z3.b, z2.b
; NOSVE2BITPERM-NEXT: pmullb z2.h, z3.b, z2.b
; NOSVE2BITPERM-NEXT: pmul z3.b, z25.b, z7.b
; NOSVE2BITPERM-NEXT: and z7.d, z24.d, z5.d
; NOSVE2BITPERM-NEXT: eor z5.d, z5.d, z7.d
; NOSVE2BITPERM-NEXT: eorbt z3.b, z3.b, z3.b
; NOSVE2BITPERM-NEXT: usra z5.h, z7.h, #4
; NOSVE2BITPERM-NEXT: eortb z2.b, z2.b, z3.b
; NOSVE2BITPERM-NEXT: lsl z3.h, z0.h, #8
; NOSVE2BITPERM-NEXT: and z2.d, z2.d, z5.d
; NOSVE2BITPERM-NEXT: bsl z3.d, z3.d, z0.d, z2.d
; NOSVE2BITPERM-NEXT: lsl z0.h, z3.h, #4
; NOSVE2BITPERM-NEXT: bsl z0.d, z0.d, z3.d, z7.d
; NOSVE2BITPERM-NEXT: lsl z2.h, z0.h, #2
; NOSVE2BITPERM-NEXT: bsl z2.d, z2.d, z0.d, z4.d
; NOSVE2BITPERM-NEXT: lsl z0.h, z2.h, #1
; NOSVE2BITPERM-NEXT: bsl z0.d, z0.d, z2.d, z6.d
; NOSVE2BITPERM-NEXT: and z0.d, z0.d, z1.d
; NOSVE2BITPERM-NEXT: ret
%res = call <vscale x 8 x i16> @llvm.pdep.nxv8i16(<vscale x 8 x i16> %val, <vscale x 8 x i16> %mask)
ret <vscale x 8 x i16> %res
}
define <vscale x 4 x i32> @pdep_nxv4i32(<vscale x 4 x i32> %val, <vscale x 4 x i32> %mask) nounwind {
; BITPERM-LABEL: pdep_nxv4i32:
; BITPERM: // %bb.0:
; BITPERM-NEXT: bdep z0.s, z0.s, z1.s
; BITPERM-NEXT: ret
;
; NOSVE2BITPERM-LABEL: pdep_nxv4i32:
; NOSVE2BITPERM: // %bb.0:
; NOSVE2BITPERM-NEXT: movprfx z3, z1
; NOSVE2BITPERM-NEXT: subr z3.b, z3.b, #255 // =0xff
; NOSVE2BITPERM-NEXT: mov z2.s, #-1 // =0xffffffffffffffff
; NOSVE2BITPERM-NEXT: lsl z3.s, z3.s, #1
; NOSVE2BITPERM-NEXT: pmullt z4.d, z3.s, z2.s
; NOSVE2BITPERM-NEXT: pmullb z5.d, z3.s, z2.s
; NOSVE2BITPERM-NEXT: trn1 z4.s, z5.s, z4.s
; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z4.d
; NOSVE2BITPERM-NEXT: and z4.d, z4.d, z1.d
; NOSVE2BITPERM-NEXT: pmullt z5.d, z3.s, z2.s
; NOSVE2BITPERM-NEXT: eor z24.d, z1.d, z4.d
; NOSVE2BITPERM-NEXT: pmullb z6.d, z3.s, z2.s
; NOSVE2BITPERM-NEXT: usra z24.s, z4.s, #1
; NOSVE2BITPERM-NEXT: trn1 z5.s, z6.s, z5.s
; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z5.d
; NOSVE2BITPERM-NEXT: and z5.d, z5.d, z24.d
; NOSVE2BITPERM-NEXT: pmullt z6.d, z3.s, z2.s
; NOSVE2BITPERM-NEXT: eor z24.d, z24.d, z5.d
; NOSVE2BITPERM-NEXT: pmullb z7.d, z3.s, z2.s
; NOSVE2BITPERM-NEXT: usra z24.s, z5.s, #2
; NOSVE2BITPERM-NEXT: trn1 z6.s, z7.s, z6.s
; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z6.d
; NOSVE2BITPERM-NEXT: and z6.d, z6.d, z24.d
; NOSVE2BITPERM-NEXT: pmullt z7.d, z3.s, z2.s
; NOSVE2BITPERM-NEXT: eor z24.d, z24.d, z6.d
; NOSVE2BITPERM-NEXT: pmullb z25.d, z3.s, z2.s
; NOSVE2BITPERM-NEXT: usra z24.s, z6.s, #4
; NOSVE2BITPERM-NEXT: trn1 z7.s, z25.s, z7.s
; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z7.d
; NOSVE2BITPERM-NEXT: pmullt z25.d, z3.s, z2.s
; NOSVE2BITPERM-NEXT: pmullb z2.d, z3.s, z2.s
; NOSVE2BITPERM-NEXT: and z3.d, z7.d, z24.d
; NOSVE2BITPERM-NEXT: eor z7.d, z24.d, z3.d
; NOSVE2BITPERM-NEXT: usra z7.s, z3.s, #8
; NOSVE2BITPERM-NEXT: trn1 z2.s, z2.s, z25.s
; NOSVE2BITPERM-NEXT: and z2.d, z2.d, z7.d
; NOSVE2BITPERM-NEXT: lsl z7.s, z0.s, #16
; NOSVE2BITPERM-NEXT: bsl z7.d, z7.d, z0.d, z2.d
; NOSVE2BITPERM-NEXT: lsl z0.s, z7.s, #8
; NOSVE2BITPERM-NEXT: bsl z0.d, z0.d, z7.d, z3.d
; NOSVE2BITPERM-NEXT: lsl z2.s, z0.s, #4
; NOSVE2BITPERM-NEXT: bsl z2.d, z2.d, z0.d, z6.d
; NOSVE2BITPERM-NEXT: lsl z0.s, z2.s, #2
; NOSVE2BITPERM-NEXT: bsl z0.d, z0.d, z2.d, z5.d
; NOSVE2BITPERM-NEXT: lsl z2.s, z0.s, #1
; NOSVE2BITPERM-NEXT: bsl z2.d, z2.d, z0.d, z4.d
; NOSVE2BITPERM-NEXT: and z0.d, z2.d, z1.d
; NOSVE2BITPERM-NEXT: ret
%res = call <vscale x 4 x i32> @llvm.pdep.nxv4i32(<vscale x 4 x i32> %val, <vscale x 4 x i32> %mask)
ret <vscale x 4 x i32> %res
}
define <vscale x 2 x i64> @pdep_nxv2i64(<vscale x 2 x i64> %val, <vscale x 2 x i64> %mask) nounwind {
; BITPERM-LABEL: pdep_nxv2i64:
; BITPERM: // %bb.0:
; BITPERM-NEXT: bdep z0.d, z0.d, z1.d
; BITPERM-NEXT: ret
;
; NOSVE2BITPERM-LABEL: pdep_nxv2i64:
; NOSVE2BITPERM: // %bb.0:
; NOSVE2BITPERM-NEXT: movprfx z3, z1
; NOSVE2BITPERM-NEXT: subr z3.b, z3.b, #255 // =0xff
; NOSVE2BITPERM-NEXT: mov z2.d, #-1 // =0xffffffffffffffff
; NOSVE2BITPERM-NEXT: lsl z4.d, z3.d, #1
; NOSVE2BITPERM-NEXT: trn1 z3.s, z2.s, z4.s
; NOSVE2BITPERM-NEXT: trn2 z5.s, z4.s, z2.s
; NOSVE2BITPERM-NEXT: pmullt z6.d, z5.s, z3.s
; NOSVE2BITPERM-NEXT: pmullb z5.d, z5.s, z3.s
; NOSVE2BITPERM-NEXT: pmullb z3.d, z4.s, z2.s
; NOSVE2BITPERM-NEXT: trn1 z5.s, z5.s, z6.s
; NOSVE2BITPERM-NEXT: eorbt z5.s, z5.s, z5.s
; NOSVE2BITPERM-NEXT: eortb z3.s, z3.s, z5.s
; NOSVE2BITPERM-NEXT: bic z4.d, z4.d, z3.d
; NOSVE2BITPERM-NEXT: and z3.d, z3.d, z1.d
; NOSVE2BITPERM-NEXT: trn1 z5.s, z2.s, z4.s
; NOSVE2BITPERM-NEXT: trn2 z6.s, z4.s, z2.s
; NOSVE2BITPERM-NEXT: eor z27.d, z1.d, z3.d
; NOSVE2BITPERM-NEXT: pmullt z7.d, z6.s, z5.s
; NOSVE2BITPERM-NEXT: usra z27.d, z3.d, #1
; NOSVE2BITPERM-NEXT: pmullb z5.d, z6.s, z5.s
; NOSVE2BITPERM-NEXT: pmullb z6.d, z4.s, z2.s
; NOSVE2BITPERM-NEXT: trn1 z5.s, z5.s, z7.s
; NOSVE2BITPERM-NEXT: eorbt z5.s, z5.s, z5.s
; NOSVE2BITPERM-NEXT: eortb z6.s, z6.s, z5.s
; NOSVE2BITPERM-NEXT: bic z4.d, z4.d, z6.d
; NOSVE2BITPERM-NEXT: and z6.d, z6.d, z27.d
; NOSVE2BITPERM-NEXT: trn1 z5.s, z2.s, z4.s
; NOSVE2BITPERM-NEXT: trn2 z7.s, z4.s, z2.s
; NOSVE2BITPERM-NEXT: pmullt z24.d, z7.s, z5.s
; NOSVE2BITPERM-NEXT: pmullb z5.d, z7.s, z5.s
; NOSVE2BITPERM-NEXT: pmullb z7.d, z4.s, z2.s
; NOSVE2BITPERM-NEXT: trn1 z5.s, z5.s, z24.s
; NOSVE2BITPERM-NEXT: eorbt z5.s, z5.s, z5.s
; NOSVE2BITPERM-NEXT: eortb z7.s, z7.s, z5.s
; NOSVE2BITPERM-NEXT: bic z4.d, z4.d, z7.d
; NOSVE2BITPERM-NEXT: trn1 z5.s, z2.s, z4.s
; NOSVE2BITPERM-NEXT: trn2 z24.s, z4.s, z2.s
; NOSVE2BITPERM-NEXT: pmullt z25.d, z24.s, z5.s
; NOSVE2BITPERM-NEXT: pmullb z5.d, z24.s, z5.s
; NOSVE2BITPERM-NEXT: pmullb z24.d, z4.s, z2.s
; NOSVE2BITPERM-NEXT: trn1 z5.s, z5.s, z25.s
; NOSVE2BITPERM-NEXT: eorbt z5.s, z5.s, z5.s
; NOSVE2BITPERM-NEXT: eortb z24.s, z24.s, z5.s
; NOSVE2BITPERM-NEXT: bic z4.d, z4.d, z24.d
; NOSVE2BITPERM-NEXT: trn1 z5.s, z2.s, z4.s
; NOSVE2BITPERM-NEXT: trn2 z25.s, z4.s, z2.s
; NOSVE2BITPERM-NEXT: pmullt z26.d, z25.s, z5.s
; NOSVE2BITPERM-NEXT: pmullb z5.d, z25.s, z5.s
; NOSVE2BITPERM-NEXT: pmullb z25.d, z4.s, z2.s
; NOSVE2BITPERM-NEXT: trn1 z5.s, z5.s, z26.s
; NOSVE2BITPERM-NEXT: eor z26.d, z27.d, z6.d
; NOSVE2BITPERM-NEXT: eorbt z5.s, z5.s, z5.s
; NOSVE2BITPERM-NEXT: usra z26.d, z6.d, #2
; NOSVE2BITPERM-NEXT: eortb z25.s, z25.s, z5.s
; NOSVE2BITPERM-NEXT: and z5.d, z7.d, z26.d
; NOSVE2BITPERM-NEXT: eor z7.d, z26.d, z5.d
; NOSVE2BITPERM-NEXT: bic z4.d, z4.d, z25.d
; NOSVE2BITPERM-NEXT: usra z7.d, z5.d, #4
; NOSVE2BITPERM-NEXT: trn1 z26.s, z2.s, z4.s
; NOSVE2BITPERM-NEXT: trn2 z27.s, z4.s, z2.s
; NOSVE2BITPERM-NEXT: pmullb z2.d, z4.s, z2.s
; NOSVE2BITPERM-NEXT: pmullt z28.d, z27.s, z26.s
; NOSVE2BITPERM-NEXT: and z24.d, z24.d, z7.d
; NOSVE2BITPERM-NEXT: pmullb z26.d, z27.s, z26.s
; NOSVE2BITPERM-NEXT: eor z7.d, z7.d, z24.d
; NOSVE2BITPERM-NEXT: usra z7.d, z24.d, #8
; NOSVE2BITPERM-NEXT: trn1 z4.s, z26.s, z28.s
; NOSVE2BITPERM-NEXT: and z25.d, z25.d, z7.d
; NOSVE2BITPERM-NEXT: eorbt z4.s, z4.s, z4.s
; NOSVE2BITPERM-NEXT: eor z7.d, z7.d, z25.d
; NOSVE2BITPERM-NEXT: usra z7.d, z25.d, #16
; NOSVE2BITPERM-NEXT: eortb z2.s, z2.s, z4.s
; NOSVE2BITPERM-NEXT: lsl z4.d, z0.d, #32
; NOSVE2BITPERM-NEXT: and z2.d, z2.d, z7.d
; NOSVE2BITPERM-NEXT: bsl z4.d, z4.d, z0.d, z2.d
; NOSVE2BITPERM-NEXT: lsl z0.d, z4.d, #16
; NOSVE2BITPERM-NEXT: bsl z0.d, z0.d, z4.d, z25.d
; NOSVE2BITPERM-NEXT: lsl z2.d, z0.d, #8
; NOSVE2BITPERM-NEXT: bsl z2.d, z2.d, z0.d, z24.d
; NOSVE2BITPERM-NEXT: lsl z0.d, z2.d, #4
; NOSVE2BITPERM-NEXT: bsl z0.d, z0.d, z2.d, z5.d
; NOSVE2BITPERM-NEXT: lsl z2.d, z0.d, #2
; NOSVE2BITPERM-NEXT: bsl z2.d, z2.d, z0.d, z6.d
; NOSVE2BITPERM-NEXT: lsl z0.d, z2.d, #1
; NOSVE2BITPERM-NEXT: bsl z0.d, z0.d, z2.d, z3.d
; NOSVE2BITPERM-NEXT: and z0.d, z0.d, z1.d
; NOSVE2BITPERM-NEXT: ret
%res = call <vscale x 2 x i64> @llvm.pdep.nxv2i64(<vscale x 2 x i64> %val, <vscale x 2 x i64> %mask)
ret <vscale x 2 x i64> %res
}