| ; 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 @pext_i8(i8 %val, i8 %mask) nounwind { | |
| ; BITPERM-LABEL: pext_i8: | |
| ; BITPERM: // %bb.0: | |
| ; BITPERM-NEXT: and w8, w1, #0xff | |
| ; BITPERM-NEXT: fmov s0, w0 | |
| ; BITPERM-NEXT: fmov s1, w8 | |
| ; BITPERM-NEXT: bext z0.s, z0.s, z1.s | |
| ; BITPERM-NEXT: fmov w0, s0 | |
| ; BITPERM-NEXT: ret | |
| ; | |
| ; NOSVE2BITPERM-LABEL: pext_i8: | |
| ; NOSVE2BITPERM: // %bb.0: | |
| ; NOSVE2BITPERM-NEXT: mvn w8, w1 | |
| ; NOSVE2BITPERM-NEXT: movi v0.2d, #0xffffffffffffffff | |
| ; NOSVE2BITPERM-NEXT: and w10, w0, w1 | |
| ; NOSVE2BITPERM-NEXT: lsl w8, w8, #1 | |
| ; NOSVE2BITPERM-NEXT: fmov s1, w8 | |
| ; NOSVE2BITPERM-NEXT: pmul v1.8b, v1.8b, v0.8b | |
| ; NOSVE2BITPERM-NEXT: fmov w9, s1 | |
| ; NOSVE2BITPERM-NEXT: bic w8, w8, w9 | |
| ; NOSVE2BITPERM-NEXT: and w9, w9, w1 | |
| ; NOSVE2BITPERM-NEXT: fmov s1, w8 | |
| ; NOSVE2BITPERM-NEXT: and w11, w10, w9 | |
| ; NOSVE2BITPERM-NEXT: eor w13, w1, w9 | |
| ; NOSVE2BITPERM-NEXT: and w9, w9, #0xfe | |
| ; NOSVE2BITPERM-NEXT: eor w10, w10, w11 | |
| ; NOSVE2BITPERM-NEXT: and w11, w11, #0xfe | |
| ; NOSVE2BITPERM-NEXT: orr w9, w13, w9, lsr #1 | |
| ; NOSVE2BITPERM-NEXT: pmul v1.8b, v1.8b, v0.8b | |
| ; NOSVE2BITPERM-NEXT: fmov w12, s1 | |
| ; NOSVE2BITPERM-NEXT: bic w8, w8, w12 | |
| ; NOSVE2BITPERM-NEXT: fmov s1, w8 | |
| ; NOSVE2BITPERM-NEXT: orr w8, w10, w11, lsr #1 | |
| ; NOSVE2BITPERM-NEXT: and w10, w12, w9 | |
| ; NOSVE2BITPERM-NEXT: eor w9, w9, w10 | |
| ; NOSVE2BITPERM-NEXT: and w11, w8, w10 | |
| ; NOSVE2BITPERM-NEXT: and w10, w10, #0xfc | |
| ; NOSVE2BITPERM-NEXT: pmul v0.8b, v1.8b, v0.8b | |
| ; NOSVE2BITPERM-NEXT: orr w9, w9, w10, lsr #2 | |
| ; NOSVE2BITPERM-NEXT: eor w8, w8, w11 | |
| ; NOSVE2BITPERM-NEXT: and w11, w11, #0xfc | |
| ; NOSVE2BITPERM-NEXT: orr w8, w8, w11, lsr #2 | |
| ; NOSVE2BITPERM-NEXT: fmov w10, s0 | |
| ; NOSVE2BITPERM-NEXT: and w9, w10, w9 | |
| ; NOSVE2BITPERM-NEXT: and w9, w8, w9 | |
| ; NOSVE2BITPERM-NEXT: eor w8, w8, w9 | |
| ; NOSVE2BITPERM-NEXT: and w9, w9, #0xf0 | |
| ; NOSVE2BITPERM-NEXT: orr w0, w8, w9, lsr #4 | |
| ; NOSVE2BITPERM-NEXT: ret | |
| %res = call i8 @llvm.pext.i8(i8 %val, i8 %mask) | |
| ret i8 %res | |
| } | |
| define i16 @pext_i16(i16 %val, i16 %mask) nounwind { | |
| ; BITPERM-LABEL: pext_i16: | |
| ; BITPERM: // %bb.0: | |
| ; BITPERM-NEXT: and w8, w1, #0xffff | |
| ; BITPERM-NEXT: fmov s0, w0 | |
| ; BITPERM-NEXT: fmov s1, w8 | |
| ; BITPERM-NEXT: bext z0.s, z0.s, z1.s | |
| ; BITPERM-NEXT: fmov w0, s0 | |
| ; BITPERM-NEXT: ret | |
| ; | |
| ; NOSVE2BITPERM-LABEL: pext_i16: | |
| ; NOSVE2BITPERM: // %bb.0: | |
| ; NOSVE2BITPERM-NEXT: mvn w8, w1 | |
| ; NOSVE2BITPERM-NEXT: and w11, w0, 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: and w13, w11, w8 | |
| ; NOSVE2BITPERM-NEXT: eor w14, w1, w8 | |
| ; NOSVE2BITPERM-NEXT: and w8, w8, #0xfffe | |
| ; NOSVE2BITPERM-NEXT: eor w11, w11, w13 | |
| ; NOSVE2BITPERM-NEXT: and w13, w13, #0xfffe | |
| ; NOSVE2BITPERM-NEXT: eor w10, w10, w10, lsl #2 | |
| ; NOSVE2BITPERM-NEXT: orr w8, w14, w8, lsr #1 | |
| ; NOSVE2BITPERM-NEXT: orr w11, w11, w13, lsr #1 | |
| ; 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, w8 | |
| ; NOSVE2BITPERM-NEXT: eor w12, w9, w9, lsl #1 | |
| ; NOSVE2BITPERM-NEXT: and w13, w11, w10 | |
| ; NOSVE2BITPERM-NEXT: eor w8, w8, w10 | |
| ; NOSVE2BITPERM-NEXT: and w10, w10, #0xfffc | |
| ; NOSVE2BITPERM-NEXT: eor w11, w11, w13 | |
| ; NOSVE2BITPERM-NEXT: and w13, w13, #0xfffc | |
| ; NOSVE2BITPERM-NEXT: eor w12, w12, w12, lsl #2 | |
| ; NOSVE2BITPERM-NEXT: orr w8, w8, w10, lsr #2 | |
| ; NOSVE2BITPERM-NEXT: orr w10, w11, w13, lsr #2 | |
| ; NOSVE2BITPERM-NEXT: eor w12, w12, w12, lsl #4 | |
| ; NOSVE2BITPERM-NEXT: eor w12, w12, w12, lsl #8 | |
| ; NOSVE2BITPERM-NEXT: bic w9, w9, w12 | |
| ; NOSVE2BITPERM-NEXT: and w11, w12, w8 | |
| ; NOSVE2BITPERM-NEXT: eor w9, w9, w9, lsl #1 | |
| ; NOSVE2BITPERM-NEXT: and w12, w10, w11 | |
| ; NOSVE2BITPERM-NEXT: eor w8, w8, w11 | |
| ; NOSVE2BITPERM-NEXT: eor w10, w10, w12 | |
| ; NOSVE2BITPERM-NEXT: and w12, w12, #0xfff0 | |
| ; NOSVE2BITPERM-NEXT: and w11, w11, #0xfff0 | |
| ; NOSVE2BITPERM-NEXT: eor w9, w9, w9, lsl #2 | |
| ; NOSVE2BITPERM-NEXT: orr w10, w10, w12, lsr #4 | |
| ; NOSVE2BITPERM-NEXT: orr w8, w8, w11, lsr #4 | |
| ; NOSVE2BITPERM-NEXT: eor w9, w9, w9, lsl #4 | |
| ; NOSVE2BITPERM-NEXT: and w8, w10, w8 | |
| ; NOSVE2BITPERM-NEXT: eor w9, w9, w9, lsl #8 | |
| ; NOSVE2BITPERM-NEXT: and w8, w8, w9 | |
| ; NOSVE2BITPERM-NEXT: eor w9, w10, w8 | |
| ; NOSVE2BITPERM-NEXT: and w8, w8, #0xff00 | |
| ; NOSVE2BITPERM-NEXT: orr w0, w9, w8, lsr #8 | |
| ; NOSVE2BITPERM-NEXT: ret | |
| %res = call i16 @llvm.pext.i16(i16 %val, i16 %mask) | |
| ret i16 %res | |
| } | |
| define i32 @pext_i32(i32 %val, i32 %mask) nounwind { | |
| ; BITPERM-LABEL: pext_i32: | |
| ; BITPERM: // %bb.0: | |
| ; BITPERM-NEXT: fmov s0, w1 | |
| ; BITPERM-NEXT: fmov s1, w0 | |
| ; BITPERM-NEXT: bext z0.s, z1.s, z0.s | |
| ; BITPERM-NEXT: fmov w0, s0 | |
| ; BITPERM-NEXT: ret | |
| ; | |
| ; NOSVE2BITPERM-LABEL: pext_i32: | |
| ; NOSVE2BITPERM: // %bb.0: | |
| ; NOSVE2BITPERM-NEXT: mvn w8, w1 | |
| ; NOSVE2BITPERM-NEXT: and w13, w0, 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: and w14, w13, w8 | |
| ; NOSVE2BITPERM-NEXT: eor w15, w1, w8 | |
| ; NOSVE2BITPERM-NEXT: orr w8, w15, w8, lsr #1 | |
| ; NOSVE2BITPERM-NEXT: eor w13, w13, w14 | |
| ; NOSVE2BITPERM-NEXT: eor w10, w10, w10, lsl #2 | |
| ; NOSVE2BITPERM-NEXT: orr w13, w13, w14, lsr #1 | |
| ; 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, w8 | |
| ; NOSVE2BITPERM-NEXT: eor w11, w9, w9, lsl #1 | |
| ; NOSVE2BITPERM-NEXT: and w14, w13, w10 | |
| ; NOSVE2BITPERM-NEXT: eor w8, w8, w10 | |
| ; NOSVE2BITPERM-NEXT: orr w8, w8, w10, lsr #2 | |
| ; NOSVE2BITPERM-NEXT: eor w10, w13, w14 | |
| ; NOSVE2BITPERM-NEXT: eor w11, w11, w11, lsl #2 | |
| ; NOSVE2BITPERM-NEXT: orr w10, w10, w14, lsr #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, w8 | |
| ; NOSVE2BITPERM-NEXT: eor w12, w9, w9, lsl #1 | |
| ; NOSVE2BITPERM-NEXT: and w13, w10, w11 | |
| ; NOSVE2BITPERM-NEXT: eor w8, w8, w11 | |
| ; NOSVE2BITPERM-NEXT: eor w10, w10, w13 | |
| ; NOSVE2BITPERM-NEXT: orr w8, w8, w11, lsr #4 | |
| ; NOSVE2BITPERM-NEXT: eor w12, w12, w12, lsl #2 | |
| ; NOSVE2BITPERM-NEXT: orr w10, w10, w13, lsr #4 | |
| ; 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 w11, w12, w8 | |
| ; NOSVE2BITPERM-NEXT: eor w9, w9, w9, lsl #1 | |
| ; NOSVE2BITPERM-NEXT: and w12, w10, w11 | |
| ; NOSVE2BITPERM-NEXT: eor w8, w8, w11 | |
| ; NOSVE2BITPERM-NEXT: eor w10, w10, w12 | |
| ; NOSVE2BITPERM-NEXT: orr w8, w8, w11, lsr #8 | |
| ; NOSVE2BITPERM-NEXT: eor w9, w9, w9, lsl #2 | |
| ; NOSVE2BITPERM-NEXT: orr w10, w10, w12, lsr #8 | |
| ; NOSVE2BITPERM-NEXT: eor w9, w9, w9, lsl #4 | |
| ; NOSVE2BITPERM-NEXT: and w8, w10, w8 | |
| ; NOSVE2BITPERM-NEXT: eor w9, w9, w9, lsl #8 | |
| ; NOSVE2BITPERM-NEXT: eor w9, w9, w9, lsl #16 | |
| ; NOSVE2BITPERM-NEXT: and w8, w8, w9 | |
| ; NOSVE2BITPERM-NEXT: eor w9, w10, w8 | |
| ; NOSVE2BITPERM-NEXT: orr w0, w9, w8, lsr #16 | |
| ; NOSVE2BITPERM-NEXT: ret | |
| %res = call i32 @llvm.pext.i32(i32 %val, i32 %mask) | |
| ret i32 %res | |
| } | |
| define i64 @pext_i64(i64 %val, i64 %mask) nounwind { | |
| ; BITPERM-LABEL: pext_i64: | |
| ; BITPERM: // %bb.0: | |
| ; BITPERM-NEXT: fmov d0, x1 | |
| ; BITPERM-NEXT: fmov d1, x0 | |
| ; BITPERM-NEXT: bext z0.d, z1.d, z0.d | |
| ; BITPERM-NEXT: fmov x0, d0 | |
| ; BITPERM-NEXT: ret | |
| ; | |
| ; NOSVE2BITPERM-LABEL: pext_i64: | |
| ; NOSVE2BITPERM: // %bb.0: | |
| ; NOSVE2BITPERM-NEXT: mvn x8, x1 | |
| ; NOSVE2BITPERM-NEXT: and x14, x0, 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: and x15, x14, x8 | |
| ; NOSVE2BITPERM-NEXT: eor x16, x1, x8 | |
| ; NOSVE2BITPERM-NEXT: orr x8, x16, x8, lsr #1 | |
| ; NOSVE2BITPERM-NEXT: eor x14, x14, x15 | |
| ; NOSVE2BITPERM-NEXT: eor x10, x10, x10, lsl #2 | |
| ; NOSVE2BITPERM-NEXT: orr x14, x14, x15, lsr #1 | |
| ; 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, x8 | |
| ; NOSVE2BITPERM-NEXT: eor x11, x9, x9, lsl #1 | |
| ; NOSVE2BITPERM-NEXT: and x15, x14, x10 | |
| ; NOSVE2BITPERM-NEXT: eor x8, x8, x10 | |
| ; NOSVE2BITPERM-NEXT: orr x8, x8, x10, lsr #2 | |
| ; NOSVE2BITPERM-NEXT: eor x10, x14, x15 | |
| ; NOSVE2BITPERM-NEXT: eor x11, x11, x11, lsl #2 | |
| ; NOSVE2BITPERM-NEXT: orr x10, x10, x15, lsr #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, x8 | |
| ; NOSVE2BITPERM-NEXT: eor x12, x9, x9, lsl #1 | |
| ; NOSVE2BITPERM-NEXT: and x14, x10, x11 | |
| ; NOSVE2BITPERM-NEXT: eor x8, x8, x11 | |
| ; NOSVE2BITPERM-NEXT: orr x8, x8, x11, lsr #4 | |
| ; NOSVE2BITPERM-NEXT: eor x10, x10, x14 | |
| ; NOSVE2BITPERM-NEXT: eor x12, x12, x12, lsl #2 | |
| ; NOSVE2BITPERM-NEXT: orr x10, x10, x14, lsr #4 | |
| ; 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 x11, x12, x8 | |
| ; NOSVE2BITPERM-NEXT: eor x13, x9, x9, lsl #1 | |
| ; NOSVE2BITPERM-NEXT: and x12, x10, x11 | |
| ; NOSVE2BITPERM-NEXT: eor x8, x8, x11 | |
| ; NOSVE2BITPERM-NEXT: eor x10, x10, x12 | |
| ; NOSVE2BITPERM-NEXT: orr x8, x8, x11, lsr #8 | |
| ; NOSVE2BITPERM-NEXT: eor x13, x13, x13, lsl #2 | |
| ; NOSVE2BITPERM-NEXT: orr x10, x10, x12, lsr #8 | |
| ; 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 x11, x13, x8 | |
| ; NOSVE2BITPERM-NEXT: eor x9, x9, x9, lsl #1 | |
| ; NOSVE2BITPERM-NEXT: and x12, x10, x11 | |
| ; NOSVE2BITPERM-NEXT: eor x8, x8, x11 | |
| ; NOSVE2BITPERM-NEXT: eor x10, x10, x12 | |
| ; NOSVE2BITPERM-NEXT: orr x8, x8, x11, lsr #16 | |
| ; NOSVE2BITPERM-NEXT: eor x9, x9, x9, lsl #2 | |
| ; NOSVE2BITPERM-NEXT: orr x10, x10, x12, lsr #16 | |
| ; NOSVE2BITPERM-NEXT: eor x9, x9, x9, lsl #4 | |
| ; NOSVE2BITPERM-NEXT: and x8, x10, x8 | |
| ; 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 x8, x8, x9 | |
| ; NOSVE2BITPERM-NEXT: eor x9, x10, x8 | |
| ; NOSVE2BITPERM-NEXT: orr x0, x9, x8, lsr #32 | |
| ; NOSVE2BITPERM-NEXT: ret | |
| %res = call i64 @llvm.pext.i64(i64 %val, i64 %mask) | |
| ret i64 %res | |
| } | |
| define <vscale x 16 x i8> @pext_nxv16i8(<vscale x 16 x i8> %val, <vscale x 16 x i8> %mask) nounwind { | |
| ; BITPERM-LABEL: pext_nxv16i8: | |
| ; BITPERM: // %bb.0: | |
| ; BITPERM-NEXT: bext z0.b, z0.b, z1.b | |
| ; BITPERM-NEXT: ret | |
| ; | |
| ; NOSVE2BITPERM-LABEL: pext_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: and z0.d, z0.d, z1.d | |
| ; 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: and z6.d, z0.d, z5.d | |
| ; NOSVE2BITPERM-NEXT: eor z1.d, z1.d, z5.d | |
| ; NOSVE2BITPERM-NEXT: pmul z4.b, z3.b, z2.b | |
| ; NOSVE2BITPERM-NEXT: eor z0.d, z0.d, z6.d | |
| ; NOSVE2BITPERM-NEXT: usra z1.b, z5.b, #1 | |
| ; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z4.d | |
| ; NOSVE2BITPERM-NEXT: usra z0.b, z6.b, #1 | |
| ; NOSVE2BITPERM-NEXT: and z5.d, z4.d, z1.d | |
| ; NOSVE2BITPERM-NEXT: pmul z2.b, z3.b, z2.b | |
| ; NOSVE2BITPERM-NEXT: and z6.d, z0.d, z5.d | |
| ; NOSVE2BITPERM-NEXT: eor z1.d, z1.d, z5.d | |
| ; NOSVE2BITPERM-NEXT: eor z0.d, z0.d, z6.d | |
| ; NOSVE2BITPERM-NEXT: usra z1.b, z5.b, #2 | |
| ; NOSVE2BITPERM-NEXT: usra z0.b, z6.b, #2 | |
| ; NOSVE2BITPERM-NEXT: and z1.d, z2.d, z1.d | |
| ; NOSVE2BITPERM-NEXT: and z1.d, z0.d, z1.d | |
| ; NOSVE2BITPERM-NEXT: eor z0.d, z0.d, z1.d | |
| ; NOSVE2BITPERM-NEXT: usra z0.b, z1.b, #4 | |
| ; NOSVE2BITPERM-NEXT: ret | |
| %res = call <vscale x 16 x i8> @llvm.pext.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> @pext_nxv8i16(<vscale x 8 x i16> %val, <vscale x 8 x i16> %mask) nounwind { | |
| ; BITPERM-LABEL: pext_nxv8i16: | |
| ; BITPERM: // %bb.0: | |
| ; BITPERM-NEXT: bext z0.h, z0.h, z1.h | |
| ; BITPERM-NEXT: ret | |
| ; | |
| ; NOSVE2BITPERM-LABEL: pext_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: and z0.d, z0.d, z1.d | |
| ; 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: 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: and z4.d, z6.d, z1.d | |
| ; NOSVE2BITPERM-NEXT: eor z1.d, z1.d, z4.d | |
| ; NOSVE2BITPERM-NEXT: and z5.d, z0.d, z4.d | |
| ; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z7.d | |
| ; NOSVE2BITPERM-NEXT: usra z1.h, z4.h, #1 | |
| ; NOSVE2BITPERM-NEXT: eor z0.d, z0.d, z5.d | |
| ; NOSVE2BITPERM-NEXT: trn1 z6.b, z2.b, z3.b | |
| ; NOSVE2BITPERM-NEXT: trn2 z24.b, z3.b, z2.b | |
| ; NOSVE2BITPERM-NEXT: pmullb z25.h, z3.b, z2.b | |
| ; NOSVE2BITPERM-NEXT: usra z0.h, z5.h, #1 | |
| ; NOSVE2BITPERM-NEXT: pmul z4.b, z24.b, z6.b | |
| ; NOSVE2BITPERM-NEXT: and z5.d, z7.d, z1.d | |
| ; NOSVE2BITPERM-NEXT: and z6.d, z0.d, z5.d | |
| ; NOSVE2BITPERM-NEXT: eor z1.d, z1.d, z5.d | |
| ; NOSVE2BITPERM-NEXT: eorbt z4.b, z4.b, z4.b | |
| ; NOSVE2BITPERM-NEXT: eor z0.d, z0.d, z6.d | |
| ; NOSVE2BITPERM-NEXT: usra z1.h, z5.h, #2 | |
| ; NOSVE2BITPERM-NEXT: eortb z25.b, z25.b, z4.b | |
| ; NOSVE2BITPERM-NEXT: usra z0.h, z6.h, #2 | |
| ; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z25.d | |
| ; NOSVE2BITPERM-NEXT: and z4.d, z25.d, z1.d | |
| ; NOSVE2BITPERM-NEXT: trn1 z5.b, z2.b, z3.b | |
| ; NOSVE2BITPERM-NEXT: trn2 z6.b, z3.b, z2.b | |
| ; NOSVE2BITPERM-NEXT: and z7.d, z0.d, z4.d | |
| ; NOSVE2BITPERM-NEXT: pmullb z2.h, z3.b, z2.b | |
| ; NOSVE2BITPERM-NEXT: eor z1.d, z1.d, z4.d | |
| ; NOSVE2BITPERM-NEXT: pmul z3.b, z6.b, z5.b | |
| ; NOSVE2BITPERM-NEXT: eor z0.d, z0.d, z7.d | |
| ; NOSVE2BITPERM-NEXT: usra z1.h, z4.h, #4 | |
| ; NOSVE2BITPERM-NEXT: usra z0.h, z7.h, #4 | |
| ; NOSVE2BITPERM-NEXT: eorbt z3.b, z3.b, z3.b | |
| ; NOSVE2BITPERM-NEXT: and z1.d, z0.d, z1.d | |
| ; NOSVE2BITPERM-NEXT: eortb z2.b, z2.b, z3.b | |
| ; NOSVE2BITPERM-NEXT: and z1.d, z1.d, z2.d | |
| ; NOSVE2BITPERM-NEXT: eor z0.d, z0.d, z1.d | |
| ; NOSVE2BITPERM-NEXT: usra z0.h, z1.h, #8 | |
| ; NOSVE2BITPERM-NEXT: ret | |
| %res = call <vscale x 8 x i16> @llvm.pext.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> @pext_nxv4i32(<vscale x 4 x i32> %val, <vscale x 4 x i32> %mask) nounwind { | |
| ; BITPERM-LABEL: pext_nxv4i32: | |
| ; BITPERM: // %bb.0: | |
| ; BITPERM-NEXT: bext z0.s, z0.s, z1.s | |
| ; BITPERM-NEXT: ret | |
| ; | |
| ; NOSVE2BITPERM-LABEL: pext_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: and z0.d, z0.d, z1.d | |
| ; 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 z1.d, z1.d, z4.d | |
| ; NOSVE2BITPERM-NEXT: and z24.d, z0.d, z4.d | |
| ; NOSVE2BITPERM-NEXT: pmullb z6.d, z3.s, z2.s | |
| ; NOSVE2BITPERM-NEXT: usra z1.s, z4.s, #1 | |
| ; NOSVE2BITPERM-NEXT: eor z0.d, z0.d, z24.d | |
| ; NOSVE2BITPERM-NEXT: usra z0.s, z24.s, #1 | |
| ; NOSVE2BITPERM-NEXT: trn1 z5.s, z6.s, z5.s | |
| ; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z5.d | |
| ; NOSVE2BITPERM-NEXT: and z4.d, z5.d, z1.d | |
| ; NOSVE2BITPERM-NEXT: pmullt z6.d, z3.s, z2.s | |
| ; NOSVE2BITPERM-NEXT: eor z1.d, z1.d, z4.d | |
| ; NOSVE2BITPERM-NEXT: pmullb z7.d, z3.s, z2.s | |
| ; NOSVE2BITPERM-NEXT: usra z1.s, z4.s, #2 | |
| ; NOSVE2BITPERM-NEXT: trn1 z5.s, z7.s, z6.s | |
| ; NOSVE2BITPERM-NEXT: and z6.d, z0.d, z4.d | |
| ; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z5.d | |
| ; NOSVE2BITPERM-NEXT: eor z0.d, z0.d, z6.d | |
| ; NOSVE2BITPERM-NEXT: and z5.d, z5.d, z1.d | |
| ; NOSVE2BITPERM-NEXT: pmullt z4.d, z3.s, z2.s | |
| ; NOSVE2BITPERM-NEXT: usra z0.s, z6.s, #2 | |
| ; NOSVE2BITPERM-NEXT: eor z1.d, z1.d, z5.d | |
| ; NOSVE2BITPERM-NEXT: pmullb z7.d, z3.s, z2.s | |
| ; NOSVE2BITPERM-NEXT: usra z1.s, z5.s, #4 | |
| ; NOSVE2BITPERM-NEXT: and z6.d, z0.d, z5.d | |
| ; NOSVE2BITPERM-NEXT: eor z0.d, z0.d, z6.d | |
| ; NOSVE2BITPERM-NEXT: trn1 z4.s, z7.s, z4.s | |
| ; NOSVE2BITPERM-NEXT: usra z0.s, z6.s, #4 | |
| ; NOSVE2BITPERM-NEXT: and z5.d, z4.d, z1.d | |
| ; NOSVE2BITPERM-NEXT: bic z3.d, z3.d, z4.d | |
| ; NOSVE2BITPERM-NEXT: and z4.d, z0.d, z5.d | |
| ; NOSVE2BITPERM-NEXT: pmullt z6.d, z3.s, z2.s | |
| ; NOSVE2BITPERM-NEXT: eor z1.d, z1.d, z5.d | |
| ; NOSVE2BITPERM-NEXT: pmullb z2.d, z3.s, z2.s | |
| ; NOSVE2BITPERM-NEXT: eor z0.d, z0.d, z4.d | |
| ; NOSVE2BITPERM-NEXT: usra z1.s, z5.s, #8 | |
| ; NOSVE2BITPERM-NEXT: usra z0.s, z4.s, #8 | |
| ; NOSVE2BITPERM-NEXT: trn1 z2.s, z2.s, z6.s | |
| ; NOSVE2BITPERM-NEXT: and z1.d, z0.d, z1.d | |
| ; NOSVE2BITPERM-NEXT: and z1.d, z1.d, z2.d | |
| ; NOSVE2BITPERM-NEXT: eor z0.d, z0.d, z1.d | |
| ; NOSVE2BITPERM-NEXT: usra z0.s, z1.s, #16 | |
| ; NOSVE2BITPERM-NEXT: ret | |
| %res = call <vscale x 4 x i32> @llvm.pext.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> @pext_nxv2i64(<vscale x 2 x i64> %val, <vscale x 2 x i64> %mask) nounwind { | |
| ; BITPERM-LABEL: pext_nxv2i64: | |
| ; BITPERM: // %bb.0: | |
| ; BITPERM-NEXT: bext z0.d, z0.d, z1.d | |
| ; BITPERM-NEXT: ret | |
| ; | |
| ; NOSVE2BITPERM-LABEL: pext_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: and z0.d, z0.d, z1.d | |
| ; 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 z5.d, z4.d, z3.d | |
| ; NOSVE2BITPERM-NEXT: and z3.d, z3.d, z1.d | |
| ; NOSVE2BITPERM-NEXT: trn1 z4.s, z2.s, z5.s | |
| ; NOSVE2BITPERM-NEXT: trn2 z6.s, z5.s, z2.s | |
| ; NOSVE2BITPERM-NEXT: eor z1.d, z1.d, z3.d | |
| ; NOSVE2BITPERM-NEXT: pmullt z7.d, z6.s, z4.s | |
| ; NOSVE2BITPERM-NEXT: usra z1.d, z3.d, #1 | |
| ; NOSVE2BITPERM-NEXT: pmullb z6.d, z6.s, z4.s | |
| ; NOSVE2BITPERM-NEXT: pmullb z4.d, z5.s, z2.s | |
| ; NOSVE2BITPERM-NEXT: trn1 z6.s, z6.s, z7.s | |
| ; NOSVE2BITPERM-NEXT: eorbt z6.s, z6.s, z6.s | |
| ; NOSVE2BITPERM-NEXT: eortb z4.s, z4.s, z6.s | |
| ; NOSVE2BITPERM-NEXT: bic z6.d, z5.d, z4.d | |
| ; NOSVE2BITPERM-NEXT: and z4.d, z4.d, z1.d | |
| ; NOSVE2BITPERM-NEXT: trn1 z5.s, z2.s, z6.s | |
| ; NOSVE2BITPERM-NEXT: trn2 z7.s, z6.s, z2.s | |
| ; NOSVE2BITPERM-NEXT: eor z1.d, z1.d, z4.d | |
| ; NOSVE2BITPERM-NEXT: pmullt z24.d, z7.s, z5.s | |
| ; NOSVE2BITPERM-NEXT: usra z1.d, z4.d, #2 | |
| ; NOSVE2BITPERM-NEXT: pmullb z7.d, z7.s, z5.s | |
| ; NOSVE2BITPERM-NEXT: pmullb z5.d, z6.s, z2.s | |
| ; NOSVE2BITPERM-NEXT: trn1 z7.s, z7.s, z24.s | |
| ; NOSVE2BITPERM-NEXT: eorbt z7.s, z7.s, z7.s | |
| ; NOSVE2BITPERM-NEXT: eortb z5.s, z5.s, z7.s | |
| ; NOSVE2BITPERM-NEXT: bic z7.d, z6.d, z5.d | |
| ; NOSVE2BITPERM-NEXT: and z5.d, z5.d, z1.d | |
| ; NOSVE2BITPERM-NEXT: trn1 z6.s, z2.s, z7.s | |
| ; NOSVE2BITPERM-NEXT: trn2 z24.s, z7.s, z2.s | |
| ; NOSVE2BITPERM-NEXT: eor z1.d, z1.d, z5.d | |
| ; NOSVE2BITPERM-NEXT: pmullt z25.d, z24.s, z6.s | |
| ; NOSVE2BITPERM-NEXT: usra z1.d, z5.d, #4 | |
| ; NOSVE2BITPERM-NEXT: pmullb z24.d, z24.s, z6.s | |
| ; NOSVE2BITPERM-NEXT: pmullb z6.d, z7.s, z2.s | |
| ; NOSVE2BITPERM-NEXT: trn1 z24.s, z24.s, z25.s | |
| ; NOSVE2BITPERM-NEXT: eorbt z24.s, z24.s, z24.s | |
| ; NOSVE2BITPERM-NEXT: eortb z6.s, z6.s, z24.s | |
| ; NOSVE2BITPERM-NEXT: and z24.d, z0.d, z3.d | |
| ; NOSVE2BITPERM-NEXT: eor z0.d, z0.d, z24.d | |
| ; NOSVE2BITPERM-NEXT: bic z7.d, z7.d, z6.d | |
| ; NOSVE2BITPERM-NEXT: usra z0.d, z24.d, #1 | |
| ; NOSVE2BITPERM-NEXT: trn1 z25.s, z2.s, z7.s | |
| ; NOSVE2BITPERM-NEXT: trn2 z26.s, z7.s, z2.s | |
| ; NOSVE2BITPERM-NEXT: pmullt z3.d, z26.s, z25.s | |
| ; NOSVE2BITPERM-NEXT: pmullb z24.d, z26.s, z25.s | |
| ; NOSVE2BITPERM-NEXT: and z25.d, z0.d, z4.d | |
| ; NOSVE2BITPERM-NEXT: pmullb z4.d, z7.s, z2.s | |
| ; NOSVE2BITPERM-NEXT: eor z0.d, z0.d, z25.d | |
| ; NOSVE2BITPERM-NEXT: usra z0.d, z25.d, #2 | |
| ; NOSVE2BITPERM-NEXT: trn1 z3.s, z24.s, z3.s | |
| ; NOSVE2BITPERM-NEXT: and z24.d, z0.d, z5.d | |
| ; NOSVE2BITPERM-NEXT: and z5.d, z6.d, z1.d | |
| ; NOSVE2BITPERM-NEXT: eorbt z3.s, z3.s, z3.s | |
| ; NOSVE2BITPERM-NEXT: eor z0.d, z0.d, z24.d | |
| ; NOSVE2BITPERM-NEXT: eor z1.d, z1.d, z5.d | |
| ; NOSVE2BITPERM-NEXT: eortb z4.s, z4.s, z3.s | |
| ; NOSVE2BITPERM-NEXT: usra z0.d, z24.d, #4 | |
| ; NOSVE2BITPERM-NEXT: usra z1.d, z5.d, #8 | |
| ; NOSVE2BITPERM-NEXT: bic z3.d, z7.d, z4.d | |
| ; NOSVE2BITPERM-NEXT: and z24.d, z0.d, z5.d | |
| ; NOSVE2BITPERM-NEXT: and z4.d, z4.d, z1.d | |
| ; NOSVE2BITPERM-NEXT: trn1 z6.s, z2.s, z3.s | |
| ; NOSVE2BITPERM-NEXT: trn2 z7.s, z3.s, z2.s | |
| ; NOSVE2BITPERM-NEXT: eor z0.d, z0.d, z24.d | |
| ; NOSVE2BITPERM-NEXT: pmullb z2.d, z3.s, z2.s | |
| ; NOSVE2BITPERM-NEXT: eor z1.d, z1.d, z4.d | |
| ; NOSVE2BITPERM-NEXT: pmullt z25.d, z7.s, z6.s | |
| ; NOSVE2BITPERM-NEXT: usra z0.d, z24.d, #8 | |
| ; NOSVE2BITPERM-NEXT: pmullb z6.d, z7.s, z6.s | |
| ; NOSVE2BITPERM-NEXT: usra z1.d, z4.d, #16 | |
| ; NOSVE2BITPERM-NEXT: and z3.d, z0.d, z4.d | |
| ; NOSVE2BITPERM-NEXT: eor z0.d, z0.d, z3.d | |
| ; NOSVE2BITPERM-NEXT: trn1 z5.s, z6.s, z25.s | |
| ; NOSVE2BITPERM-NEXT: usra z0.d, z3.d, #16 | |
| ; NOSVE2BITPERM-NEXT: eorbt z5.s, z5.s, z5.s | |
| ; NOSVE2BITPERM-NEXT: and z1.d, z0.d, z1.d | |
| ; NOSVE2BITPERM-NEXT: eortb z2.s, z2.s, z5.s | |
| ; NOSVE2BITPERM-NEXT: and z1.d, z1.d, z2.d | |
| ; NOSVE2BITPERM-NEXT: eor z0.d, z0.d, z1.d | |
| ; NOSVE2BITPERM-NEXT: usra z0.d, z1.d, #32 | |
| ; NOSVE2BITPERM-NEXT: ret | |
| %res = call <vscale x 2 x i64> @llvm.pext.nxv2i64(<vscale x 2 x i64> %val, <vscale x 2 x i64> %mask) | |
| ret <vscale x 2 x i64> %res | |
| } | |