1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 2; RUN: llc --mtriple=loongarch64 --mattr=-lsx < %s | FileCheck %s --check-prefix=NOLSX 3; RUN: llc --mtriple=loongarch64 --mattr=+lsx < %s | FileCheck %s --check-prefix=LSX 4 5;; ceilf 6define float @ceil_f32(float %i) nounwind { 7; NOLSX-LABEL: ceil_f32: 8; NOLSX: # %bb.0: # %entry 9; NOLSX-NEXT: b %plt(ceilf) 10; 11; LSX-LABEL: ceil_f32: 12; LSX: # %bb.0: # %entry 13; LSX-NEXT: # kill: def $f0 killed $f0 def $vr0 14; LSX-NEXT: vreplvei.w $vr0, $vr0, 0 15; LSX-NEXT: vfrintrp.s $vr0, $vr0 16; LSX-NEXT: # kill: def $f0 killed $f0 killed $vr0 17; LSX-NEXT: ret 18entry: 19 %0 = call float @llvm.ceil.f32(float %i) 20 ret float %0 21} 22 23;; ceil 24define double @ceil_f64(double %i) nounwind { 25; NOLSX-LABEL: ceil_f64: 26; NOLSX: # %bb.0: # %entry 27; NOLSX-NEXT: b %plt(ceil) 28; 29; LSX-LABEL: ceil_f64: 30; LSX: # %bb.0: # %entry 31; LSX-NEXT: # kill: def $f0_64 killed $f0_64 def $vr0 32; LSX-NEXT: vreplvei.d $vr0, $vr0, 0 33; LSX-NEXT: vfrintrp.d $vr0, $vr0 34; LSX-NEXT: # kill: def $f0_64 killed $f0_64 killed $vr0 35; LSX-NEXT: ret 36entry: 37 %0 = call double @llvm.ceil.f64(double %i) 38 ret double %0 39} 40 41;; floorf 42define float @floor_f32(float %i) nounwind { 43; NOLSX-LABEL: floor_f32: 44; NOLSX: # %bb.0: # %entry 45; NOLSX-NEXT: b %plt(floorf) 46; 47; LSX-LABEL: floor_f32: 48; LSX: # %bb.0: # %entry 49; LSX-NEXT: # kill: def $f0 killed $f0 def $vr0 50; LSX-NEXT: vreplvei.w $vr0, $vr0, 0 51; LSX-NEXT: vfrintrm.s $vr0, $vr0 52; LSX-NEXT: # kill: def $f0 killed $f0 killed $vr0 53; LSX-NEXT: ret 54entry: 55 %0 = call float @llvm.floor.f32(float %i) 56 ret float %0 57} 58 59;; floor 60define double @floor_f64(double %i) nounwind { 61; NOLSX-LABEL: floor_f64: 62; NOLSX: # %bb.0: # %entry 63; NOLSX-NEXT: b %plt(floor) 64; 65; LSX-LABEL: floor_f64: 66; LSX: # %bb.0: # %entry 67; LSX-NEXT: # kill: def $f0_64 killed $f0_64 def $vr0 68; LSX-NEXT: vreplvei.d $vr0, $vr0, 0 69; LSX-NEXT: vfrintrm.d $vr0, $vr0 70; LSX-NEXT: # kill: def $f0_64 killed $f0_64 killed $vr0 71; LSX-NEXT: ret 72entry: 73 %0 = call double @llvm.floor.f64(double %i) 74 ret double %0 75} 76 77;; truncf 78define float @trunc_f32(float %i) nounwind { 79; NOLSX-LABEL: trunc_f32: 80; NOLSX: # %bb.0: # %entry 81; NOLSX-NEXT: b %plt(truncf) 82; 83; LSX-LABEL: trunc_f32: 84; LSX: # %bb.0: # %entry 85; LSX-NEXT: # kill: def $f0 killed $f0 def $vr0 86; LSX-NEXT: vreplvei.w $vr0, $vr0, 0 87; LSX-NEXT: vfrintrz.s $vr0, $vr0 88; LSX-NEXT: # kill: def $f0 killed $f0 killed $vr0 89; LSX-NEXT: ret 90entry: 91 %0 = call float @llvm.trunc.f32(float %i) 92 ret float %0 93} 94 95;; trunc 96define double @trunc_f64(double %i) nounwind { 97; NOLSX-LABEL: trunc_f64: 98; NOLSX: # %bb.0: # %entry 99; NOLSX-NEXT: b %plt(trunc) 100; 101; LSX-LABEL: trunc_f64: 102; LSX: # %bb.0: # %entry 103; LSX-NEXT: # kill: def $f0_64 killed $f0_64 def $vr0 104; LSX-NEXT: vreplvei.d $vr0, $vr0, 0 105; LSX-NEXT: vfrintrz.d $vr0, $vr0 106; LSX-NEXT: # kill: def $f0_64 killed $f0_64 killed $vr0 107; LSX-NEXT: ret 108entry: 109 %0 = call double @llvm.trunc.f64(double %i) 110 ret double %0 111} 112 113;; roundevenf 114define float @roundeven_f32(float %i) nounwind { 115; NOLSX-LABEL: roundeven_f32: 116; NOLSX: # %bb.0: # %entry 117; NOLSX-NEXT: b %plt(roundevenf) 118; 119; LSX-LABEL: roundeven_f32: 120; LSX: # %bb.0: # %entry 121; LSX-NEXT: # kill: def $f0 killed $f0 def $vr0 122; LSX-NEXT: vreplvei.w $vr0, $vr0, 0 123; LSX-NEXT: vfrintrne.s $vr0, $vr0 124; LSX-NEXT: # kill: def $f0 killed $f0 killed $vr0 125; LSX-NEXT: ret 126entry: 127 %0 = call float @llvm.roundeven.f32(float %i) 128 ret float %0 129} 130 131;; roundeven 132define double @roundeven_f64(double %i) nounwind { 133; NOLSX-LABEL: roundeven_f64: 134; NOLSX: # %bb.0: # %entry 135; NOLSX-NEXT: b %plt(roundeven) 136; 137; LSX-LABEL: roundeven_f64: 138; LSX: # %bb.0: # %entry 139; LSX-NEXT: # kill: def $f0_64 killed $f0_64 def $vr0 140; LSX-NEXT: vreplvei.d $vr0, $vr0, 0 141; LSX-NEXT: vfrintrne.d $vr0, $vr0 142; LSX-NEXT: # kill: def $f0_64 killed $f0_64 killed $vr0 143; LSX-NEXT: ret 144entry: 145 %0 = call double @llvm.roundeven.f64(double %i) 146 ret double %0 147} 148 149declare float @llvm.ceil.f32(float) 150declare double @llvm.ceil.f64(double) 151declare float @llvm.floor.f32(float) 152declare double @llvm.floor.f64(double) 153declare float @llvm.trunc.f32(float) 154declare double @llvm.trunc.f64(double) 155declare float @llvm.roundeven.f32(float) 156declare double @llvm.roundeven.f64(double) 157