1b7245612Swanglei; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3 2b7245612Swanglei; RUN: llc --mtriple=loongarch64 --mattr=+lasx < %s | FileCheck %s 3b7245612Swanglei 4b7245612Swangleidefine void @extract_32xi8(ptr %src, ptr %dst) nounwind { 5b7245612Swanglei; CHECK-LABEL: extract_32xi8: 6b7245612Swanglei; CHECK: # %bb.0: 7b7245612Swanglei; CHECK-NEXT: xvld $xr0, $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 <32 x i8>, ptr %src 12b7245612Swanglei %e = extractelement <32 x i8> %v, i32 1 13b7245612Swanglei store i8 %e, ptr %dst 14b7245612Swanglei ret void 15b7245612Swanglei} 16b7245612Swanglei 17b7245612Swangleidefine void @extract_16xi16(ptr %src, ptr %dst) nounwind { 18b7245612Swanglei; CHECK-LABEL: extract_16xi16: 19b7245612Swanglei; CHECK: # %bb.0: 20b7245612Swanglei; CHECK-NEXT: xvld $xr0, $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 <16 x i16>, ptr %src 25b7245612Swanglei %e = extractelement <16 x i16> %v, i32 1 26b7245612Swanglei store i16 %e, ptr %dst 27b7245612Swanglei ret void 28b7245612Swanglei} 29b7245612Swanglei 30b7245612Swangleidefine void @extract_8xi32(ptr %src, ptr %dst) nounwind { 31b7245612Swanglei; CHECK-LABEL: extract_8xi32: 32b7245612Swanglei; CHECK: # %bb.0: 33b7245612Swanglei; CHECK-NEXT: xvld $xr0, $a0, 0 34*47c88bcdSwanglei; CHECK-NEXT: xvpickve2gr.w $a0, $xr0, 1 35b7245612Swanglei; CHECK-NEXT: st.w $a0, $a1, 0 36b7245612Swanglei; CHECK-NEXT: ret 37b7245612Swanglei %v = load volatile <8 x i32>, ptr %src 38b7245612Swanglei %e = extractelement <8 x i32> %v, i32 1 39b7245612Swanglei store i32 %e, ptr %dst 40b7245612Swanglei ret void 41b7245612Swanglei} 42b7245612Swanglei 43b7245612Swangleidefine void @extract_4xi64(ptr %src, ptr %dst) nounwind { 44b7245612Swanglei; CHECK-LABEL: extract_4xi64: 45b7245612Swanglei; CHECK: # %bb.0: 46b7245612Swanglei; CHECK-NEXT: xvld $xr0, $a0, 0 47*47c88bcdSwanglei; CHECK-NEXT: xvpickve2gr.d $a0, $xr0, 1 48b7245612Swanglei; CHECK-NEXT: st.d $a0, $a1, 0 49b7245612Swanglei; CHECK-NEXT: ret 50b7245612Swanglei %v = load volatile <4 x i64>, ptr %src 51b7245612Swanglei %e = extractelement <4 x i64> %v, i32 1 52b7245612Swanglei store i64 %e, ptr %dst 53b7245612Swanglei ret void 54b7245612Swanglei} 55b7245612Swanglei 56b7245612Swangleidefine void @extract_8xfloat(ptr %src, ptr %dst) nounwind { 57b7245612Swanglei; CHECK-LABEL: extract_8xfloat: 58b7245612Swanglei; CHECK: # %bb.0: 59b7245612Swanglei; CHECK-NEXT: xvld $xr0, $a0, 0 60*47c88bcdSwanglei; CHECK-NEXT: xvpickve2gr.w $a0, $xr0, 7 61*47c88bcdSwanglei; CHECK-NEXT: movgr2fr.w $fa0, $a0 62b7245612Swanglei; CHECK-NEXT: fst.s $fa0, $a1, 0 63b7245612Swanglei; CHECK-NEXT: ret 64b7245612Swanglei %v = load volatile <8 x float>, ptr %src 65b7245612Swanglei %e = extractelement <8 x float> %v, i32 7 66b7245612Swanglei store float %e, ptr %dst 67b7245612Swanglei ret void 68b7245612Swanglei} 69b7245612Swanglei 70b7245612Swangleidefine void @extract_4xdouble(ptr %src, ptr %dst) nounwind { 71b7245612Swanglei; CHECK-LABEL: extract_4xdouble: 72b7245612Swanglei; CHECK: # %bb.0: 73b7245612Swanglei; CHECK-NEXT: xvld $xr0, $a0, 0 74*47c88bcdSwanglei; CHECK-NEXT: xvpickve2gr.d $a0, $xr0, 3 75*47c88bcdSwanglei; CHECK-NEXT: movgr2fr.d $fa0, $a0 76b7245612Swanglei; CHECK-NEXT: fst.d $fa0, $a1, 0 77b7245612Swanglei; CHECK-NEXT: ret 78b7245612Swanglei %v = load volatile <4 x double>, ptr %src 79b7245612Swanglei %e = extractelement <4 x double> %v, i32 3 80b7245612Swanglei store double %e, ptr %dst 81b7245612Swanglei ret void 82b7245612Swanglei} 83b7245612Swanglei 84b7245612Swangleidefine void @extract_32xi8_idx(ptr %src, ptr %dst, i32 %idx) nounwind { 85b7245612Swanglei; CHECK-LABEL: extract_32xi8_idx: 86b7245612Swanglei; CHECK: # %bb.0: 87*47c88bcdSwanglei; CHECK-NEXT: addi.d $sp, $sp, -64 88*47c88bcdSwanglei; CHECK-NEXT: st.d $ra, $sp, 56 # 8-byte Folded Spill 89*47c88bcdSwanglei; CHECK-NEXT: st.d $fp, $sp, 48 # 8-byte Folded Spill 90*47c88bcdSwanglei; CHECK-NEXT: addi.d $fp, $sp, 64 91*47c88bcdSwanglei; CHECK-NEXT: bstrins.d $sp, $zero, 4, 0 92b7245612Swanglei; CHECK-NEXT: xvld $xr0, $a0, 0 93*47c88bcdSwanglei; CHECK-NEXT: xvst $xr0, $sp, 0 94*47c88bcdSwanglei; CHECK-NEXT: addi.d $a0, $sp, 0 95*47c88bcdSwanglei; CHECK-NEXT: bstrins.d $a0, $a2, 4, 0 96*47c88bcdSwanglei; CHECK-NEXT: ld.b $a0, $a0, 0 97b7245612Swanglei; CHECK-NEXT: st.b $a0, $a1, 0 98*47c88bcdSwanglei; CHECK-NEXT: addi.d $sp, $fp, -64 99*47c88bcdSwanglei; CHECK-NEXT: ld.d $fp, $sp, 48 # 8-byte Folded Reload 100*47c88bcdSwanglei; CHECK-NEXT: ld.d $ra, $sp, 56 # 8-byte Folded Reload 101*47c88bcdSwanglei; CHECK-NEXT: addi.d $sp, $sp, 64 102b7245612Swanglei; CHECK-NEXT: ret 103b7245612Swanglei %v = load volatile <32 x i8>, ptr %src 104b7245612Swanglei %e = extractelement <32 x i8> %v, i32 %idx 105b7245612Swanglei store i8 %e, ptr %dst 106b7245612Swanglei ret void 107b7245612Swanglei} 108b7245612Swanglei 109b7245612Swangleidefine void @extract_16xi16_idx(ptr %src, ptr %dst, i32 %idx) nounwind { 110b7245612Swanglei; CHECK-LABEL: extract_16xi16_idx: 111b7245612Swanglei; CHECK: # %bb.0: 112*47c88bcdSwanglei; CHECK-NEXT: addi.d $sp, $sp, -64 113*47c88bcdSwanglei; CHECK-NEXT: st.d $ra, $sp, 56 # 8-byte Folded Spill 114*47c88bcdSwanglei; CHECK-NEXT: st.d $fp, $sp, 48 # 8-byte Folded Spill 115*47c88bcdSwanglei; CHECK-NEXT: addi.d $fp, $sp, 64 116*47c88bcdSwanglei; CHECK-NEXT: bstrins.d $sp, $zero, 4, 0 117b7245612Swanglei; CHECK-NEXT: xvld $xr0, $a0, 0 118*47c88bcdSwanglei; CHECK-NEXT: xvst $xr0, $sp, 0 119*47c88bcdSwanglei; CHECK-NEXT: addi.d $a0, $sp, 0 120*47c88bcdSwanglei; CHECK-NEXT: bstrins.d $a0, $a2, 4, 1 121*47c88bcdSwanglei; CHECK-NEXT: ld.h $a0, $a0, 0 122b7245612Swanglei; CHECK-NEXT: st.h $a0, $a1, 0 123*47c88bcdSwanglei; CHECK-NEXT: addi.d $sp, $fp, -64 124*47c88bcdSwanglei; CHECK-NEXT: ld.d $fp, $sp, 48 # 8-byte Folded Reload 125*47c88bcdSwanglei; CHECK-NEXT: ld.d $ra, $sp, 56 # 8-byte Folded Reload 126*47c88bcdSwanglei; CHECK-NEXT: addi.d $sp, $sp, 64 127b7245612Swanglei; CHECK-NEXT: ret 128b7245612Swanglei %v = load volatile <16 x i16>, ptr %src 129b7245612Swanglei %e = extractelement <16 x i16> %v, i32 %idx 130b7245612Swanglei store i16 %e, ptr %dst 131b7245612Swanglei ret void 132b7245612Swanglei} 133b7245612Swanglei 134b7245612Swangleidefine void @extract_8xi32_idx(ptr %src, ptr %dst, i32 %idx) nounwind { 135b7245612Swanglei; CHECK-LABEL: extract_8xi32_idx: 136b7245612Swanglei; CHECK: # %bb.0: 137*47c88bcdSwanglei; CHECK-NEXT: addi.d $sp, $sp, -64 138*47c88bcdSwanglei; CHECK-NEXT: st.d $ra, $sp, 56 # 8-byte Folded Spill 139*47c88bcdSwanglei; CHECK-NEXT: st.d $fp, $sp, 48 # 8-byte Folded Spill 140*47c88bcdSwanglei; CHECK-NEXT: addi.d $fp, $sp, 64 141*47c88bcdSwanglei; CHECK-NEXT: bstrins.d $sp, $zero, 4, 0 142b7245612Swanglei; CHECK-NEXT: xvld $xr0, $a0, 0 143*47c88bcdSwanglei; CHECK-NEXT: xvst $xr0, $sp, 0 144*47c88bcdSwanglei; CHECK-NEXT: addi.d $a0, $sp, 0 145*47c88bcdSwanglei; CHECK-NEXT: bstrins.d $a0, $a2, 4, 2 146*47c88bcdSwanglei; CHECK-NEXT: ld.w $a0, $a0, 0 147b7245612Swanglei; CHECK-NEXT: st.w $a0, $a1, 0 148*47c88bcdSwanglei; CHECK-NEXT: addi.d $sp, $fp, -64 149*47c88bcdSwanglei; CHECK-NEXT: ld.d $fp, $sp, 48 # 8-byte Folded Reload 150*47c88bcdSwanglei; CHECK-NEXT: ld.d $ra, $sp, 56 # 8-byte Folded Reload 151*47c88bcdSwanglei; CHECK-NEXT: addi.d $sp, $sp, 64 152b7245612Swanglei; CHECK-NEXT: ret 153b7245612Swanglei %v = load volatile <8 x i32>, ptr %src 154b7245612Swanglei %e = extractelement <8 x i32> %v, i32 %idx 155b7245612Swanglei store i32 %e, ptr %dst 156b7245612Swanglei ret void 157b7245612Swanglei} 158b7245612Swanglei 159b7245612Swangleidefine void @extract_4xi64_idx(ptr %src, ptr %dst, i32 %idx) nounwind { 160b7245612Swanglei; CHECK-LABEL: extract_4xi64_idx: 161b7245612Swanglei; CHECK: # %bb.0: 162*47c88bcdSwanglei; CHECK-NEXT: addi.d $sp, $sp, -64 163*47c88bcdSwanglei; CHECK-NEXT: st.d $ra, $sp, 56 # 8-byte Folded Spill 164*47c88bcdSwanglei; CHECK-NEXT: st.d $fp, $sp, 48 # 8-byte Folded Spill 165*47c88bcdSwanglei; CHECK-NEXT: addi.d $fp, $sp, 64 166*47c88bcdSwanglei; CHECK-NEXT: bstrins.d $sp, $zero, 4, 0 167b7245612Swanglei; CHECK-NEXT: xvld $xr0, $a0, 0 168*47c88bcdSwanglei; CHECK-NEXT: xvst $xr0, $sp, 0 169*47c88bcdSwanglei; CHECK-NEXT: addi.d $a0, $sp, 0 170*47c88bcdSwanglei; CHECK-NEXT: bstrins.d $a0, $a2, 4, 3 171*47c88bcdSwanglei; CHECK-NEXT: ld.d $a0, $a0, 0 172b7245612Swanglei; CHECK-NEXT: st.d $a0, $a1, 0 173*47c88bcdSwanglei; CHECK-NEXT: addi.d $sp, $fp, -64 174*47c88bcdSwanglei; CHECK-NEXT: ld.d $fp, $sp, 48 # 8-byte Folded Reload 175*47c88bcdSwanglei; CHECK-NEXT: ld.d $ra, $sp, 56 # 8-byte Folded Reload 176*47c88bcdSwanglei; CHECK-NEXT: addi.d $sp, $sp, 64 177b7245612Swanglei; CHECK-NEXT: ret 178b7245612Swanglei %v = load volatile <4 x i64>, ptr %src 179b7245612Swanglei %e = extractelement <4 x i64> %v, i32 %idx 180b7245612Swanglei store i64 %e, ptr %dst 181b7245612Swanglei ret void 182b7245612Swanglei} 183b7245612Swanglei 184b7245612Swangleidefine void @extract_8xfloat_idx(ptr %src, ptr %dst, i32 %idx) nounwind { 185b7245612Swanglei; CHECK-LABEL: extract_8xfloat_idx: 186b7245612Swanglei; CHECK: # %bb.0: 187*47c88bcdSwanglei; CHECK-NEXT: addi.d $sp, $sp, -64 188*47c88bcdSwanglei; CHECK-NEXT: st.d $ra, $sp, 56 # 8-byte Folded Spill 189*47c88bcdSwanglei; CHECK-NEXT: st.d $fp, $sp, 48 # 8-byte Folded Spill 190*47c88bcdSwanglei; CHECK-NEXT: addi.d $fp, $sp, 64 191*47c88bcdSwanglei; CHECK-NEXT: bstrins.d $sp, $zero, 4, 0 192b7245612Swanglei; CHECK-NEXT: xvld $xr0, $a0, 0 193*47c88bcdSwanglei; CHECK-NEXT: xvst $xr0, $sp, 0 194*47c88bcdSwanglei; CHECK-NEXT: addi.d $a0, $sp, 0 195*47c88bcdSwanglei; CHECK-NEXT: bstrins.d $a0, $a2, 4, 2 196*47c88bcdSwanglei; CHECK-NEXT: fld.s $fa0, $a0, 0 197b7245612Swanglei; CHECK-NEXT: fst.s $fa0, $a1, 0 198*47c88bcdSwanglei; CHECK-NEXT: addi.d $sp, $fp, -64 199*47c88bcdSwanglei; CHECK-NEXT: ld.d $fp, $sp, 48 # 8-byte Folded Reload 200*47c88bcdSwanglei; CHECK-NEXT: ld.d $ra, $sp, 56 # 8-byte Folded Reload 201*47c88bcdSwanglei; CHECK-NEXT: addi.d $sp, $sp, 64 202b7245612Swanglei; CHECK-NEXT: ret 203b7245612Swanglei %v = load volatile <8 x float>, ptr %src 204b7245612Swanglei %e = extractelement <8 x float> %v, i32 %idx 205b7245612Swanglei store float %e, ptr %dst 206b7245612Swanglei ret void 207b7245612Swanglei} 208b7245612Swanglei 209b7245612Swangleidefine void @extract_4xdouble_idx(ptr %src, ptr %dst, i32 %idx) nounwind { 210b7245612Swanglei; CHECK-LABEL: extract_4xdouble_idx: 211b7245612Swanglei; CHECK: # %bb.0: 212*47c88bcdSwanglei; CHECK-NEXT: addi.d $sp, $sp, -64 213*47c88bcdSwanglei; CHECK-NEXT: st.d $ra, $sp, 56 # 8-byte Folded Spill 214*47c88bcdSwanglei; CHECK-NEXT: st.d $fp, $sp, 48 # 8-byte Folded Spill 215*47c88bcdSwanglei; CHECK-NEXT: addi.d $fp, $sp, 64 216*47c88bcdSwanglei; CHECK-NEXT: bstrins.d $sp, $zero, 4, 0 217b7245612Swanglei; CHECK-NEXT: xvld $xr0, $a0, 0 218*47c88bcdSwanglei; CHECK-NEXT: xvst $xr0, $sp, 0 219*47c88bcdSwanglei; CHECK-NEXT: addi.d $a0, $sp, 0 220*47c88bcdSwanglei; CHECK-NEXT: bstrins.d $a0, $a2, 4, 3 221*47c88bcdSwanglei; CHECK-NEXT: fld.d $fa0, $a0, 0 222b7245612Swanglei; CHECK-NEXT: fst.d $fa0, $a1, 0 223*47c88bcdSwanglei; CHECK-NEXT: addi.d $sp, $fp, -64 224*47c88bcdSwanglei; CHECK-NEXT: ld.d $fp, $sp, 48 # 8-byte Folded Reload 225*47c88bcdSwanglei; CHECK-NEXT: ld.d $ra, $sp, 56 # 8-byte Folded Reload 226*47c88bcdSwanglei; CHECK-NEXT: addi.d $sp, $sp, 64 227b7245612Swanglei; CHECK-NEXT: ret 228b7245612Swanglei %v = load volatile <4 x double>, ptr %src 229b7245612Swanglei %e = extractelement <4 x double> %v, i32 %idx 230b7245612Swanglei store double %e, ptr %dst 231b7245612Swanglei ret void 232b7245612Swanglei} 233