| ; 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 |
| } |
| |