| 
 | 1 | +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6  | 
 | 2 | +; RUN: llc --mtriple=loongarch32 --mattr=+32s,+lasx < %s | FileCheck %s  | 
 | 3 | +; RUN: llc --mtriple=loongarch64 --mattr=+lasx %s -o - | FileCheck %s  | 
 | 4 | + | 
 | 5 | +define void @shufflevector_reverse_v32i8(ptr %res, ptr %a) nounwind {  | 
 | 6 | +; CHECK-LABEL: shufflevector_reverse_v32i8:  | 
 | 7 | +; CHECK:       # %bb.0: # %entry  | 
 | 8 | +; CHECK-NEXT:    xvld $xr0, $a1, 0  | 
 | 9 | +; CHECK-NEXT:    pcalau12i $a1, %pc_hi20(.LCPI0_0)  | 
 | 10 | +; CHECK-NEXT:    xvld $xr1, $a1, %pc_lo12(.LCPI0_0)  | 
 | 11 | +; CHECK-NEXT:    xvpermi.d $xr0, $xr0, 78  | 
 | 12 | +; CHECK-NEXT:    xvshuf.b $xr0, $xr0, $xr0, $xr1  | 
 | 13 | +; CHECK-NEXT:    xvst $xr0, $a0, 0  | 
 | 14 | +; CHECK-NEXT:    ret  | 
 | 15 | +entry:  | 
 | 16 | +  %va = load <32 x i8>, ptr %a  | 
 | 17 | +  %b = shufflevector <32 x i8> %va, <32 x i8> poison, <32 x i32> <i32 31, i32 30, i32 29, i32 28, i32 27, i32 26, i32 25, i32 24, i32 23, i32 22, i32 21, i32 20, i32 19, i32 18, i32 17, i32 16, i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>  | 
 | 18 | +  store <32 x i8> %b, ptr %res  | 
 | 19 | +  ret void  | 
 | 20 | +}  | 
 | 21 | + | 
 | 22 | +define void @shufflevector_reverse_v16i16(ptr %res, ptr %a) nounwind {  | 
 | 23 | +; CHECK-LABEL: shufflevector_reverse_v16i16:  | 
 | 24 | +; CHECK:       # %bb.0: # %entry  | 
 | 25 | +; CHECK-NEXT:    xvld $xr0, $a1, 0  | 
 | 26 | +; CHECK-NEXT:    pcalau12i $a1, %pc_hi20(.LCPI1_0)  | 
 | 27 | +; CHECK-NEXT:    xvld $xr1, $a1, %pc_lo12(.LCPI1_0)  | 
 | 28 | +; CHECK-NEXT:    xvpermi.d $xr0, $xr0, 78  | 
 | 29 | +; CHECK-NEXT:    xvshuf.h $xr1, $xr0, $xr0  | 
 | 30 | +; CHECK-NEXT:    xvst $xr1, $a0, 0  | 
 | 31 | +; CHECK-NEXT:    ret  | 
 | 32 | +entry:  | 
 | 33 | +  %va = load <16 x i16>, ptr %a  | 
 | 34 | +  %b = shufflevector <16 x i16> %va, <16 x i16> poison, <16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>  | 
 | 35 | +  store <16 x i16> %b, ptr %res  | 
 | 36 | +  ret void  | 
 | 37 | +}  | 
 | 38 | + | 
 | 39 | +define void @shufflevector_reverse_v8i32(ptr %res, ptr %a) nounwind {  | 
 | 40 | +; CHECK-LABEL: shufflevector_reverse_v8i32:  | 
 | 41 | +; CHECK:       # %bb.0: # %entry  | 
 | 42 | +; CHECK-NEXT:    xvld $xr0, $a1, 0  | 
 | 43 | +; CHECK-NEXT:    xvpermi.d $xr0, $xr0, 78  | 
 | 44 | +; CHECK-NEXT:    xvshuf4i.w $xr0, $xr0, 27  | 
 | 45 | +; CHECK-NEXT:    xvst $xr0, $a0, 0  | 
 | 46 | +; CHECK-NEXT:    ret  | 
 | 47 | +entry:  | 
 | 48 | +  %va = load <8 x i32>, ptr %a  | 
 | 49 | +  %b = shufflevector <8 x i32> %va, <8 x i32> poison, <8 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>  | 
 | 50 | +  store <8 x i32> %b, ptr %res  | 
 | 51 | +  ret void  | 
 | 52 | +}  | 
 | 53 | + | 
 | 54 | +define void @shufflevector_reverse_v4i64(ptr %res, ptr %a) nounwind {  | 
 | 55 | +; CHECK-LABEL: shufflevector_reverse_v4i64:  | 
 | 56 | +; CHECK:       # %bb.0: # %entry  | 
 | 57 | +; CHECK-NEXT:    xvld $xr0, $a1, 0  | 
 | 58 | +; CHECK-NEXT:    xvpermi.d $xr0, $xr0, 27  | 
 | 59 | +; CHECK-NEXT:    xvst $xr0, $a0, 0  | 
 | 60 | +; CHECK-NEXT:    ret  | 
 | 61 | +entry:  | 
 | 62 | +  %va = load <4 x i64>, ptr %a  | 
 | 63 | +  %b = shufflevector <4 x i64> %va, <4 x i64> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>  | 
 | 64 | +  store <4 x i64> %b, ptr %res  | 
 | 65 | +  ret void  | 
 | 66 | +}  | 
 | 67 | + | 
 | 68 | +define void @shufflevector_reverse_v8f32(ptr %res, ptr %a) nounwind {  | 
 | 69 | +; CHECK-LABEL: shufflevector_reverse_v8f32:  | 
 | 70 | +; CHECK:       # %bb.0: # %entry  | 
 | 71 | +; CHECK-NEXT:    xvld $xr0, $a1, 0  | 
 | 72 | +; CHECK-NEXT:    xvpermi.d $xr0, $xr0, 78  | 
 | 73 | +; CHECK-NEXT:    xvshuf4i.w $xr0, $xr0, 27  | 
 | 74 | +; CHECK-NEXT:    xvst $xr0, $a0, 0  | 
 | 75 | +; CHECK-NEXT:    ret  | 
 | 76 | +entry:  | 
 | 77 | +  %va = load <8 x float>, ptr %a  | 
 | 78 | +  %b = shufflevector <8 x float> %va, <8 x float> poison, <8 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>  | 
 | 79 | +  store <8 x float> %b, ptr %res  | 
 | 80 | +  ret void  | 
 | 81 | +}  | 
 | 82 | + | 
 | 83 | +define void @shufflevector_reverse_v4f64(ptr %res, ptr %a) nounwind {  | 
 | 84 | +; CHECK-LABEL: shufflevector_reverse_v4f64:  | 
 | 85 | +; CHECK:       # %bb.0: # %entry  | 
 | 86 | +; CHECK-NEXT:    xvld $xr0, $a1, 0  | 
 | 87 | +; CHECK-NEXT:    xvpermi.d $xr0, $xr0, 27  | 
 | 88 | +; CHECK-NEXT:    xvst $xr0, $a0, 0  | 
 | 89 | +; CHECK-NEXT:    ret  | 
 | 90 | +entry:  | 
 | 91 | +  %va = load <4 x double>, ptr %a  | 
 | 92 | +  %b = shufflevector <4 x double> %va, <4 x double> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>  | 
 | 93 | +  store <4 x double> %b, ptr %res  | 
 | 94 | +  ret void  | 
 | 95 | +}  | 
0 commit comments