blob: 2304a5d6f83fd27a7a2e26994e1e4c2ed9f8fa5e [file] [edit]
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
; RUN: llc --mtriple=loongarch32 --mattr=+32s,+lasx < %s | FileCheck %s
; RUN: llc --mtriple=loongarch64 --mattr=+lasx < %s | FileCheck %s
define void @xvhaddw_h_b_illegal(ptr %a, ptr %b, ptr %r) nounwind {
; CHECK-LABEL: xvhaddw_h_b_illegal:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: xvld $xr4, $a0, 0
; CHECK-NEXT: xvld $xr3, $a0, 32
; CHECK-NEXT: xvld $xr1, $a1, 0
; CHECK-NEXT: xvld $xr0, $a1, 32
; CHECK-NEXT: vpickve2gr.b $a0, $vr4, 1
; CHECK-NEXT: vinsgr2vr.b $vr2, $a0, 0
; CHECK-NEXT: vpickve2gr.b $a0, $vr4, 3
; CHECK-NEXT: vinsgr2vr.b $vr2, $a0, 1
; CHECK-NEXT: vpickve2gr.b $a0, $vr4, 5
; CHECK-NEXT: vinsgr2vr.b $vr2, $a0, 2
; CHECK-NEXT: vpickve2gr.b $a0, $vr4, 7
; CHECK-NEXT: vinsgr2vr.b $vr2, $a0, 3
; CHECK-NEXT: vpickve2gr.b $a0, $vr4, 9
; CHECK-NEXT: vinsgr2vr.b $vr2, $a0, 4
; CHECK-NEXT: vpickve2gr.b $a0, $vr4, 11
; CHECK-NEXT: vinsgr2vr.b $vr2, $a0, 5
; CHECK-NEXT: vpickve2gr.b $a0, $vr4, 13
; CHECK-NEXT: vinsgr2vr.b $vr2, $a0, 6
; CHECK-NEXT: vpickve2gr.b $a0, $vr4, 15
; CHECK-NEXT: xvpermi.d $xr4, $xr4, 14
; CHECK-NEXT: vinsgr2vr.b $vr2, $a0, 7
; CHECK-NEXT: vpickve2gr.b $a0, $vr4, 1
; CHECK-NEXT: vinsgr2vr.b $vr2, $a0, 8
; CHECK-NEXT: vpickve2gr.b $a0, $vr4, 3
; CHECK-NEXT: vinsgr2vr.b $vr2, $a0, 9
; CHECK-NEXT: vpickve2gr.b $a0, $vr4, 5
; CHECK-NEXT: vinsgr2vr.b $vr2, $a0, 10
; CHECK-NEXT: vpickve2gr.b $a0, $vr4, 7
; CHECK-NEXT: vinsgr2vr.b $vr2, $a0, 11
; CHECK-NEXT: vpickve2gr.b $a0, $vr4, 9
; CHECK-NEXT: vinsgr2vr.b $vr2, $a0, 12
; CHECK-NEXT: vpickve2gr.b $a0, $vr4, 11
; CHECK-NEXT: vinsgr2vr.b $vr2, $a0, 13
; CHECK-NEXT: vpickve2gr.b $a0, $vr4, 13
; CHECK-NEXT: vinsgr2vr.b $vr2, $a0, 14
; CHECK-NEXT: vpickve2gr.b $a0, $vr4, 15
; CHECK-NEXT: vinsgr2vr.b $vr2, $a0, 15
; CHECK-NEXT: vpickve2gr.b $a0, $vr3, 1
; CHECK-NEXT: vinsgr2vr.b $vr4, $a0, 0
; CHECK-NEXT: vpickve2gr.b $a0, $vr3, 3
; CHECK-NEXT: vinsgr2vr.b $vr4, $a0, 1
; CHECK-NEXT: vpickve2gr.b $a0, $vr3, 5
; CHECK-NEXT: vinsgr2vr.b $vr4, $a0, 2
; CHECK-NEXT: vpickve2gr.b $a0, $vr3, 7
; CHECK-NEXT: vinsgr2vr.b $vr4, $a0, 3
; CHECK-NEXT: vpickve2gr.b $a0, $vr3, 9
; CHECK-NEXT: vinsgr2vr.b $vr4, $a0, 4
; CHECK-NEXT: vpickve2gr.b $a0, $vr3, 11
; CHECK-NEXT: vinsgr2vr.b $vr4, $a0, 5
; CHECK-NEXT: vpickve2gr.b $a0, $vr3, 13
; CHECK-NEXT: vinsgr2vr.b $vr4, $a0, 6
; CHECK-NEXT: vpickve2gr.b $a0, $vr3, 15
; CHECK-NEXT: xvpermi.d $xr3, $xr3, 14
; CHECK-NEXT: vinsgr2vr.b $vr4, $a0, 7
; CHECK-NEXT: vpickve2gr.b $a0, $vr3, 1
; CHECK-NEXT: vinsgr2vr.b $vr4, $a0, 8
; CHECK-NEXT: vpickve2gr.b $a0, $vr3, 3
; CHECK-NEXT: vinsgr2vr.b $vr4, $a0, 9
; CHECK-NEXT: vpickve2gr.b $a0, $vr3, 5
; CHECK-NEXT: vinsgr2vr.b $vr4, $a0, 10
; CHECK-NEXT: vpickve2gr.b $a0, $vr3, 7
; CHECK-NEXT: vinsgr2vr.b $vr4, $a0, 11
; CHECK-NEXT: vpickve2gr.b $a0, $vr3, 9
; CHECK-NEXT: vinsgr2vr.b $vr4, $a0, 12
; CHECK-NEXT: vpickve2gr.b $a0, $vr3, 11
; CHECK-NEXT: vinsgr2vr.b $vr4, $a0, 13
; CHECK-NEXT: vpickve2gr.b $a0, $vr3, 13
; CHECK-NEXT: vinsgr2vr.b $vr4, $a0, 14
; CHECK-NEXT: vpickve2gr.b $a0, $vr3, 15
; CHECK-NEXT: vinsgr2vr.b $vr4, $a0, 15
; CHECK-NEXT: vpickve2gr.b $a0, $vr1, 0
; CHECK-NEXT: vinsgr2vr.b $vr3, $a0, 0
; CHECK-NEXT: vpickve2gr.b $a0, $vr1, 2
; CHECK-NEXT: vinsgr2vr.b $vr3, $a0, 1
; CHECK-NEXT: vpickve2gr.b $a0, $vr1, 4
; CHECK-NEXT: vinsgr2vr.b $vr3, $a0, 2
; CHECK-NEXT: vpickve2gr.b $a0, $vr1, 6
; CHECK-NEXT: vinsgr2vr.b $vr3, $a0, 3
; CHECK-NEXT: vpickve2gr.b $a0, $vr1, 8
; CHECK-NEXT: vinsgr2vr.b $vr3, $a0, 4
; CHECK-NEXT: vpickve2gr.b $a0, $vr1, 10
; CHECK-NEXT: vinsgr2vr.b $vr3, $a0, 5
; CHECK-NEXT: vpickve2gr.b $a0, $vr1, 12
; CHECK-NEXT: vinsgr2vr.b $vr3, $a0, 6
; CHECK-NEXT: vpickve2gr.b $a0, $vr1, 14
; CHECK-NEXT: xvpermi.d $xr1, $xr1, 14
; CHECK-NEXT: vinsgr2vr.b $vr3, $a0, 7
; CHECK-NEXT: vpickve2gr.b $a0, $vr1, 0
; CHECK-NEXT: vinsgr2vr.b $vr3, $a0, 8
; CHECK-NEXT: vpickve2gr.b $a0, $vr1, 2
; CHECK-NEXT: vinsgr2vr.b $vr3, $a0, 9
; CHECK-NEXT: vpickve2gr.b $a0, $vr1, 4
; CHECK-NEXT: vinsgr2vr.b $vr3, $a0, 10
; CHECK-NEXT: vpickve2gr.b $a0, $vr1, 6
; CHECK-NEXT: vinsgr2vr.b $vr3, $a0, 11
; CHECK-NEXT: vpickve2gr.b $a0, $vr1, 8
; CHECK-NEXT: vinsgr2vr.b $vr3, $a0, 12
; CHECK-NEXT: vpickve2gr.b $a0, $vr1, 10
; CHECK-NEXT: vinsgr2vr.b $vr3, $a0, 13
; CHECK-NEXT: vpickve2gr.b $a0, $vr1, 12
; CHECK-NEXT: vinsgr2vr.b $vr3, $a0, 14
; CHECK-NEXT: vpickve2gr.b $a0, $vr1, 14
; CHECK-NEXT: vinsgr2vr.b $vr3, $a0, 15
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 0
; CHECK-NEXT: vinsgr2vr.b $vr1, $a0, 0
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 2
; CHECK-NEXT: vinsgr2vr.b $vr1, $a0, 1
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 4
; CHECK-NEXT: vinsgr2vr.b $vr1, $a0, 2
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 6
; CHECK-NEXT: vinsgr2vr.b $vr1, $a0, 3
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 8
; CHECK-NEXT: vinsgr2vr.b $vr1, $a0, 4
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 10
; CHECK-NEXT: vinsgr2vr.b $vr1, $a0, 5
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 12
; CHECK-NEXT: vinsgr2vr.b $vr1, $a0, 6
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 14
; CHECK-NEXT: xvpermi.d $xr0, $xr0, 14
; CHECK-NEXT: vinsgr2vr.b $vr1, $a0, 7
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 0
; CHECK-NEXT: vinsgr2vr.b $vr1, $a0, 8
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 2
; CHECK-NEXT: vinsgr2vr.b $vr1, $a0, 9
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 4
; CHECK-NEXT: vinsgr2vr.b $vr1, $a0, 10
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 6
; CHECK-NEXT: vinsgr2vr.b $vr1, $a0, 11
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 8
; CHECK-NEXT: vinsgr2vr.b $vr1, $a0, 12
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 10
; CHECK-NEXT: vinsgr2vr.b $vr1, $a0, 13
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 12
; CHECK-NEXT: vinsgr2vr.b $vr1, $a0, 14
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 14
; CHECK-NEXT: vinsgr2vr.b $vr1, $a0, 15
; CHECK-NEXT: vext2xv.h.b $xr0, $xr2
; CHECK-NEXT: vext2xv.h.b $xr2, $xr4
; CHECK-NEXT: vext2xv.h.b $xr3, $xr3
; CHECK-NEXT: vext2xv.h.b $xr1, $xr1
; CHECK-NEXT: xvadd.h $xr1, $xr2, $xr1
; CHECK-NEXT: xvadd.h $xr0, $xr0, $xr3
; CHECK-NEXT: xvst $xr0, $a2, 0
; CHECK-NEXT: xvst $xr1, $a2, 32
; CHECK-NEXT: ret
entry:
%0 = load <64 x i8>, ptr %a
%1 = load <64 x i8>, ptr %b
%2 = shufflevector <64 x i8> %0, <64 x i8> poison,
<32 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15,
i32 17, i32 19, i32 21, i32 23, i32 25, i32 27, i32 29, i32 31,
i32 33, i32 35, i32 37, i32 39, i32 41, i32 43, i32 45, i32 47,
i32 49, i32 51, i32 53, i32 55, i32 57, i32 59, i32 61, i32 63>
%3 = shufflevector <64 x i8> %1, <64 x i8> poison,
<32 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14,
i32 16, i32 18, i32 20, i32 22, i32 24, i32 26, i32 28, i32 30,
i32 32, i32 34, i32 36, i32 38, i32 40, i32 42, i32 44, i32 46,
i32 48, i32 50, i32 52, i32 54, i32 56, i32 58, i32 60, i32 62>
%4 = sext <32 x i8> %2 to <32 x i16>
%5 = sext <32 x i8> %3 to <32 x i16>
%6 = add <32 x i16> %4, %5
store <32 x i16> %6, ptr %r
ret void
}
define void @xvhaddw_h_b(ptr %a, ptr %b, ptr %r) nounwind {
; CHECK-LABEL: xvhaddw_h_b:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: xvld $xr0, $a0, 0
; CHECK-NEXT: xvld $xr1, $a1, 0
; CHECK-NEXT: xvhaddw.h.b $xr0, $xr0, $xr1
; CHECK-NEXT: xvst $xr0, $a2, 0
; CHECK-NEXT: ret
entry:
%0 = load <32 x i8>, ptr %a
%1 = load <32 x i8>, ptr %b
%2 = shufflevector <32 x i8> %0, <32 x i8> poison,
<16 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15,
i32 17, i32 19, i32 21, i32 23, i32 25, i32 27, i32 29, i32 31>
%3 = shufflevector <32 x i8> %1, <32 x i8> poison,
<16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14,
i32 16, i32 18, i32 20, i32 22, i32 24, i32 26, i32 28, i32 30>
%4 = sext <16 x i8> %2 to <16 x i16>
%5 = sext <16 x i8> %3 to <16 x i16>
%6 = add <16 x i16> %4, %5
store <16 x i16> %6, ptr %r
ret void
}
define void @xvhaddw_w_h(ptr %a, ptr %b, ptr %r) nounwind {
; CHECK-LABEL: xvhaddw_w_h:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: xvld $xr0, $a0, 0
; CHECK-NEXT: xvld $xr1, $a1, 0
; CHECK-NEXT: xvhaddw.w.h $xr0, $xr0, $xr1
; CHECK-NEXT: xvst $xr0, $a2, 0
; CHECK-NEXT: ret
entry:
%0 = load <16 x i16>, ptr %a
%1 = load <16 x i16>, ptr %b
%2 = shufflevector <16 x i16> %0, <16 x i16> poison,
<8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>
%3 = shufflevector <16 x i16> %1, <16 x i16> poison,
<8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>
%4 = sext <8 x i16> %2 to <8 x i32>
%5 = sext <8 x i16> %3 to <8 x i32>
%6 = add <8 x i32> %4, %5
store <8 x i32> %6, ptr %r
ret void
}
define void @xvhaddw_d_w(ptr %a, ptr %b, ptr %r) nounwind {
; CHECK-LABEL: xvhaddw_d_w:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: xvld $xr0, $a0, 0
; CHECK-NEXT: xvld $xr1, $a1, 0
; CHECK-NEXT: xvhaddw.d.w $xr0, $xr0, $xr1
; CHECK-NEXT: xvst $xr0, $a2, 0
; CHECK-NEXT: ret
entry:
%0 = load <8 x i32>, ptr %a
%1 = load <8 x i32>, ptr %b
%2 = shufflevector <8 x i32> %0, <8 x i32> poison, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
%3 = shufflevector <8 x i32> %1, <8 x i32> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
%4 = sext <4 x i32> %2 to <4 x i64>
%5 = sext <4 x i32> %3 to <4 x i64>
%6 = add <4 x i64> %4, %5
store <4 x i64> %6, ptr %r
ret void
}
define void @xvhaddw_hu_bu(ptr %a, ptr %b, ptr %r) nounwind {
; CHECK-LABEL: xvhaddw_hu_bu:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: xvld $xr0, $a0, 0
; CHECK-NEXT: xvld $xr1, $a1, 0
; CHECK-NEXT: xvhaddw.hu.bu $xr0, $xr0, $xr1
; CHECK-NEXT: xvst $xr0, $a2, 0
; CHECK-NEXT: ret
entry:
%0 = load <32 x i8>, ptr %a
%1 = load <32 x i8>, ptr %b
%2 = shufflevector <32 x i8> %0, <32 x i8> poison,
<16 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15,
i32 17, i32 19, i32 21, i32 23, i32 25, i32 27, i32 29, i32 31>
%3 = shufflevector <32 x i8> %1, <32 x i8> poison,
<16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14,
i32 16, i32 18, i32 20, i32 22, i32 24, i32 26, i32 28, i32 30>
%4 = zext <16 x i8> %2 to <16 x i16>
%5 = zext <16 x i8> %3 to <16 x i16>
%6 = add <16 x i16> %4, %5
store <16 x i16> %6, ptr %r
ret void
}
define void @xvhaddw_wu_hu(ptr %a, ptr %b, ptr %r) nounwind {
; CHECK-LABEL: xvhaddw_wu_hu:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: xvld $xr0, $a0, 0
; CHECK-NEXT: xvld $xr1, $a1, 0
; CHECK-NEXT: xvhaddw.wu.hu $xr0, $xr0, $xr1
; CHECK-NEXT: xvst $xr0, $a2, 0
; CHECK-NEXT: ret
entry:
%0 = load <16 x i16>, ptr %a
%1 = load <16 x i16>, ptr %b
%2 = shufflevector <16 x i16> %0, <16 x i16> poison,
<8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>
%3 = shufflevector <16 x i16> %1, <16 x i16> poison,
<8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>
%4 = zext <8 x i16> %2 to <8 x i32>
%5 = zext <8 x i16> %3 to <8 x i32>
%6 = add <8 x i32> %4, %5
store <8 x i32> %6, ptr %r
ret void
}
define void @xvhaddw_du_wu(ptr %a, ptr %b, ptr %r) nounwind {
; CHECK-LABEL: xvhaddw_du_wu:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: xvld $xr0, $a0, 0
; CHECK-NEXT: xvld $xr1, $a1, 0
; CHECK-NEXT: xvhaddw.du.wu $xr0, $xr0, $xr1
; CHECK-NEXT: xvst $xr0, $a2, 0
; CHECK-NEXT: ret
entry:
%0 = load <8 x i32>, ptr %a
%1 = load <8 x i32>, ptr %b
%2 = shufflevector <8 x i32> %0, <8 x i32> poison, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
%3 = shufflevector <8 x i32> %1, <8 x i32> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
%4 = zext <4 x i32> %2 to <4 x i64>
%5 = zext <4 x i32> %3 to <4 x i64>
%6 = add <4 x i64> %4, %5
store <4 x i64> %6, ptr %r
ret void
}