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