diff --git a/clang/test/CodeGen/RISCV/math-builtins.c b/clang/test/CodeGen/RISCV/math-builtins.c new file mode 100644 index 0000000000000..9630d62f0f482 --- /dev/null +++ b/clang/test/CodeGen/RISCV/math-builtins.c @@ -0,0 +1,459 @@ +// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 3 +// RUN: %clang_cc1 -triple riscv32 -emit-llvm %s -o - | FileCheck --check-prefix=RV32 %s +// RUN: %clang_cc1 -triple riscv64 -emit-llvm %s -o - | FileCheck --check-prefix=RV64 %s + +float ceilf(float); +double ceil(double); +long double ceill(long double); +float copysignf(float, float); +double copysign(double, double); +long double copysignl(long double, long double); +float cosf(float); +double cos(double); +long double cosl(long double); +float expf(float); +double exp(double); +long double expl(long double); +float exp2f(float); +double exp2(double); +long double exp2l(long double); +float fabsf(float); +double fabs(double); +long double fabsl(long double); +float floorf(float); +double floor(double); +long double floorl(long double); +float fmaxf(float, float); +double fmax(double, double); +long double fmaxl(long double, long double); +float fminf(float, float); +double fmin(double, double); +long double fminl(long double, long double); +float fmodf(float, float); +double fmod(double, double); +long double fmodl(long double, long double); +float logf(float); +double log(double); +long double logl(long double); +float log10f(float); +double log10(double); +long double log10l(long double); +float log2f(float); +double log2(double); +long double log2l(long double); +float nearbyintf(float); +double nearbyint(double); +long double nearbyintl(long double); +float powf(float, float); +double pow(double, double); +long double powl(long double, long double); +float rintf(float); +double rint(double); +long double rintl(long double); +long lrintf(float); +long lrint(double); +long lrintl(long double); +long long llrintf(float); +long long llrint(double); +long long llrintl(long double); +float roundf(float); +double round(double); +long double roundl(long double); +long lroundf(float); +long lround(double); +long lroundl(long double); +long long llroundf(float); +long long llround(double); +long long llroundl(long double); +float roundevenf(float); +double roundeven(double); +long double roundevenl(long double); +float sinf(float); +double sin(double); +long double sinl(long double); +float sqrtf(float); +double sqrt(double); +long double sqrtl(long double); +float truncf(float); +double trunc(double); +long double truncl(long double); + +// RV32-LABEL: define dso_local void @test( +// RV32-SAME: float noundef [[FARG:%.*]], double noundef [[DARG:%.*]], fp128 noundef [[LDARG:%.*]]) #[[ATTR0:[0-9]+]] { +// RV32-NEXT: entry: +// RV32-NEXT: [[FARG_ADDR:%.*]] = alloca float, align 4 +// RV32-NEXT: [[DARG_ADDR:%.*]] = alloca double, align 8 +// RV32-NEXT: [[LDARG_ADDR:%.*]] = alloca fp128, align 16 +// RV32-NEXT: store float [[FARG]], ptr [[FARG_ADDR]], align 4 +// RV32-NEXT: store double [[DARG]], ptr [[DARG_ADDR]], align 8 +// RV32-NEXT: store fp128 [[LDARG]], ptr [[LDARG_ADDR]], align 16 +// RV32-NEXT: [[TMP0:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV32-NEXT: [[TMP1:%.*]] = call float @llvm.ceil.f32(float [[TMP0]]) +// RV32-NEXT: [[TMP2:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV32-NEXT: [[TMP3:%.*]] = call double @llvm.ceil.f64(double [[TMP2]]) +// RV32-NEXT: [[TMP4:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV32-NEXT: [[TMP5:%.*]] = call fp128 @llvm.ceil.f128(fp128 [[TMP4]]) +// RV32-NEXT: [[TMP6:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV32-NEXT: [[TMP7:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV32-NEXT: [[TMP8:%.*]] = call float @llvm.copysign.f32(float [[TMP6]], float [[TMP7]]) +// RV32-NEXT: [[TMP9:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV32-NEXT: [[TMP10:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV32-NEXT: [[TMP11:%.*]] = call double @llvm.copysign.f64(double [[TMP9]], double [[TMP10]]) +// RV32-NEXT: [[TMP12:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV32-NEXT: [[TMP13:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV32-NEXT: [[TMP14:%.*]] = call fp128 @llvm.copysign.f128(fp128 [[TMP12]], fp128 [[TMP13]]) +// RV32-NEXT: [[TMP15:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV32-NEXT: [[TMP16:%.*]] = call float @llvm.cos.f32(float [[TMP15]]) +// RV32-NEXT: [[TMP17:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV32-NEXT: [[TMP18:%.*]] = call double @llvm.cos.f64(double [[TMP17]]) +// RV32-NEXT: [[TMP19:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV32-NEXT: [[TMP20:%.*]] = call fp128 @llvm.cos.f128(fp128 [[TMP19]]) +// RV32-NEXT: [[TMP21:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV32-NEXT: [[TMP22:%.*]] = call float @llvm.exp.f32(float [[TMP21]]) +// RV32-NEXT: [[TMP23:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV32-NEXT: [[TMP24:%.*]] = call double @llvm.exp.f64(double [[TMP23]]) +// RV32-NEXT: [[TMP25:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV32-NEXT: [[TMP26:%.*]] = call fp128 @llvm.exp.f128(fp128 [[TMP25]]) +// RV32-NEXT: [[TMP27:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV32-NEXT: [[TMP28:%.*]] = call float @llvm.exp2.f32(float [[TMP27]]) +// RV32-NEXT: [[TMP29:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV32-NEXT: [[TMP30:%.*]] = call double @llvm.exp2.f64(double [[TMP29]]) +// RV32-NEXT: [[TMP31:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV32-NEXT: [[TMP32:%.*]] = call fp128 @llvm.exp2.f128(fp128 [[TMP31]]) +// RV32-NEXT: [[TMP33:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV32-NEXT: [[TMP34:%.*]] = call float @llvm.fabs.f32(float [[TMP33]]) +// RV32-NEXT: [[TMP35:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV32-NEXT: [[TMP36:%.*]] = call double @llvm.fabs.f64(double [[TMP35]]) +// RV32-NEXT: [[TMP37:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV32-NEXT: [[TMP38:%.*]] = call fp128 @llvm.fabs.f128(fp128 [[TMP37]]) +// RV32-NEXT: [[TMP39:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV32-NEXT: [[TMP40:%.*]] = call float @llvm.floor.f32(float [[TMP39]]) +// RV32-NEXT: [[TMP41:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV32-NEXT: [[TMP42:%.*]] = call double @llvm.floor.f64(double [[TMP41]]) +// RV32-NEXT: [[TMP43:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV32-NEXT: [[TMP44:%.*]] = call fp128 @llvm.floor.f128(fp128 [[TMP43]]) +// RV32-NEXT: [[TMP45:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV32-NEXT: [[TMP46:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV32-NEXT: [[TMP47:%.*]] = call float @llvm.maxnum.f32(float [[TMP45]], float [[TMP46]]) +// RV32-NEXT: [[TMP48:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV32-NEXT: [[TMP49:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV32-NEXT: [[TMP50:%.*]] = call double @llvm.maxnum.f64(double [[TMP48]], double [[TMP49]]) +// RV32-NEXT: [[TMP51:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV32-NEXT: [[TMP52:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV32-NEXT: [[TMP53:%.*]] = call fp128 @llvm.maxnum.f128(fp128 [[TMP51]], fp128 [[TMP52]]) +// RV32-NEXT: [[TMP54:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV32-NEXT: [[TMP55:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV32-NEXT: [[TMP56:%.*]] = call float @llvm.minnum.f32(float [[TMP54]], float [[TMP55]]) +// RV32-NEXT: [[TMP57:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV32-NEXT: [[TMP58:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV32-NEXT: [[TMP59:%.*]] = call double @llvm.minnum.f64(double [[TMP57]], double [[TMP58]]) +// RV32-NEXT: [[TMP60:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV32-NEXT: [[TMP61:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV32-NEXT: [[TMP62:%.*]] = call fp128 @llvm.minnum.f128(fp128 [[TMP60]], fp128 [[TMP61]]) +// RV32-NEXT: [[TMP63:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV32-NEXT: [[TMP64:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV32-NEXT: [[FMOD:%.*]] = frem float [[TMP63]], [[TMP64]] +// RV32-NEXT: [[TMP65:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV32-NEXT: [[TMP66:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV32-NEXT: [[FMOD1:%.*]] = frem double [[TMP65]], [[TMP66]] +// RV32-NEXT: [[TMP67:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV32-NEXT: [[TMP68:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV32-NEXT: [[FMOD2:%.*]] = frem fp128 [[TMP67]], [[TMP68]] +// RV32-NEXT: [[TMP69:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV32-NEXT: [[TMP70:%.*]] = call float @llvm.log.f32(float [[TMP69]]) +// RV32-NEXT: [[TMP71:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV32-NEXT: [[TMP72:%.*]] = call double @llvm.log.f64(double [[TMP71]]) +// RV32-NEXT: [[TMP73:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV32-NEXT: [[TMP74:%.*]] = call fp128 @llvm.log.f128(fp128 [[TMP73]]) +// RV32-NEXT: [[TMP75:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV32-NEXT: [[TMP76:%.*]] = call float @llvm.log10.f32(float [[TMP75]]) +// RV32-NEXT: [[TMP77:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV32-NEXT: [[TMP78:%.*]] = call double @llvm.log10.f64(double [[TMP77]]) +// RV32-NEXT: [[TMP79:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV32-NEXT: [[TMP80:%.*]] = call fp128 @llvm.log10.f128(fp128 [[TMP79]]) +// RV32-NEXT: [[TMP81:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV32-NEXT: [[TMP82:%.*]] = call float @llvm.log2.f32(float [[TMP81]]) +// RV32-NEXT: [[TMP83:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV32-NEXT: [[TMP84:%.*]] = call double @llvm.log2.f64(double [[TMP83]]) +// RV32-NEXT: [[TMP85:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV32-NEXT: [[TMP86:%.*]] = call fp128 @llvm.log2.f128(fp128 [[TMP85]]) +// RV32-NEXT: [[TMP87:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV32-NEXT: [[TMP88:%.*]] = call float @llvm.nearbyint.f32(float [[TMP87]]) +// RV32-NEXT: [[TMP89:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV32-NEXT: [[TMP90:%.*]] = call double @llvm.nearbyint.f64(double [[TMP89]]) +// RV32-NEXT: [[TMP91:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV32-NEXT: [[TMP92:%.*]] = call fp128 @llvm.nearbyint.f128(fp128 [[TMP91]]) +// RV32-NEXT: [[TMP93:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV32-NEXT: [[TMP94:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV32-NEXT: [[TMP95:%.*]] = call float @llvm.pow.f32(float [[TMP93]], float [[TMP94]]) +// RV32-NEXT: [[TMP96:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV32-NEXT: [[TMP97:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV32-NEXT: [[TMP98:%.*]] = call double @llvm.pow.f64(double [[TMP96]], double [[TMP97]]) +// RV32-NEXT: [[TMP99:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV32-NEXT: [[TMP100:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV32-NEXT: [[TMP101:%.*]] = call fp128 @llvm.pow.f128(fp128 [[TMP99]], fp128 [[TMP100]]) +// RV32-NEXT: [[TMP102:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV32-NEXT: [[TMP103:%.*]] = call float @llvm.rint.f32(float [[TMP102]]) +// RV32-NEXT: [[TMP104:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV32-NEXT: [[TMP105:%.*]] = call double @llvm.rint.f64(double [[TMP104]]) +// RV32-NEXT: [[TMP106:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV32-NEXT: [[TMP107:%.*]] = call fp128 @llvm.rint.f128(fp128 [[TMP106]]) +// RV32-NEXT: [[TMP108:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV32-NEXT: [[TMP109:%.*]] = call i32 @llvm.lrint.i32.f32(float [[TMP108]]) +// RV32-NEXT: [[TMP110:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV32-NEXT: [[TMP111:%.*]] = call i32 @llvm.lrint.i32.f64(double [[TMP110]]) +// RV32-NEXT: [[TMP112:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV32-NEXT: [[TMP113:%.*]] = call i32 @llvm.lrint.i32.f128(fp128 [[TMP112]]) +// RV32-NEXT: [[TMP114:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV32-NEXT: [[TMP115:%.*]] = call i32 @llvm.lrint.i32.f32(float [[TMP114]]) +// RV32-NEXT: [[TMP116:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV32-NEXT: [[TMP117:%.*]] = call i64 @llvm.llrint.i64.f64(double [[TMP116]]) +// RV32-NEXT: [[TMP118:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV32-NEXT: [[TMP119:%.*]] = call i64 @llvm.llrint.i64.f128(fp128 [[TMP118]]) +// RV32-NEXT: [[TMP120:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV32-NEXT: [[TMP121:%.*]] = call float @llvm.round.f32(float [[TMP120]]) +// RV32-NEXT: [[TMP122:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV32-NEXT: [[TMP123:%.*]] = call double @llvm.round.f64(double [[TMP122]]) +// RV32-NEXT: [[TMP124:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV32-NEXT: [[TMP125:%.*]] = call fp128 @llvm.round.f128(fp128 [[TMP124]]) +// RV32-NEXT: [[TMP126:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV32-NEXT: [[TMP127:%.*]] = call i32 @llvm.lround.i32.f32(float [[TMP126]]) +// RV32-NEXT: [[TMP128:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV32-NEXT: [[TMP129:%.*]] = call i32 @llvm.lround.i32.f64(double [[TMP128]]) +// RV32-NEXT: [[TMP130:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV32-NEXT: [[TMP131:%.*]] = call i32 @llvm.lround.i32.f128(fp128 [[TMP130]]) +// RV32-NEXT: [[TMP132:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV32-NEXT: [[TMP133:%.*]] = call i64 @llvm.llround.i64.f32(float [[TMP132]]) +// RV32-NEXT: [[TMP134:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV32-NEXT: [[TMP135:%.*]] = call i64 @llvm.llround.i64.f64(double [[TMP134]]) +// RV32-NEXT: [[TMP136:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV32-NEXT: [[TMP137:%.*]] = call i64 @llvm.llround.i64.f128(fp128 [[TMP136]]) +// RV32-NEXT: [[TMP138:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV32-NEXT: [[TMP139:%.*]] = call float @llvm.roundeven.f32(float [[TMP138]]) +// RV32-NEXT: [[TMP140:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV32-NEXT: [[TMP141:%.*]] = call double @llvm.roundeven.f64(double [[TMP140]]) +// RV32-NEXT: [[TMP142:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV32-NEXT: [[TMP143:%.*]] = call fp128 @llvm.roundeven.f128(fp128 [[TMP142]]) +// RV32-NEXT: [[TMP144:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV32-NEXT: [[TMP145:%.*]] = call float @llvm.sin.f32(float [[TMP144]]) +// RV32-NEXT: [[TMP146:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV32-NEXT: [[TMP147:%.*]] = call double @llvm.sin.f64(double [[TMP146]]) +// RV32-NEXT: [[TMP148:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV32-NEXT: [[TMP149:%.*]] = call fp128 @llvm.sin.f128(fp128 [[TMP148]]) +// RV32-NEXT: [[TMP150:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV32-NEXT: [[TMP151:%.*]] = call float @llvm.sqrt.f32(float [[TMP150]]) +// RV32-NEXT: [[TMP152:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV32-NEXT: [[TMP153:%.*]] = call double @llvm.sqrt.f64(double [[TMP152]]) +// RV32-NEXT: [[TMP154:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV32-NEXT: [[TMP155:%.*]] = call fp128 @llvm.sqrt.f128(fp128 [[TMP154]]) +// RV32-NEXT: [[TMP156:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV32-NEXT: [[TMP157:%.*]] = call float @llvm.trunc.f32(float [[TMP156]]) +// RV32-NEXT: [[TMP158:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV32-NEXT: [[TMP159:%.*]] = call double @llvm.trunc.f64(double [[TMP158]]) +// RV32-NEXT: [[TMP160:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV32-NEXT: [[TMP161:%.*]] = call fp128 @llvm.trunc.f128(fp128 [[TMP160]]) +// RV32-NEXT: ret void +// +// RV64-LABEL: define dso_local void @test( +// RV64-SAME: float noundef [[FARG:%.*]], double noundef [[DARG:%.*]], fp128 noundef [[LDARG:%.*]]) #[[ATTR0:[0-9]+]] { +// RV64-NEXT: entry: +// RV64-NEXT: [[FARG_ADDR:%.*]] = alloca float, align 4 +// RV64-NEXT: [[DARG_ADDR:%.*]] = alloca double, align 8 +// RV64-NEXT: [[LDARG_ADDR:%.*]] = alloca fp128, align 16 +// RV64-NEXT: store float [[FARG]], ptr [[FARG_ADDR]], align 4 +// RV64-NEXT: store double [[DARG]], ptr [[DARG_ADDR]], align 8 +// RV64-NEXT: store fp128 [[LDARG]], ptr [[LDARG_ADDR]], align 16 +// RV64-NEXT: [[TMP0:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV64-NEXT: [[TMP1:%.*]] = call float @llvm.ceil.f32(float [[TMP0]]) +// RV64-NEXT: [[TMP2:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV64-NEXT: [[TMP3:%.*]] = call double @llvm.ceil.f64(double [[TMP2]]) +// RV64-NEXT: [[TMP4:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV64-NEXT: [[TMP5:%.*]] = call fp128 @llvm.ceil.f128(fp128 [[TMP4]]) +// RV64-NEXT: [[TMP6:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV64-NEXT: [[TMP7:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV64-NEXT: [[TMP8:%.*]] = call float @llvm.copysign.f32(float [[TMP6]], float [[TMP7]]) +// RV64-NEXT: [[TMP9:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV64-NEXT: [[TMP10:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV64-NEXT: [[TMP11:%.*]] = call double @llvm.copysign.f64(double [[TMP9]], double [[TMP10]]) +// RV64-NEXT: [[TMP12:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV64-NEXT: [[TMP13:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV64-NEXT: [[TMP14:%.*]] = call fp128 @llvm.copysign.f128(fp128 [[TMP12]], fp128 [[TMP13]]) +// RV64-NEXT: [[TMP15:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV64-NEXT: [[TMP16:%.*]] = call float @llvm.cos.f32(float [[TMP15]]) +// RV64-NEXT: [[TMP17:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV64-NEXT: [[TMP18:%.*]] = call double @llvm.cos.f64(double [[TMP17]]) +// RV64-NEXT: [[TMP19:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV64-NEXT: [[TMP20:%.*]] = call fp128 @llvm.cos.f128(fp128 [[TMP19]]) +// RV64-NEXT: [[TMP21:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV64-NEXT: [[TMP22:%.*]] = call float @llvm.exp.f32(float [[TMP21]]) +// RV64-NEXT: [[TMP23:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV64-NEXT: [[TMP24:%.*]] = call double @llvm.exp.f64(double [[TMP23]]) +// RV64-NEXT: [[TMP25:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV64-NEXT: [[TMP26:%.*]] = call fp128 @llvm.exp.f128(fp128 [[TMP25]]) +// RV64-NEXT: [[TMP27:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV64-NEXT: [[TMP28:%.*]] = call float @llvm.exp2.f32(float [[TMP27]]) +// RV64-NEXT: [[TMP29:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV64-NEXT: [[TMP30:%.*]] = call double @llvm.exp2.f64(double [[TMP29]]) +// RV64-NEXT: [[TMP31:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV64-NEXT: [[TMP32:%.*]] = call fp128 @llvm.exp2.f128(fp128 [[TMP31]]) +// RV64-NEXT: [[TMP33:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV64-NEXT: [[TMP34:%.*]] = call float @llvm.fabs.f32(float [[TMP33]]) +// RV64-NEXT: [[TMP35:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV64-NEXT: [[TMP36:%.*]] = call double @llvm.fabs.f64(double [[TMP35]]) +// RV64-NEXT: [[TMP37:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV64-NEXT: [[TMP38:%.*]] = call fp128 @llvm.fabs.f128(fp128 [[TMP37]]) +// RV64-NEXT: [[TMP39:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV64-NEXT: [[TMP40:%.*]] = call float @llvm.floor.f32(float [[TMP39]]) +// RV64-NEXT: [[TMP41:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV64-NEXT: [[TMP42:%.*]] = call double @llvm.floor.f64(double [[TMP41]]) +// RV64-NEXT: [[TMP43:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV64-NEXT: [[TMP44:%.*]] = call fp128 @llvm.floor.f128(fp128 [[TMP43]]) +// RV64-NEXT: [[TMP45:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV64-NEXT: [[TMP46:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV64-NEXT: [[TMP47:%.*]] = call float @llvm.maxnum.f32(float [[TMP45]], float [[TMP46]]) +// RV64-NEXT: [[TMP48:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV64-NEXT: [[TMP49:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV64-NEXT: [[TMP50:%.*]] = call double @llvm.maxnum.f64(double [[TMP48]], double [[TMP49]]) +// RV64-NEXT: [[TMP51:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV64-NEXT: [[TMP52:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV64-NEXT: [[TMP53:%.*]] = call fp128 @llvm.maxnum.f128(fp128 [[TMP51]], fp128 [[TMP52]]) +// RV64-NEXT: [[TMP54:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV64-NEXT: [[TMP55:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV64-NEXT: [[TMP56:%.*]] = call float @llvm.minnum.f32(float [[TMP54]], float [[TMP55]]) +// RV64-NEXT: [[TMP57:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV64-NEXT: [[TMP58:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV64-NEXT: [[TMP59:%.*]] = call double @llvm.minnum.f64(double [[TMP57]], double [[TMP58]]) +// RV64-NEXT: [[TMP60:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV64-NEXT: [[TMP61:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV64-NEXT: [[TMP62:%.*]] = call fp128 @llvm.minnum.f128(fp128 [[TMP60]], fp128 [[TMP61]]) +// RV64-NEXT: [[TMP63:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV64-NEXT: [[TMP64:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV64-NEXT: [[FMOD:%.*]] = frem float [[TMP63]], [[TMP64]] +// RV64-NEXT: [[TMP65:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV64-NEXT: [[TMP66:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV64-NEXT: [[FMOD1:%.*]] = frem double [[TMP65]], [[TMP66]] +// RV64-NEXT: [[TMP67:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV64-NEXT: [[TMP68:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV64-NEXT: [[FMOD2:%.*]] = frem fp128 [[TMP67]], [[TMP68]] +// RV64-NEXT: [[TMP69:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV64-NEXT: [[TMP70:%.*]] = call float @llvm.log.f32(float [[TMP69]]) +// RV64-NEXT: [[TMP71:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV64-NEXT: [[TMP72:%.*]] = call double @llvm.log.f64(double [[TMP71]]) +// RV64-NEXT: [[TMP73:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV64-NEXT: [[TMP74:%.*]] = call fp128 @llvm.log.f128(fp128 [[TMP73]]) +// RV64-NEXT: [[TMP75:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV64-NEXT: [[TMP76:%.*]] = call float @llvm.log10.f32(float [[TMP75]]) +// RV64-NEXT: [[TMP77:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV64-NEXT: [[TMP78:%.*]] = call double @llvm.log10.f64(double [[TMP77]]) +// RV64-NEXT: [[TMP79:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV64-NEXT: [[TMP80:%.*]] = call fp128 @llvm.log10.f128(fp128 [[TMP79]]) +// RV64-NEXT: [[TMP81:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV64-NEXT: [[TMP82:%.*]] = call float @llvm.log2.f32(float [[TMP81]]) +// RV64-NEXT: [[TMP83:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV64-NEXT: [[TMP84:%.*]] = call double @llvm.log2.f64(double [[TMP83]]) +// RV64-NEXT: [[TMP85:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV64-NEXT: [[TMP86:%.*]] = call fp128 @llvm.log2.f128(fp128 [[TMP85]]) +// RV64-NEXT: [[TMP87:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV64-NEXT: [[TMP88:%.*]] = call float @llvm.nearbyint.f32(float [[TMP87]]) +// RV64-NEXT: [[TMP89:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV64-NEXT: [[TMP90:%.*]] = call double @llvm.nearbyint.f64(double [[TMP89]]) +// RV64-NEXT: [[TMP91:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV64-NEXT: [[TMP92:%.*]] = call fp128 @llvm.nearbyint.f128(fp128 [[TMP91]]) +// RV64-NEXT: [[TMP93:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV64-NEXT: [[TMP94:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV64-NEXT: [[TMP95:%.*]] = call float @llvm.pow.f32(float [[TMP93]], float [[TMP94]]) +// RV64-NEXT: [[TMP96:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV64-NEXT: [[TMP97:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV64-NEXT: [[TMP98:%.*]] = call double @llvm.pow.f64(double [[TMP96]], double [[TMP97]]) +// RV64-NEXT: [[TMP99:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV64-NEXT: [[TMP100:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV64-NEXT: [[TMP101:%.*]] = call fp128 @llvm.pow.f128(fp128 [[TMP99]], fp128 [[TMP100]]) +// RV64-NEXT: [[TMP102:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV64-NEXT: [[TMP103:%.*]] = call float @llvm.rint.f32(float [[TMP102]]) +// RV64-NEXT: [[TMP104:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV64-NEXT: [[TMP105:%.*]] = call double @llvm.rint.f64(double [[TMP104]]) +// RV64-NEXT: [[TMP106:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV64-NEXT: [[TMP107:%.*]] = call fp128 @llvm.rint.f128(fp128 [[TMP106]]) +// RV64-NEXT: [[TMP108:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV64-NEXT: [[TMP109:%.*]] = call i64 @llvm.lrint.i64.f32(float [[TMP108]]) +// RV64-NEXT: [[TMP110:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV64-NEXT: [[TMP111:%.*]] = call i64 @llvm.lrint.i64.f64(double [[TMP110]]) +// RV64-NEXT: [[TMP112:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV64-NEXT: [[TMP113:%.*]] = call i64 @llvm.lrint.i64.f128(fp128 [[TMP112]]) +// RV64-NEXT: [[TMP114:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV64-NEXT: [[TMP115:%.*]] = call i64 @llvm.lrint.i64.f32(float [[TMP114]]) +// RV64-NEXT: [[TMP116:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV64-NEXT: [[TMP117:%.*]] = call i64 @llvm.llrint.i64.f64(double [[TMP116]]) +// RV64-NEXT: [[TMP118:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV64-NEXT: [[TMP119:%.*]] = call i64 @llvm.llrint.i64.f128(fp128 [[TMP118]]) +// RV64-NEXT: [[TMP120:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV64-NEXT: [[TMP121:%.*]] = call float @llvm.round.f32(float [[TMP120]]) +// RV64-NEXT: [[TMP122:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV64-NEXT: [[TMP123:%.*]] = call double @llvm.round.f64(double [[TMP122]]) +// RV64-NEXT: [[TMP124:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV64-NEXT: [[TMP125:%.*]] = call fp128 @llvm.round.f128(fp128 [[TMP124]]) +// RV64-NEXT: [[TMP126:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV64-NEXT: [[TMP127:%.*]] = call i64 @llvm.lround.i64.f32(float [[TMP126]]) +// RV64-NEXT: [[TMP128:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV64-NEXT: [[TMP129:%.*]] = call i64 @llvm.lround.i64.f64(double [[TMP128]]) +// RV64-NEXT: [[TMP130:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV64-NEXT: [[TMP131:%.*]] = call i64 @llvm.lround.i64.f128(fp128 [[TMP130]]) +// RV64-NEXT: [[TMP132:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV64-NEXT: [[TMP133:%.*]] = call i64 @llvm.llround.i64.f32(float [[TMP132]]) +// RV64-NEXT: [[TMP134:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV64-NEXT: [[TMP135:%.*]] = call i64 @llvm.llround.i64.f64(double [[TMP134]]) +// RV64-NEXT: [[TMP136:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV64-NEXT: [[TMP137:%.*]] = call i64 @llvm.llround.i64.f128(fp128 [[TMP136]]) +// RV64-NEXT: [[TMP138:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV64-NEXT: [[TMP139:%.*]] = call float @llvm.roundeven.f32(float [[TMP138]]) +// RV64-NEXT: [[TMP140:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV64-NEXT: [[TMP141:%.*]] = call double @llvm.roundeven.f64(double [[TMP140]]) +// RV64-NEXT: [[TMP142:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV64-NEXT: [[TMP143:%.*]] = call fp128 @llvm.roundeven.f128(fp128 [[TMP142]]) +// RV64-NEXT: [[TMP144:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV64-NEXT: [[TMP145:%.*]] = call float @llvm.sin.f32(float [[TMP144]]) +// RV64-NEXT: [[TMP146:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV64-NEXT: [[TMP147:%.*]] = call double @llvm.sin.f64(double [[TMP146]]) +// RV64-NEXT: [[TMP148:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV64-NEXT: [[TMP149:%.*]] = call fp128 @llvm.sin.f128(fp128 [[TMP148]]) +// RV64-NEXT: [[TMP150:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV64-NEXT: [[TMP151:%.*]] = call float @llvm.sqrt.f32(float [[TMP150]]) +// RV64-NEXT: [[TMP152:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV64-NEXT: [[TMP153:%.*]] = call double @llvm.sqrt.f64(double [[TMP152]]) +// RV64-NEXT: [[TMP154:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV64-NEXT: [[TMP155:%.*]] = call fp128 @llvm.sqrt.f128(fp128 [[TMP154]]) +// RV64-NEXT: [[TMP156:%.*]] = load float, ptr [[FARG_ADDR]], align 4 +// RV64-NEXT: [[TMP157:%.*]] = call float @llvm.trunc.f32(float [[TMP156]]) +// RV64-NEXT: [[TMP158:%.*]] = load double, ptr [[DARG_ADDR]], align 8 +// RV64-NEXT: [[TMP159:%.*]] = call double @llvm.trunc.f64(double [[TMP158]]) +// RV64-NEXT: [[TMP160:%.*]] = load fp128, ptr [[LDARG_ADDR]], align 16 +// RV64-NEXT: [[TMP161:%.*]] = call fp128 @llvm.trunc.f128(fp128 [[TMP160]]) +// RV64-NEXT: ret void +// +void test(float farg, double darg, long double ldarg) { + ceilf(farg); ceil(darg); ceill(ldarg); + copysignf(farg, farg); copysign(darg, darg); copysignl(ldarg, ldarg); + cosf(farg); cos(darg); cosl(ldarg); + expf(farg); exp(darg); expl(ldarg); + exp2f(farg); exp2(darg); exp2l(ldarg); + fabsf(farg); fabs(darg); fabsl(ldarg); + floorf(farg); floor(darg); floorl(ldarg); + fmaxf(farg, farg); fmax(darg, darg); fmaxl(ldarg, ldarg); + fminf(farg, farg); fmin(darg, darg); fminl(ldarg, ldarg); + fmodf(farg, farg); fmod(darg, darg); fmodl(ldarg, ldarg); + logf(farg); log(darg); logl(ldarg); + log10f(farg); log10(darg); log10l(ldarg); + log2f(farg); log2(darg); log2l(ldarg); + nearbyintf(farg); nearbyint(darg); nearbyintl(ldarg); + powf(farg, farg); pow(darg, darg); powl(ldarg, ldarg); + rintf(farg); rint(darg); rintl(ldarg); + lrintf(farg); lrint(darg); lrintl(ldarg); + lrintf(farg); llrint(darg); llrintl(ldarg); + roundf(farg); round(darg); roundl(ldarg); + lroundf(farg); lround(darg); lroundl(ldarg); + llroundf(farg); llround(darg); llroundl(ldarg); + roundevenf(farg); roundeven(darg); roundevenl(ldarg); + sinf(farg); sin(darg); sinl(ldarg); + sqrtf(farg); sqrt(darg); sqrtl(ldarg); + truncf(farg); trunc(darg); truncl(ldarg); +} diff --git a/clang/test/CodeGen/math-builtins.c b/clang/test/CodeGen/X86/math-builtins.c similarity index 100% rename from clang/test/CodeGen/math-builtins.c rename to clang/test/CodeGen/X86/math-builtins.c