; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6 ; RUN: llc --mtriple=loongarch32 --mattr=+32s,+lasx < %s | FileCheck %s --check-prefixes=CHECK,LA32 ; RUN: llc --mtriple=loongarch64 --mattr=+lasx < %s | FileCheck %s --check-prefixes=CHECK,LA64 define i8 @extractelt_add_v32i8(ptr %p) { ; CHECK-LABEL: extractelt_add_v32i8: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: xvld $xr0, $a0, 0 ; CHECK-NEXT: xvaddi.bu $xr0, $xr0, 13 ; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 2 ; CHECK-NEXT: ret entry: %x = load <32 x i8>, ptr %p %add = add <32 x i8> %x, %ext = extractelement <32 x i8> %add, i32 2 ret i8 %ext } define i16 @extractelt_add_v16i16(ptr %p) { ; CHECK-LABEL: extractelt_add_v16i16: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: xvld $xr0, $a0, 0 ; CHECK-NEXT: xvaddi.hu $xr0, $xr0, 13 ; CHECK-NEXT: vpickve2gr.h $a0, $vr0, 2 ; CHECK-NEXT: ret entry: %x = load <16 x i16>, ptr %p %add = add <16 x i16> %x, %ext = extractelement <16 x i16> %add, i32 2 ret i16 %ext } define i32 @extractelt_add_v8i32(ptr %p) { ; LA32-LABEL: extractelt_add_v8i32: ; LA32: # %bb.0: # %entry ; LA32-NEXT: ld.w $a0, $a0, 8 ; LA32-NEXT: addi.w $a0, $a0, 13 ; LA32-NEXT: ret ; ; LA64-LABEL: extractelt_add_v8i32: ; LA64: # %bb.0: # %entry ; LA64-NEXT: xvld $xr0, $a0, 0 ; LA64-NEXT: xvaddi.wu $xr0, $xr0, 13 ; LA64-NEXT: xvpickve2gr.w $a0, $xr0, 2 ; LA64-NEXT: ret entry: %x = load <8 x i32>, ptr %p %add = add <8 x i32> %x, %ext = extractelement <8 x i32> %add, i32 2 ret i32 %ext } define i64 @extractelt_add_v4i64(ptr %p) { ; LA32-LABEL: extractelt_add_v4i64: ; LA32: # %bb.0: # %entry ; LA32-NEXT: xvld $xr0, $a0, 0 ; LA32-NEXT: xvaddi.du $xr0, $xr0, 12 ; LA32-NEXT: xvpickve2gr.w $a0, $xr0, 2 ; LA32-NEXT: xvpickve2gr.w $a1, $xr0, 3 ; LA32-NEXT: ret ; ; LA64-LABEL: extractelt_add_v4i64: ; LA64: # %bb.0: # %entry ; LA64-NEXT: ld.d $a0, $a0, 8 ; LA64-NEXT: addi.d $a0, $a0, 12 ; LA64-NEXT: ret entry: %x = load <4 x i64>, ptr %p %add = add <4 x i64> %x, %ext = extractelement <4 x i64> %add, i32 1 ret i64 %ext } define float @extractelt_fadd_v8f32(ptr %p) { ; CHECK-LABEL: extractelt_fadd_v8f32: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: fld.s $fa0, $a0, 8 ; CHECK-NEXT: vldi $vr1, -1238 ; CHECK-NEXT: fadd.s $fa0, $fa0, $fa1 ; CHECK-NEXT: ret entry: %x = load <8 x float>, ptr %p %add = fadd <8 x float> %x, %ext = extractelement <8 x float> %add, i32 2 ret float %ext } define double @extractelt_fadd_v4f64(ptr %p) { ; CHECK-LABEL: extractelt_fadd_v4f64: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: fld.d $fa0, $a0, 8 ; CHECK-NEXT: vldi $vr1, -984 ; CHECK-NEXT: fadd.d $fa0, $fa0, $fa1 ; CHECK-NEXT: ret entry: %x = load <4 x double>, ptr %p %add = fadd <4 x double> %x, %ext = extractelement <4 x double> %add, i32 1 ret double %ext }