; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 ; RUN: llc --mtriple=loongarch64 --mattr=-lsx < %s | FileCheck %s --check-prefix=NOLSX ; RUN: llc --mtriple=loongarch64 --mattr=+lsx < %s | FileCheck %s --check-prefix=LSX ;; ceilf define float @ceil_f32(float %i) nounwind { ; NOLSX-LABEL: ceil_f32: ; NOLSX: # %bb.0: # %entry ; NOLSX-NEXT: pcaddu18i $t8, %call36(ceilf) ; NOLSX-NEXT: jr $t8 ; ; LSX-LABEL: ceil_f32: ; LSX: # %bb.0: # %entry ; LSX-NEXT: # kill: def $f0 killed $f0 def $vr0 ; LSX-NEXT: vreplvei.w $vr0, $vr0, 0 ; LSX-NEXT: vfrintrp.s $vr0, $vr0 ; LSX-NEXT: # kill: def $f0 killed $f0 killed $vr0 ; LSX-NEXT: ret entry: %0 = call float @llvm.ceil.f32(float %i) ret float %0 } ;; ceil define double @ceil_f64(double %i) nounwind { ; NOLSX-LABEL: ceil_f64: ; NOLSX: # %bb.0: # %entry ; NOLSX-NEXT: pcaddu18i $t8, %call36(ceil) ; NOLSX-NEXT: jr $t8 ; ; LSX-LABEL: ceil_f64: ; LSX: # %bb.0: # %entry ; LSX-NEXT: # kill: def $f0_64 killed $f0_64 def $vr0 ; LSX-NEXT: vreplvei.d $vr0, $vr0, 0 ; LSX-NEXT: vfrintrp.d $vr0, $vr0 ; LSX-NEXT: # kill: def $f0_64 killed $f0_64 killed $vr0 ; LSX-NEXT: ret entry: %0 = call double @llvm.ceil.f64(double %i) ret double %0 } ;; floorf define float @floor_f32(float %i) nounwind { ; NOLSX-LABEL: floor_f32: ; NOLSX: # %bb.0: # %entry ; NOLSX-NEXT: pcaddu18i $t8, %call36(floorf) ; NOLSX-NEXT: jr $t8 ; ; LSX-LABEL: floor_f32: ; LSX: # %bb.0: # %entry ; LSX-NEXT: # kill: def $f0 killed $f0 def $vr0 ; LSX-NEXT: vreplvei.w $vr0, $vr0, 0 ; LSX-NEXT: vfrintrm.s $vr0, $vr0 ; LSX-NEXT: # kill: def $f0 killed $f0 killed $vr0 ; LSX-NEXT: ret entry: %0 = call float @llvm.floor.f32(float %i) ret float %0 } ;; floor define double @floor_f64(double %i) nounwind { ; NOLSX-LABEL: floor_f64: ; NOLSX: # %bb.0: # %entry ; NOLSX-NEXT: pcaddu18i $t8, %call36(floor) ; NOLSX-NEXT: jr $t8 ; ; LSX-LABEL: floor_f64: ; LSX: # %bb.0: # %entry ; LSX-NEXT: # kill: def $f0_64 killed $f0_64 def $vr0 ; LSX-NEXT: vreplvei.d $vr0, $vr0, 0 ; LSX-NEXT: vfrintrm.d $vr0, $vr0 ; LSX-NEXT: # kill: def $f0_64 killed $f0_64 killed $vr0 ; LSX-NEXT: ret entry: %0 = call double @llvm.floor.f64(double %i) ret double %0 } ;; truncf define float @trunc_f32(float %i) nounwind { ; NOLSX-LABEL: trunc_f32: ; NOLSX: # %bb.0: # %entry ; NOLSX-NEXT: pcaddu18i $t8, %call36(truncf) ; NOLSX-NEXT: jr $t8 ; ; LSX-LABEL: trunc_f32: ; LSX: # %bb.0: # %entry ; LSX-NEXT: # kill: def $f0 killed $f0 def $vr0 ; LSX-NEXT: vreplvei.w $vr0, $vr0, 0 ; LSX-NEXT: vfrintrz.s $vr0, $vr0 ; LSX-NEXT: # kill: def $f0 killed $f0 killed $vr0 ; LSX-NEXT: ret entry: %0 = call float @llvm.trunc.f32(float %i) ret float %0 } ;; trunc define double @trunc_f64(double %i) nounwind { ; NOLSX-LABEL: trunc_f64: ; NOLSX: # %bb.0: # %entry ; NOLSX-NEXT: pcaddu18i $t8, %call36(trunc) ; NOLSX-NEXT: jr $t8 ; ; LSX-LABEL: trunc_f64: ; LSX: # %bb.0: # %entry ; LSX-NEXT: # kill: def $f0_64 killed $f0_64 def $vr0 ; LSX-NEXT: vreplvei.d $vr0, $vr0, 0 ; LSX-NEXT: vfrintrz.d $vr0, $vr0 ; LSX-NEXT: # kill: def $f0_64 killed $f0_64 killed $vr0 ; LSX-NEXT: ret entry: %0 = call double @llvm.trunc.f64(double %i) ret double %0 } ;; roundevenf define float @roundeven_f32(float %i) nounwind { ; NOLSX-LABEL: roundeven_f32: ; NOLSX: # %bb.0: # %entry ; NOLSX-NEXT: pcaddu18i $t8, %call36(roundevenf) ; NOLSX-NEXT: jr $t8 ; ; LSX-LABEL: roundeven_f32: ; LSX: # %bb.0: # %entry ; LSX-NEXT: # kill: def $f0 killed $f0 def $vr0 ; LSX-NEXT: vreplvei.w $vr0, $vr0, 0 ; LSX-NEXT: vfrintrne.s $vr0, $vr0 ; LSX-NEXT: # kill: def $f0 killed $f0 killed $vr0 ; LSX-NEXT: ret entry: %0 = call float @llvm.roundeven.f32(float %i) ret float %0 } ;; roundeven define double @roundeven_f64(double %i) nounwind { ; NOLSX-LABEL: roundeven_f64: ; NOLSX: # %bb.0: # %entry ; NOLSX-NEXT: pcaddu18i $t8, %call36(roundeven) ; NOLSX-NEXT: jr $t8 ; ; LSX-LABEL: roundeven_f64: ; LSX: # %bb.0: # %entry ; LSX-NEXT: # kill: def $f0_64 killed $f0_64 def $vr0 ; LSX-NEXT: vreplvei.d $vr0, $vr0, 0 ; LSX-NEXT: vfrintrne.d $vr0, $vr0 ; LSX-NEXT: # kill: def $f0_64 killed $f0_64 killed $vr0 ; LSX-NEXT: ret entry: %0 = call double @llvm.roundeven.f64(double %i) ret double %0 } declare float @llvm.ceil.f32(float) declare double @llvm.ceil.f64(double) declare float @llvm.floor.f32(float) declare double @llvm.floor.f64(double) declare float @llvm.trunc.f32(float) declare double @llvm.trunc.f64(double) declare float @llvm.roundeven.f32(float) declare double @llvm.roundeven.f64(double)