1b7245612Swanglei; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3 2b7245612Swanglei; RUN: llc --mtriple=loongarch64 --mattr=+lsx < %s | FileCheck %s 3b7245612Swanglei 4b7245612Swangleidefine void @extract_16xi8(ptr %src, ptr %dst) nounwind { 5b7245612Swanglei; CHECK-LABEL: extract_16xi8: 6b7245612Swanglei; CHECK: # %bb.0: 7b7245612Swanglei; CHECK-NEXT: vld $vr0, $a0, 0 8b7245612Swanglei; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 1 9b7245612Swanglei; CHECK-NEXT: st.b $a0, $a1, 0 10b7245612Swanglei; CHECK-NEXT: ret 11b7245612Swanglei %v = load volatile <16 x i8>, ptr %src 12b7245612Swanglei %e = extractelement <16 x i8> %v, i32 1 13b7245612Swanglei store i8 %e, ptr %dst 14b7245612Swanglei ret void 15b7245612Swanglei} 16b7245612Swanglei 17b7245612Swangleidefine void @extract_8xi16(ptr %src, ptr %dst) nounwind { 18b7245612Swanglei; CHECK-LABEL: extract_8xi16: 19b7245612Swanglei; CHECK: # %bb.0: 20b7245612Swanglei; CHECK-NEXT: vld $vr0, $a0, 0 21b7245612Swanglei; CHECK-NEXT: vpickve2gr.h $a0, $vr0, 1 22b7245612Swanglei; CHECK-NEXT: st.h $a0, $a1, 0 23b7245612Swanglei; CHECK-NEXT: ret 24b7245612Swanglei %v = load volatile <8 x i16>, ptr %src 25b7245612Swanglei %e = extractelement <8 x i16> %v, i32 1 26b7245612Swanglei store i16 %e, ptr %dst 27b7245612Swanglei ret void 28b7245612Swanglei} 29b7245612Swanglei 30b7245612Swangleidefine void @extract_4xi32(ptr %src, ptr %dst) nounwind { 31b7245612Swanglei; CHECK-LABEL: extract_4xi32: 32b7245612Swanglei; CHECK: # %bb.0: 33b7245612Swanglei; CHECK-NEXT: vld $vr0, $a0, 0 34b7245612Swanglei; CHECK-NEXT: vpickve2gr.w $a0, $vr0, 1 35b7245612Swanglei; CHECK-NEXT: st.w $a0, $a1, 0 36b7245612Swanglei; CHECK-NEXT: ret 37b7245612Swanglei %v = load volatile <4 x i32>, ptr %src 38b7245612Swanglei %e = extractelement <4 x i32> %v, i32 1 39b7245612Swanglei store i32 %e, ptr %dst 40b7245612Swanglei ret void 41b7245612Swanglei} 42b7245612Swanglei 43b7245612Swangleidefine void @extract_2xi64(ptr %src, ptr %dst) nounwind { 44b7245612Swanglei; CHECK-LABEL: extract_2xi64: 45b7245612Swanglei; CHECK: # %bb.0: 46b7245612Swanglei; CHECK-NEXT: vld $vr0, $a0, 0 47b7245612Swanglei; CHECK-NEXT: vpickve2gr.d $a0, $vr0, 1 48b7245612Swanglei; CHECK-NEXT: st.d $a0, $a1, 0 49b7245612Swanglei; CHECK-NEXT: ret 50b7245612Swanglei %v = load volatile <2 x i64>, ptr %src 51b7245612Swanglei %e = extractelement <2 x i64> %v, i32 1 52b7245612Swanglei store i64 %e, ptr %dst 53b7245612Swanglei ret void 54b7245612Swanglei} 55b7245612Swanglei 56b7245612Swangleidefine void @extract_4xfloat(ptr %src, ptr %dst) nounwind { 57b7245612Swanglei; CHECK-LABEL: extract_4xfloat: 58b7245612Swanglei; CHECK: # %bb.0: 59b7245612Swanglei; CHECK-NEXT: vld $vr0, $a0, 0 60b7245612Swanglei; CHECK-NEXT: vreplvei.w $vr0, $vr0, 1 61b7245612Swanglei; CHECK-NEXT: fst.s $fa0, $a1, 0 62b7245612Swanglei; CHECK-NEXT: ret 63b7245612Swanglei %v = load volatile <4 x float>, ptr %src 64b7245612Swanglei %e = extractelement <4 x float> %v, i32 1 65b7245612Swanglei store float %e, ptr %dst 66b7245612Swanglei ret void 67b7245612Swanglei} 68b7245612Swanglei 69b7245612Swangleidefine void @extract_2xdouble(ptr %src, ptr %dst) nounwind { 70b7245612Swanglei; CHECK-LABEL: extract_2xdouble: 71b7245612Swanglei; CHECK: # %bb.0: 72b7245612Swanglei; CHECK-NEXT: vld $vr0, $a0, 0 73b7245612Swanglei; CHECK-NEXT: vreplvei.d $vr0, $vr0, 1 74b7245612Swanglei; CHECK-NEXT: fst.d $fa0, $a1, 0 75b7245612Swanglei; CHECK-NEXT: ret 76b7245612Swanglei %v = load volatile <2 x double>, ptr %src 77b7245612Swanglei %e = extractelement <2 x double> %v, i32 1 78b7245612Swanglei store double %e, ptr %dst 79b7245612Swanglei ret void 80b7245612Swanglei} 81b7245612Swanglei 82b7245612Swangleidefine void @extract_16xi8_idx(ptr %src, ptr %dst, i32 %idx) nounwind { 83b7245612Swanglei; CHECK-LABEL: extract_16xi8_idx: 84b7245612Swanglei; CHECK: # %bb.0: 85b7245612Swanglei; CHECK-NEXT: vld $vr0, $a0, 0 86*a5c90e48Swanglei; CHECK-NEXT: bstrpick.d $a0, $a2, 31, 0 87*a5c90e48Swanglei; CHECK-NEXT: vreplve.b $vr0, $vr0, $a0 88b7245612Swanglei; CHECK-NEXT: movfr2gr.s $a0, $fa0 89b7245612Swanglei; CHECK-NEXT: srai.w $a0, $a0, 24 90b7245612Swanglei; CHECK-NEXT: st.b $a0, $a1, 0 91b7245612Swanglei; CHECK-NEXT: ret 92b7245612Swanglei %v = load volatile <16 x i8>, ptr %src 93b7245612Swanglei %e = extractelement <16 x i8> %v, i32 %idx 94b7245612Swanglei store i8 %e, ptr %dst 95b7245612Swanglei ret void 96b7245612Swanglei} 97b7245612Swanglei 98b7245612Swangleidefine void @extract_8xi16_idx(ptr %src, ptr %dst, i32 %idx) nounwind { 99b7245612Swanglei; CHECK-LABEL: extract_8xi16_idx: 100b7245612Swanglei; CHECK: # %bb.0: 101b7245612Swanglei; CHECK-NEXT: vld $vr0, $a0, 0 102*a5c90e48Swanglei; CHECK-NEXT: bstrpick.d $a0, $a2, 31, 0 103*a5c90e48Swanglei; CHECK-NEXT: vreplve.h $vr0, $vr0, $a0 104b7245612Swanglei; CHECK-NEXT: movfr2gr.s $a0, $fa0 105b7245612Swanglei; CHECK-NEXT: srai.w $a0, $a0, 16 106b7245612Swanglei; CHECK-NEXT: st.h $a0, $a1, 0 107b7245612Swanglei; CHECK-NEXT: ret 108b7245612Swanglei %v = load volatile <8 x i16>, ptr %src 109b7245612Swanglei %e = extractelement <8 x i16> %v, i32 %idx 110b7245612Swanglei store i16 %e, ptr %dst 111b7245612Swanglei ret void 112b7245612Swanglei} 113b7245612Swanglei 114b7245612Swangleidefine void @extract_4xi32_idx(ptr %src, ptr %dst, i32 %idx) nounwind { 115b7245612Swanglei; CHECK-LABEL: extract_4xi32_idx: 116b7245612Swanglei; CHECK: # %bb.0: 117b7245612Swanglei; CHECK-NEXT: vld $vr0, $a0, 0 118*a5c90e48Swanglei; CHECK-NEXT: bstrpick.d $a0, $a2, 31, 0 119*a5c90e48Swanglei; CHECK-NEXT: vreplve.w $vr0, $vr0, $a0 120b7245612Swanglei; CHECK-NEXT: movfr2gr.s $a0, $fa0 121b7245612Swanglei; CHECK-NEXT: st.w $a0, $a1, 0 122b7245612Swanglei; CHECK-NEXT: ret 123b7245612Swanglei %v = load volatile <4 x i32>, ptr %src 124b7245612Swanglei %e = extractelement <4 x i32> %v, i32 %idx 125b7245612Swanglei store i32 %e, ptr %dst 126b7245612Swanglei ret void 127b7245612Swanglei} 128b7245612Swanglei 129b7245612Swangleidefine void @extract_2xi64_idx(ptr %src, ptr %dst, i32 %idx) nounwind { 130b7245612Swanglei; CHECK-LABEL: extract_2xi64_idx: 131b7245612Swanglei; CHECK: # %bb.0: 132b7245612Swanglei; CHECK-NEXT: vld $vr0, $a0, 0 133*a5c90e48Swanglei; CHECK-NEXT: bstrpick.d $a0, $a2, 31, 0 134*a5c90e48Swanglei; CHECK-NEXT: vreplve.d $vr0, $vr0, $a0 135b7245612Swanglei; CHECK-NEXT: movfr2gr.d $a0, $fa0 136b7245612Swanglei; CHECK-NEXT: st.d $a0, $a1, 0 137b7245612Swanglei; CHECK-NEXT: ret 138b7245612Swanglei %v = load volatile <2 x i64>, ptr %src 139b7245612Swanglei %e = extractelement <2 x i64> %v, i32 %idx 140b7245612Swanglei store i64 %e, ptr %dst 141b7245612Swanglei ret void 142b7245612Swanglei} 143b7245612Swanglei 144b7245612Swangleidefine void @extract_4xfloat_idx(ptr %src, ptr %dst, i32 %idx) nounwind { 145b7245612Swanglei; CHECK-LABEL: extract_4xfloat_idx: 146b7245612Swanglei; CHECK: # %bb.0: 147b7245612Swanglei; CHECK-NEXT: vld $vr0, $a0, 0 148*a5c90e48Swanglei; CHECK-NEXT: bstrpick.d $a0, $a2, 31, 0 149*a5c90e48Swanglei; CHECK-NEXT: vreplve.w $vr0, $vr0, $a0 150b7245612Swanglei; CHECK-NEXT: fst.s $fa0, $a1, 0 151b7245612Swanglei; CHECK-NEXT: ret 152b7245612Swanglei %v = load volatile <4 x float>, ptr %src 153b7245612Swanglei %e = extractelement <4 x float> %v, i32 %idx 154b7245612Swanglei store float %e, ptr %dst 155b7245612Swanglei ret void 156b7245612Swanglei} 157b7245612Swanglei 158b7245612Swangleidefine void @extract_2xdouble_idx(ptr %src, ptr %dst, i32 %idx) nounwind { 159b7245612Swanglei; CHECK-LABEL: extract_2xdouble_idx: 160b7245612Swanglei; CHECK: # %bb.0: 161b7245612Swanglei; CHECK-NEXT: vld $vr0, $a0, 0 162*a5c90e48Swanglei; CHECK-NEXT: bstrpick.d $a0, $a2, 31, 0 163*a5c90e48Swanglei; CHECK-NEXT: vreplve.d $vr0, $vr0, $a0 164b7245612Swanglei; CHECK-NEXT: fst.d $fa0, $a1, 0 165b7245612Swanglei; CHECK-NEXT: ret 166b7245612Swanglei %v = load volatile <2 x double>, ptr %src 167b7245612Swanglei %e = extractelement <2 x double> %v, i32 %idx 168b7245612Swanglei store double %e, ptr %dst 169b7245612Swanglei ret void 170b7245612Swanglei} 171