diff --git a/llvm/test/CodeGen/LoongArch/lasx/widen-shuffle-mask.ll b/llvm/test/CodeGen/LoongArch/lasx/widen-shuffle-mask.ll new file mode 100644 index 0000000000000..c32a60622f2a1 --- /dev/null +++ b/llvm/test/CodeGen/LoongArch/lasx/widen-shuffle-mask.ll @@ -0,0 +1,137 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 +; RUN: llc --mtriple=loongarch64 --mattr=+lasx < %s | FileCheck %s + +define <32 x i8> @widen_shuffle_mask_v32i8_to_v16i16(<32 x i8> %a, <32 x i8> %b) { +; CHECK-LABEL: widen_shuffle_mask_v32i8_to_v16i16: +; CHECK: # %bb.0: +; CHECK-NEXT: pcalau12i $a0, %pc_hi20(.LCPI0_0) +; CHECK-NEXT: xvld $xr2, $a0, %pc_lo12(.LCPI0_0) +; CHECK-NEXT: xvshuf.b $xr0, $xr1, $xr0, $xr2 +; CHECK-NEXT: ret + %r = shufflevector <32 x i8> %a, <32 x i8> %b, <32 x i32> + ret <32 x i8> %r +} + +define <32 x i8> @widen_shuffle_mask_v32i8_to_v8i32(<32 x i8> %a, <32 x i8> %b) { +; CHECK-LABEL: widen_shuffle_mask_v32i8_to_v8i32: +; CHECK: # %bb.0: +; CHECK-NEXT: pcalau12i $a0, %pc_hi20(.LCPI1_0) +; CHECK-NEXT: xvld $xr2, $a0, %pc_lo12(.LCPI1_0) +; CHECK-NEXT: xvshuf.b $xr0, $xr1, $xr0, $xr2 +; CHECK-NEXT: ret + %r = shufflevector <32 x i8> %a, <32 x i8> %b, <32 x i32> + ret <32 x i8> %r +} + +define <32 x i8> @widen_shuffle_mask_v32i8_to_v4i64(<32 x i8> %a, <32 x i8> %b) { +; CHECK-LABEL: widen_shuffle_mask_v32i8_to_v4i64: +; CHECK: # %bb.0: +; CHECK-NEXT: pcalau12i $a0, %pc_hi20(.LCPI2_0) +; CHECK-NEXT: xvld $xr2, $a0, %pc_lo12(.LCPI2_0) +; CHECK-NEXT: xvshuf.b $xr0, $xr1, $xr0, $xr2 +; CHECK-NEXT: ret + %r = shufflevector <32 x i8> %a, <32 x i8> %b, <32 x i32> + ret <32 x i8> %r +} + +define <16 x i16> @widen_shuffle_mask_v16i16_to_v8i32(<16 x i16> %a, <16 x i16> %b) { +; CHECK-LABEL: widen_shuffle_mask_v16i16_to_v8i32: +; CHECK: # %bb.0: +; CHECK-NEXT: pcalau12i $a0, %pc_hi20(.LCPI3_0) +; CHECK-NEXT: xvld $xr2, $a0, %pc_lo12(.LCPI3_0) +; CHECK-NEXT: xvshuf.h $xr2, $xr1, $xr0 +; CHECK-NEXT: xvori.b $xr0, $xr2, 0 +; CHECK-NEXT: ret + %r = shufflevector <16 x i16> %a, <16 x i16> %b, <16 x i32> + ret <16 x i16> %r +} + +define <16 x i16> @widen_shuffle_mask_v16i16_to_v4i64(<16 x i16> %a, <16 x i16> %b) { +; CHECK-LABEL: widen_shuffle_mask_v16i16_to_v4i64: +; CHECK: # %bb.0: +; CHECK-NEXT: pcalau12i $a0, %pc_hi20(.LCPI4_0) +; CHECK-NEXT: xvld $xr2, $a0, %pc_lo12(.LCPI4_0) +; CHECK-NEXT: xvshuf.h $xr2, $xr1, $xr0 +; CHECK-NEXT: xvori.b $xr0, $xr2, 0 +; CHECK-NEXT: ret + %r = shufflevector <16 x i16> %a, <16 x i16> %b, <16 x i32> + ret <16 x i16> %r +} + +define <8 x i32> @widen_shuffle_mask_v8i32_to_v4i64(<8 x i32> %a, <8 x i32> %b) { +; CHECK-LABEL: widen_shuffle_mask_v8i32_to_v4i64: +; CHECK: # %bb.0: +; CHECK-NEXT: pcalau12i $a0, %pc_hi20(.LCPI5_0) +; CHECK-NEXT: xvld $xr2, $a0, %pc_lo12(.LCPI5_0) +; CHECK-NEXT: xvshuf.w $xr2, $xr1, $xr0 +; CHECK-NEXT: xvori.b $xr0, $xr2, 0 +; CHECK-NEXT: ret + %r = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> + ret <8 x i32> %r +} + +define <32 x i8> @widen_shuffle_mask_v32i8_to_xvpackev_h(<32 x i8> %a, <32 x i8> %b) { +; CHECK-LABEL: widen_shuffle_mask_v32i8_to_xvpackev_h: +; CHECK: # %bb.0: +; CHECK-NEXT: pcalau12i $a0, %pc_hi20(.LCPI6_0) +; CHECK-NEXT: xvld $xr2, $a0, %pc_lo12(.LCPI6_0) +; CHECK-NEXT: xvshuf.b $xr0, $xr1, $xr0, $xr2 +; CHECK-NEXT: ret + %r = shufflevector <32 x i8> %a, <32 x i8> %b, <32 x i32> + ret <32 x i8> %r +} + +define <32 x i8> @widen_shuffle_mask_v32i8_to_xvpackod_h(<32 x i8> %a, <32 x i8> %b) { +; CHECK-LABEL: widen_shuffle_mask_v32i8_to_xvpackod_h: +; CHECK: # %bb.0: +; CHECK-NEXT: pcalau12i $a0, %pc_hi20(.LCPI7_0) +; CHECK-NEXT: xvld $xr2, $a0, %pc_lo12(.LCPI7_0) +; CHECK-NEXT: xvshuf.b $xr0, $xr1, $xr0, $xr2 +; CHECK-NEXT: ret + %r = shufflevector <32 x i8> %a, <32 x i8> %b, <32 x i32> + ret <32 x i8> %r +} + +define <32 x i8> @widen_shuffle_mask_v32i8_to_xvpickev_h(<32 x i8> %a, <32 x i8> %b) { +; CHECK-LABEL: widen_shuffle_mask_v32i8_to_xvpickev_h: +; CHECK: # %bb.0: +; CHECK-NEXT: pcalau12i $a0, %pc_hi20(.LCPI8_0) +; CHECK-NEXT: xvld $xr2, $a0, %pc_lo12(.LCPI8_0) +; CHECK-NEXT: xvshuf.b $xr0, $xr1, $xr0, $xr2 +; CHECK-NEXT: ret + %r = shufflevector <32 x i8> %a, <32 x i8> %b, <32 x i32> + ret <32 x i8> %r +} + +define <32 x i8> @widen_shuffle_mask_v32i8_to_xvpickod_h(<32 x i8> %a, <32 x i8> %b) { +; CHECK-LABEL: widen_shuffle_mask_v32i8_to_xvpickod_h: +; CHECK: # %bb.0: +; CHECK-NEXT: pcalau12i $a0, %pc_hi20(.LCPI9_0) +; CHECK-NEXT: xvld $xr2, $a0, %pc_lo12(.LCPI9_0) +; CHECK-NEXT: xvshuf.b $xr0, $xr1, $xr0, $xr2 +; CHECK-NEXT: ret + %r = shufflevector <32 x i8> %a, <32 x i8> %b, <32 x i32> + ret <32 x i8> %r +} + +define <32 x i8> @widen_shuffle_mask_v32i8_to_xvilvl_h(<32 x i8> %a, <32 x i8> %b) { +; CHECK-LABEL: widen_shuffle_mask_v32i8_to_xvilvl_h: +; CHECK: # %bb.0: +; CHECK-NEXT: pcalau12i $a0, %pc_hi20(.LCPI10_0) +; CHECK-NEXT: xvld $xr2, $a0, %pc_lo12(.LCPI10_0) +; CHECK-NEXT: xvshuf.b $xr0, $xr1, $xr0, $xr2 +; CHECK-NEXT: ret + %r = shufflevector <32 x i8> %a, <32 x i8> %b, <32 x i32> + ret <32 x i8> %r +} + +define <32 x i8> @widen_shuffle_mask_v32i8_to_xvilvh_h(<32 x i8> %a, <32 x i8> %b) { +; CHECK-LABEL: widen_shuffle_mask_v32i8_to_xvilvh_h: +; CHECK: # %bb.0: +; CHECK-NEXT: pcalau12i $a0, %pc_hi20(.LCPI11_0) +; CHECK-NEXT: xvld $xr2, $a0, %pc_lo12(.LCPI11_0) +; CHECK-NEXT: xvshuf.b $xr0, $xr1, $xr0, $xr2 +; CHECK-NEXT: ret + %r = shufflevector <32 x i8> %a, <32 x i8> %b, <32 x i32> + ret <32 x i8> %r +} diff --git a/llvm/test/CodeGen/LoongArch/lsx/widen-shuffle-mask.ll b/llvm/test/CodeGen/LoongArch/lsx/widen-shuffle-mask.ll new file mode 100644 index 0000000000000..35457ffa59586 --- /dev/null +++ b/llvm/test/CodeGen/LoongArch/lsx/widen-shuffle-mask.ll @@ -0,0 +1,137 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 +; RUN: llc --mtriple=loongarch64 --mattr=+lsx < %s | FileCheck %s + +define <16 x i8> @widen_shuffle_mask_v16i8_to_v8i16(<16 x i8> %a, <16 x i8> %b) { +; CHECK-LABEL: widen_shuffle_mask_v16i8_to_v8i16: +; CHECK: # %bb.0: +; CHECK-NEXT: pcalau12i $a0, %pc_hi20(.LCPI0_0) +; CHECK-NEXT: vld $vr2, $a0, %pc_lo12(.LCPI0_0) +; CHECK-NEXT: vshuf.b $vr0, $vr1, $vr0, $vr2 +; CHECK-NEXT: ret + %r = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> + ret <16 x i8> %r +} + +define <16 x i8> @widen_shuffle_mask_v16i8_to_v4i32(<16 x i8> %a, <16 x i8> %b) { +; CHECK-LABEL: widen_shuffle_mask_v16i8_to_v4i32: +; CHECK: # %bb.0: +; CHECK-NEXT: pcalau12i $a0, %pc_hi20(.LCPI1_0) +; CHECK-NEXT: vld $vr2, $a0, %pc_lo12(.LCPI1_0) +; CHECK-NEXT: vshuf.b $vr0, $vr1, $vr0, $vr2 +; CHECK-NEXT: ret + %r = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> + ret <16 x i8> %r +} + +define <16 x i8> @widen_shuffle_mask_v16i8_to_v2i64(<16 x i8> %a, <16 x i8> %b) { +; CHECK-LABEL: widen_shuffle_mask_v16i8_to_v2i64: +; CHECK: # %bb.0: +; CHECK-NEXT: pcalau12i $a0, %pc_hi20(.LCPI2_0) +; CHECK-NEXT: vld $vr2, $a0, %pc_lo12(.LCPI2_0) +; CHECK-NEXT: vshuf.b $vr0, $vr1, $vr0, $vr2 +; CHECK-NEXT: ret + %r = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> + ret <16 x i8> %r +} + +define <8 x i16> @widen_shuffle_mask_v8i16_to_v4i32(<8 x i16> %a, <8 x i16> %b) { +; CHECK-LABEL: widen_shuffle_mask_v8i16_to_v4i32: +; CHECK: # %bb.0: +; CHECK-NEXT: pcalau12i $a0, %pc_hi20(.LCPI3_0) +; CHECK-NEXT: vld $vr2, $a0, %pc_lo12(.LCPI3_0) +; CHECK-NEXT: vshuf.h $vr2, $vr1, $vr0 +; CHECK-NEXT: vori.b $vr0, $vr2, 0 +; CHECK-NEXT: ret + %r = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> + ret <8 x i16> %r +} + +define <8 x i16> @widen_shuffle_mask_v8i16_to_v2i64(<8 x i16> %a, <8 x i16> %b) { +; CHECK-LABEL: widen_shuffle_mask_v8i16_to_v2i64: +; CHECK: # %bb.0: +; CHECK-NEXT: pcalau12i $a0, %pc_hi20(.LCPI4_0) +; CHECK-NEXT: vld $vr2, $a0, %pc_lo12(.LCPI4_0) +; CHECK-NEXT: vshuf.h $vr2, $vr1, $vr0 +; CHECK-NEXT: vori.b $vr0, $vr2, 0 +; CHECK-NEXT: ret + %r = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> + ret <8 x i16> %r +} + +define <4 x i32> @widen_shuffle_mask_v4i32_to_v2i64(<4 x i32> %a, <4 x i32> %b) { +; CHECK-LABEL: widen_shuffle_mask_v4i32_to_v2i64: +; CHECK: # %bb.0: +; CHECK-NEXT: pcalau12i $a0, %pc_hi20(.LCPI5_0) +; CHECK-NEXT: vld $vr2, $a0, %pc_lo12(.LCPI5_0) +; CHECK-NEXT: vshuf.w $vr2, $vr1, $vr0 +; CHECK-NEXT: vori.b $vr0, $vr2, 0 +; CHECK-NEXT: ret + %r = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> + ret <4 x i32> %r +} + +define <16 x i8> @widen_shuffle_mask_v16i8_to_vpackev_h(<16 x i8> %a, <16 x i8> %b) { +; CHECK-LABEL: widen_shuffle_mask_v16i8_to_vpackev_h: +; CHECK: # %bb.0: +; CHECK-NEXT: pcalau12i $a0, %pc_hi20(.LCPI6_0) +; CHECK-NEXT: vld $vr2, $a0, %pc_lo12(.LCPI6_0) +; CHECK-NEXT: vshuf.b $vr0, $vr1, $vr0, $vr2 +; CHECK-NEXT: ret + %r = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> + ret <16 x i8> %r +} + +define <16 x i8> @widen_shuffle_mask_v16i8_to_vpackod_h(<16 x i8> %a, <16 x i8> %b) { +; CHECK-LABEL: widen_shuffle_mask_v16i8_to_vpackod_h: +; CHECK: # %bb.0: +; CHECK-NEXT: pcalau12i $a0, %pc_hi20(.LCPI7_0) +; CHECK-NEXT: vld $vr2, $a0, %pc_lo12(.LCPI7_0) +; CHECK-NEXT: vshuf.b $vr0, $vr1, $vr0, $vr2 +; CHECK-NEXT: ret + %r = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> + ret <16 x i8> %r +} + +define <16 x i8> @widen_shuffle_mask_v16i8_to_vpickev_h(<16 x i8> %a, <16 x i8> %b) { +; CHECK-LABEL: widen_shuffle_mask_v16i8_to_vpickev_h: +; CHECK: # %bb.0: +; CHECK-NEXT: pcalau12i $a0, %pc_hi20(.LCPI8_0) +; CHECK-NEXT: vld $vr2, $a0, %pc_lo12(.LCPI8_0) +; CHECK-NEXT: vshuf.b $vr0, $vr1, $vr0, $vr2 +; CHECK-NEXT: ret + %r = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> + ret <16 x i8> %r +} + +define <16 x i8> @widen_shuffle_mask_v16i8_to_vpickod_h(<16 x i8> %a, <16 x i8> %b) { +; CHECK-LABEL: widen_shuffle_mask_v16i8_to_vpickod_h: +; CHECK: # %bb.0: +; CHECK-NEXT: pcalau12i $a0, %pc_hi20(.LCPI9_0) +; CHECK-NEXT: vld $vr2, $a0, %pc_lo12(.LCPI9_0) +; CHECK-NEXT: vshuf.b $vr0, $vr1, $vr0, $vr2 +; CHECK-NEXT: ret + %r = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> + ret <16 x i8> %r +} + +define <16 x i8> @widen_shuffle_mask_v16i8_to_vilvl_h(<16 x i8> %a, <16 x i8> %b) { +; CHECK-LABEL: widen_shuffle_mask_v16i8_to_vilvl_h: +; CHECK: # %bb.0: +; CHECK-NEXT: pcalau12i $a0, %pc_hi20(.LCPI10_0) +; CHECK-NEXT: vld $vr2, $a0, %pc_lo12(.LCPI10_0) +; CHECK-NEXT: vshuf.b $vr0, $vr1, $vr0, $vr2 +; CHECK-NEXT: ret + %r = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> + ret <16 x i8> %r +} + +define <16 x i8> @widen_shuffle_mask_v16i8_to_vilvh_h(<16 x i8> %a, <16 x i8> %b) { +; CHECK-LABEL: widen_shuffle_mask_v16i8_to_vilvh_h: +; CHECK: # %bb.0: +; CHECK-NEXT: pcalau12i $a0, %pc_hi20(.LCPI11_0) +; CHECK-NEXT: vld $vr2, $a0, %pc_lo12(.LCPI11_0) +; CHECK-NEXT: vshuf.b $vr0, $vr1, $vr0, $vr2 +; CHECK-NEXT: ret + %r = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> + ret <16 x i8> %r +}