; 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 ; RUN: llc --mtriple=loongarch64 --mattr=+lasx < %s | FileCheck %s --check-prefixes=CHECK ;; fptrunc define void @fptrunc_v4f64_to_v4f32(ptr %res, ptr %a0) nounwind { ; CHECK-LABEL: fptrunc_v4f64_to_v4f32: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: xvld $xr0, $a1, 0 ; CHECK-NEXT: xvpermi.q $xr1, $xr0, 1 ; CHECK-NEXT: vfcvt.s.d $vr0, $vr1, $vr0 ; CHECK-NEXT: vst $vr0, $a0, 0 ; CHECK-NEXT: ret entry: %v0 = load <4 x double>, ptr %a0 %trunc = fptrunc <4 x double> %v0 to <4 x float> store <4 x float> %trunc, ptr %res ret void } define void @fptrunc_v8f64_to_v8f32(ptr %res, ptr %a0) nounwind { ; CHECK-LABEL: fptrunc_v8f64_to_v8f32: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: xvld $xr0, $a1, 0 ; CHECK-NEXT: xvld $xr1, $a1, 32 ; CHECK-NEXT: xvfcvt.s.d $xr0, $xr1, $xr0 ; CHECK-NEXT: xvpermi.d $xr0, $xr0, 216 ; CHECK-NEXT: xvst $xr0, $a0, 0 ; CHECK-NEXT: ret entry: %v0 = load <8 x double>, ptr %a0 %trunc = fptrunc <8 x double> %v0 to <8 x float> store <8 x float> %trunc, ptr %res ret void } define void @fptrunc_concat_bitcast(ptr %res, ptr %a0) nounwind { ; CHECK-LABEL: fptrunc_concat_bitcast: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: xvld $xr0, $a1, 0 ; CHECK-NEXT: xvld $xr1, $a1, 32 ; CHECK-NEXT: xvfcvt.s.d $xr0, $xr1, $xr0 ; CHECK-NEXT: xvpermi.d $xr0, $xr0, 216 ; CHECK-NEXT: xvst $xr0, $a0, 0 ; CHECK-NEXT: ret entry: %x = load <8 x double>, ptr %a0 ; split to 2 x <4 x double> %lo = shufflevector <8 x double> %x, <8 x double> poison, <4 x i32> %hi = shufflevector <8 x double> %x, <8 x double> poison, <4 x i32> %r0 = fptrunc <4 x double> %lo to <4 x float> %r1 = fptrunc <4 x double> %hi to <4 x float> %i0 = bitcast <4 x float> %r0 to <2 x i64> %i1 = bitcast <4 x float> %r1 to <2 x i64> ; concat as integer vector %cat = shufflevector <2 x i64> %i0, <2 x i64> %i1, <4 x i32> store <4 x i64> %cat, ptr %res ret void }