; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals all --version 4 ; RUN: opt -mtriple=riscv64-unknown-linux-gnu -mattr=+v -vector-library=sleefgnuabi -replace-with-veclib -S < %s | FileCheck %s ;. ; CHECK: @llvm.compiler.used = appending global [21 x ptr] [ptr @Sleef_cosdx_u10rvvm2, ptr @Sleef_cosfx_u10rvvm2, ptr @Sleef_expfx_u10rvvm2, ptr @Sleef_exp10dx_u10rvvm2, ptr @Sleef_exp10fx_u10rvvm2, ptr @Sleef_exp2dx_u10rvvm2, ptr @Sleef_exp2fx_u10rvvm2, ptr @Sleef_fmadx_rvvm2, ptr @Sleef_fmafx_rvvm2, ptr @Sleef_logdx_u10rvvm2, ptr @Sleef_logfx_u10rvvm2, ptr @Sleef_log10dx_u10rvvm2, ptr @Sleef_log10fx_u10rvvm2, ptr @Sleef_log2dx_u10rvvm2, ptr @Sleef_log2fx_u10rvvm2, ptr @Sleef_powdx_u10rvvm2, ptr @Sleef_powfx_u10rvvm2, ptr @Sleef_sindx_u10rvvm2, ptr @Sleef_sinfx_u10rvvm2, ptr @Sleef_sqrtdx_u05rvvm2, ptr @Sleef_sqrtfx_u05rvvm2], section "llvm.metadata" ;. define @llvm_ceil_vscale_f64( %in) { ; CHECK-LABEL: define @llvm_ceil_vscale_f64( ; CHECK-SAME: [[IN:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: [[TMP1:%.*]] = call fast @llvm.ceil.nxv2f64( [[IN]]) ; CHECK-NEXT: ret [[TMP1]] ; %1 = call fast @llvm.ceil.nxv2f64( %in) ret %1 } define @llvm_ceil_vscale_f32( %in) { ; CHECK-LABEL: define @llvm_ceil_vscale_f32( ; CHECK-SAME: [[IN:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = call fast @llvm.ceil.nxv4f32( [[IN]]) ; CHECK-NEXT: ret [[TMP1]] ; %1 = call fast @llvm.ceil.nxv4f32( %in) ret %1 } define @llvm_copysign_vscale_f64( %mag, %sgn) { ; CHECK-LABEL: define @llvm_copysign_vscale_f64( ; CHECK-SAME: [[MAG:%.*]], [[SGN:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = call fast @llvm.copysign.nxv2f64( [[MAG]], [[SGN]]) ; CHECK-NEXT: ret [[TMP1]] ; %1 = call fast @llvm.copysign.nxv2f64( %mag, %sgn) ret %1 } define @llvm_copysign_vscale_f32( %mag, %sgn) { ; CHECK-LABEL: define @llvm_copysign_vscale_f32( ; CHECK-SAME: [[MAG:%.*]], [[SGN:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = call fast @llvm.copysign.nxv4f32( [[MAG]], [[SGN]]) ; CHECK-NEXT: ret [[TMP1]] ; %1 = call fast @llvm.copysign.nxv4f32( %mag, %sgn) ret %1 } define @llvm_cos_vscale_f64( %in) { ; CHECK-LABEL: define @llvm_cos_vscale_f64( ; CHECK-SAME: [[IN:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = call fast @Sleef_cosdx_u10rvvm2( [[IN]]) ; CHECK-NEXT: ret [[TMP1]] ; %1 = call fast @llvm.cos.nxv2f64( %in) ret %1 } define @llvm_cos_vscale_f32( %in) { ; CHECK-LABEL: define @llvm_cos_vscale_f32( ; CHECK-SAME: [[IN:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = call fast @Sleef_cosfx_u10rvvm2( [[IN]]) ; CHECK-NEXT: ret [[TMP1]] ; %1 = call fast @llvm.cos.nxv4f32( %in) ret %1 } define @llvm_exp_vscale_f64( %in) { ; CHECK-LABEL: define @llvm_exp_vscale_f64( ; CHECK-SAME: [[IN:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = call fast @llvm.exp.nxv2f64( [[IN]]) ; CHECK-NEXT: ret [[TMP1]] ; %1 = call fast @llvm.exp.nxv2f64( %in) ret %1 } define @llvm_exp_vscale_f32( %in) { ; CHECK-LABEL: define @llvm_exp_vscale_f32( ; CHECK-SAME: [[IN:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = call fast @Sleef_expfx_u10rvvm2( [[IN]]) ; CHECK-NEXT: ret [[TMP1]] ; %1 = call fast @llvm.exp.nxv4f32( %in) ret %1 } define @llvm_exp10_vscale_f64( %in) { ; CHECK-LABEL: define @llvm_exp10_vscale_f64( ; CHECK-SAME: [[IN:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = call fast @Sleef_exp10dx_u10rvvm2( [[IN]]) ; CHECK-NEXT: ret [[TMP1]] ; %1 = call fast @llvm.exp10.nxv2f64( %in) ret %1 } define @llvm_exp10_vscale_f32( %in) { ; CHECK-LABEL: define @llvm_exp10_vscale_f32( ; CHECK-SAME: [[IN:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = call fast @Sleef_exp10fx_u10rvvm2( [[IN]]) ; CHECK-NEXT: ret [[TMP1]] ; %1 = call fast @llvm.exp10.nxv4f32( %in) ret %1 } define @llvm_exp2_vscale_f64( %in) { ; CHECK-LABEL: define @llvm_exp2_vscale_f64( ; CHECK-SAME: [[IN:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = call fast @Sleef_exp2dx_u10rvvm2( [[IN]]) ; CHECK-NEXT: ret [[TMP1]] ; %1 = call fast @llvm.exp2.nxv2f64( %in) ret %1 } define @llvm_exp2_vscale_f32( %in) { ; CHECK-LABEL: define @llvm_exp2_vscale_f32( ; CHECK-SAME: [[IN:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = call fast @Sleef_exp2fx_u10rvvm2( [[IN]]) ; CHECK-NEXT: ret [[TMP1]] ; %1 = call fast @llvm.exp2.nxv4f32( %in) ret %1 } define @llvm_fabs_vscale_f64( %in) { ; CHECK-LABEL: define @llvm_fabs_vscale_f64( ; CHECK-SAME: [[IN:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = call fast @llvm.fabs.nxv2f64( [[IN]]) ; CHECK-NEXT: ret [[TMP1]] ; %1 = call fast @llvm.fabs.nxv2f64( %in) ret %1 } define @llvm_fabs_vscale_f32( %in) { ; CHECK-LABEL: define @llvm_fabs_vscale_f32( ; CHECK-SAME: [[IN:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = call fast @llvm.fabs.nxv4f32( [[IN]]) ; CHECK-NEXT: ret [[TMP1]] ; %1 = call fast @llvm.fabs.nxv4f32( %in) ret %1 } define @llvm_floor_vscale_f64( %in) { ; CHECK-LABEL: define @llvm_floor_vscale_f64( ; CHECK-SAME: [[IN:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = call fast @llvm.floor.nxv2f64( [[IN]]) ; CHECK-NEXT: ret [[TMP1]] ; %1 = call fast @llvm.floor.nxv2f64( %in) ret %1 } define @llvm_floor_vscale_f32( %in) { ; CHECK-LABEL: define @llvm_floor_vscale_f32( ; CHECK-SAME: [[IN:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = call fast @llvm.floor.nxv4f32( [[IN]]) ; CHECK-NEXT: ret [[TMP1]] ; %1 = call fast @llvm.floor.nxv4f32( %in) ret %1 } define @llvm_fma_vscale_f64( %a, %b, %c ) { ; CHECK-LABEL: define @llvm_fma_vscale_f64( ; CHECK-SAME: [[A:%.*]], [[B:%.*]], [[C:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = call fast @Sleef_fmadx_rvvm2( [[A]], [[B]], [[C]]) ; CHECK-NEXT: ret [[TMP1]] ; %1 = call fast @llvm.fma.nxv2f64( %a, %b, %c) ret %1 } define @llvm_fma_vscale_f32( %a, %b, %c) { ; CHECK-LABEL: define @llvm_fma_vscale_f32( ; CHECK-SAME: [[A:%.*]], [[B:%.*]], [[C:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = call fast @Sleef_fmafx_rvvm2( [[A]], [[B]], [[C]]) ; CHECK-NEXT: ret [[TMP1]] ; %1 = call fast @llvm.fma.nxv4f32( %a, %b, %c) ret %1 } define @llvm_log_vscale_f64( %in) { ; CHECK-LABEL: define @llvm_log_vscale_f64( ; CHECK-SAME: [[IN:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = call fast @Sleef_logdx_u10rvvm2( [[IN]]) ; CHECK-NEXT: ret [[TMP1]] ; %1 = call fast @llvm.log.nxv2f64( %in) ret %1 } define @llvm_log_vscale_f32( %in) { ; CHECK-LABEL: define @llvm_log_vscale_f32( ; CHECK-SAME: [[IN:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = call fast @Sleef_logfx_u10rvvm2( [[IN]]) ; CHECK-NEXT: ret [[TMP1]] ; %1 = call fast @llvm.log.nxv4f32( %in) ret %1 } define @llvm_log10_vscale_f64( %in) { ; CHECK-LABEL: define @llvm_log10_vscale_f64( ; CHECK-SAME: [[IN:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = call fast @Sleef_log10dx_u10rvvm2( [[IN]]) ; CHECK-NEXT: ret [[TMP1]] ; %1 = call fast @llvm.log10.nxv2f64( %in) ret %1 } define @llvm_log10_vscale_f32( %in) { ; CHECK-LABEL: define @llvm_log10_vscale_f32( ; CHECK-SAME: [[IN:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = call fast @Sleef_log10fx_u10rvvm2( [[IN]]) ; CHECK-NEXT: ret [[TMP1]] ; %1 = call fast @llvm.log10.nxv4f32( %in) ret %1 } define @llvm_log2_vscale_f64( %in) { ; CHECK-LABEL: define @llvm_log2_vscale_f64( ; CHECK-SAME: [[IN:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = call fast @Sleef_log2dx_u10rvvm2( [[IN]]) ; CHECK-NEXT: ret [[TMP1]] ; %1 = call fast @llvm.log2.nxv2f64( %in) ret %1 } define @llvm_log2_vscale_f32( %in) { ; CHECK-LABEL: define @llvm_log2_vscale_f32( ; CHECK-SAME: [[IN:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = call fast @Sleef_log2fx_u10rvvm2( [[IN]]) ; CHECK-NEXT: ret [[TMP1]] ; %1 = call fast @llvm.log2.nxv4f32( %in) ret %1 } define @llvm_maxnum_vscale_f64( %in0, %in1) { ; CHECK-LABEL: define @llvm_maxnum_vscale_f64( ; CHECK-SAME: [[IN0:%.*]], [[IN1:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = call fast @llvm.maxnum.nxv2f64( [[IN0]], [[IN1]]) ; CHECK-NEXT: ret [[TMP1]] ; %1 = call fast @llvm.maxnum.nxv2f64( %in0, %in1) ret %1 } define @llvm_maxnum_vscale_f32( %in0, %in1) { ; CHECK-LABEL: define @llvm_maxnum_vscale_f32( ; CHECK-SAME: [[IN0:%.*]], [[IN1:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = call fast @llvm.maxnum.nxv4f32( [[IN0]], [[IN1]]) ; CHECK-NEXT: ret [[TMP1]] ; %1 = call fast @llvm.maxnum.nxv4f32( %in0, %in1) ret %1 } define @llvm_minnum_vscale_f64( %in0, %in1) { ; CHECK-LABEL: define @llvm_minnum_vscale_f64( ; CHECK-SAME: [[IN0:%.*]], [[IN1:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = call fast @llvm.minnum.nxv2f64( [[IN0]], [[IN1]]) ; CHECK-NEXT: ret [[TMP1]] ; %1 = call fast @llvm.minnum.nxv2f64( %in0, %in1) ret %1 } define @llvm_minnum_vscale_f32( %in0, %in1) { ; CHECK-LABEL: define @llvm_minnum_vscale_f32( ; CHECK-SAME: [[IN0:%.*]], [[IN1:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = call fast @llvm.minnum.nxv4f32( [[IN0]], [[IN1]]) ; CHECK-NEXT: ret [[TMP1]] ; %1 = call fast @llvm.minnum.nxv4f32( %in0, %in1) ret %1 } define @llvm_nearbyint_vscale_f64( %in) { ; CHECK-LABEL: define @llvm_nearbyint_vscale_f64( ; CHECK-SAME: [[IN:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = call fast @llvm.nearbyint.nxv2f64( [[IN]]) ; CHECK-NEXT: ret [[TMP1]] ; %1 = call fast @llvm.nearbyint.nxv2f64( %in) ret %1 } define @llvm_nearbyint_vscale_f32( %in) { ; CHECK-LABEL: define @llvm_nearbyint_vscale_f32( ; CHECK-SAME: [[IN:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = call fast @llvm.nearbyint.nxv4f32( [[IN]]) ; CHECK-NEXT: ret [[TMP1]] ; %1 = call fast @llvm.nearbyint.nxv4f32( %in) ret %1 } define @llvm_pow_vscale_f64( %in, %pow) { ; CHECK-LABEL: define @llvm_pow_vscale_f64( ; CHECK-SAME: [[IN:%.*]], [[POW:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = call fast @Sleef_powdx_u10rvvm2( [[IN]], [[POW]]) ; CHECK-NEXT: ret [[TMP1]] ; %1 = call fast @llvm.pow.nxv2f64( %in, %pow) ret %1 } define @llvm_pow_vscale_f32( %in, %pow) { ; CHECK-LABEL: define @llvm_pow_vscale_f32( ; CHECK-SAME: [[IN:%.*]], [[POW:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = call fast @Sleef_powfx_u10rvvm2( [[IN]], [[POW]]) ; CHECK-NEXT: ret [[TMP1]] ; %1 = call fast @llvm.pow.nxv4f32( %in, %pow) ret %1 } define @llvm_rint_vscale_f64( %in) { ; CHECK-LABEL: define @llvm_rint_vscale_f64( ; CHECK-SAME: [[IN:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = call fast @llvm.rint.nxv2f64( [[IN]]) ; CHECK-NEXT: ret [[TMP1]] ; %1 = call fast @llvm.rint.nxv2f64( %in) ret %1 } define @llvm_rint_vscale_f32( %in) { ; CHECK-LABEL: define @llvm_rint_vscale_f32( ; CHECK-SAME: [[IN:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = call fast @llvm.rint.nxv4f32( [[IN]]) ; CHECK-NEXT: ret [[TMP1]] ; %1 = call fast @llvm.rint.nxv4f32( %in) ret %1 } define @llvm_round_vscale_f64( %in) { ; CHECK-LABEL: define @llvm_round_vscale_f64( ; CHECK-SAME: [[IN:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = call fast @llvm.round.nxv2f64( [[IN]]) ; CHECK-NEXT: ret [[TMP1]] ; %1 = call fast @llvm.round.nxv2f64( %in) ret %1 } define @llvm_round_vscale_f32( %in) { ; CHECK-LABEL: define @llvm_round_vscale_f32( ; CHECK-SAME: [[IN:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = call fast @llvm.round.nxv4f32( [[IN]]) ; CHECK-NEXT: ret [[TMP1]] ; %1 = call fast @llvm.round.nxv4f32( %in) ret %1 } define @llvm_sin_vscale_f64( %in) { ; CHECK-LABEL: define @llvm_sin_vscale_f64( ; CHECK-SAME: [[IN:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = call fast @Sleef_sindx_u10rvvm2( [[IN]]) ; CHECK-NEXT: ret [[TMP1]] ; %1 = call fast @llvm.sin.nxv2f64( %in) ret %1 } define @llvm_sin_vscale_f32( %in) { ; CHECK-LABEL: define @llvm_sin_vscale_f32( ; CHECK-SAME: [[IN:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = call fast @Sleef_sinfx_u10rvvm2( [[IN]]) ; CHECK-NEXT: ret [[TMP1]] ; %1 = call fast @llvm.sin.nxv4f32( %in) ret %1 } define @llvm_sqrt_vscale_f64( %in) { ; CHECK-LABEL: define @llvm_sqrt_vscale_f64( ; CHECK-SAME: [[IN:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = call fast @Sleef_sqrtdx_u05rvvm2( [[IN]]) ; CHECK-NEXT: ret [[TMP1]] ; %1 = call fast @llvm.sqrt.nxv2f64( %in) ret %1 } define @llvm_sqrt_vscale_f32( %in) { ; CHECK-LABEL: define @llvm_sqrt_vscale_f32( ; CHECK-SAME: [[IN:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = call fast @Sleef_sqrtfx_u05rvvm2( [[IN]]) ; CHECK-NEXT: ret [[TMP1]] ; %1 = call fast @llvm.sqrt.nxv4f32( %in) ret %1 } define @llvm_trunc_vscale_f64( %in) { ; CHECK-LABEL: define @llvm_trunc_vscale_f64( ; CHECK-SAME: [[IN:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = call fast @llvm.trunc.nxv2f64( [[IN]]) ; CHECK-NEXT: ret [[TMP1]] ; %1 = call fast @llvm.trunc.nxv2f64( %in) ret %1 } define @llvm_trunc_vscale_f32( %in) { ; CHECK-LABEL: define @llvm_trunc_vscale_f32( ; CHECK-SAME: [[IN:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = call fast @llvm.trunc.nxv4f32( [[IN]]) ; CHECK-NEXT: ret [[TMP1]] ; %1 = call fast @llvm.trunc.nxv4f32( %in) ret %1 } define @frem_f64( %in) { ; CHECK-LABEL: define @frem_f64( ; CHECK-SAME: [[IN:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = frem [[IN]], [[IN]] ; CHECK-NEXT: ret [[TMP1]] ; %1= frem %in, %in ret %1 } define @frem_f32( %in) { ; CHECK-LABEL: define @frem_f32( ; CHECK-SAME: [[IN:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = frem [[IN]], [[IN]] ; CHECK-NEXT: ret [[TMP1]] ; %1= frem %in, %in ret %1 } declare @llvm.ceil.nxv2f64() declare @llvm.ceil.nxv4f32() declare @llvm.copysign.nxv2f64(, ) declare @llvm.copysign.nxv4f32(, ) declare @llvm.cos.nxv2f64() declare @llvm.cos.nxv4f32() declare @llvm.exp.nxv2f64() declare @llvm.exp.nxv4f32() declare @llvm.exp2.nxv2f64() declare @llvm.exp2.nxv4f32() declare @llvm.exp10.nxv2f64() declare @llvm.exp10.nxv4f32() declare @llvm.fabs.nxv2f64() declare @llvm.fabs.nxv4f32() declare @llvm.floor.nxv2f64() declare @llvm.floor.nxv4f32() declare @llvm.fma.nxv2f64(, , ) declare @llvm.fma.nxv4f32(, , ) declare @llvm.log.nxv2f64() declare @llvm.log.nxv4f32() declare @llvm.log10.nxv2f64() declare @llvm.log10.nxv4f32() declare @llvm.log2.nxv2f64() declare @llvm.log2.nxv4f32() declare @llvm.maxnum.nxv2f64(, ) declare @llvm.maxnum.nxv4f32(, ) declare @llvm.minnum.nxv2f64(, ) declare @llvm.minnum.nxv4f32(, ) declare @llvm.nearbyint.nxv2f64() declare @llvm.nearbyint.nxv4f32() declare @llvm.pow.nxv2f64(, ) declare @llvm.pow.nxv4f32(, ) declare @llvm.rint.nxv2f64() declare @llvm.rint.nxv4f32() declare @llvm.round.nxv2f64() declare @llvm.round.nxv4f32() declare @llvm.sin.nxv2f64() declare @llvm.sin.nxv4f32() declare @llvm.sqrt.nxv2f64() declare @llvm.sqrt.nxv4f32() declare @llvm.trunc.nxv2f64() declare @llvm.trunc.nxv4f32() ;. ; CHECK: attributes #[[ATTR0]] = { "target-features"="+v" } ; CHECK: attributes #[[ATTR1:[0-9]+]] = { nocallback nofree nosync nounwind speculatable willreturn memory(none) "target-features"="+v" } ;.