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