================
@@ -0,0 +1,1748 @@
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir %s -o
%t.cir
+// RUN: FileCheck --input-file=%t.cir %s
+// RUN: %clang_cc1 -triple aarch64-apple-darwin-macho -fclangir -emit-cir %s
-o %t-aarch64.cir
+// RUN: FileCheck --input-file=%t-aarch64.cir %s --check-prefix=AARCH64
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-llvm -o
%t.ll %s
+// RUN: FileCheck --input-file=%t.ll %s --check-prefix=LLVM
+
+// lround
+
+long my_lroundf(float f) {
+ return __builtin_lroundf(f);
+ // CHECK: cir.func dso_local @my_lroundf
+ // CHECK: %{{.+}} = cir.lround %{{.+}} : !cir.float -> !s64i
+
+ // LLVM: define dso_local i64 @my_lroundf
+ // LLVM: %{{.+}} = call i64 @llvm.lround.i64.f32(float %{{.+}})
+ // LLVM: }
+}
+
+long my_lround(double f) {
+ return __builtin_lround(f);
+ // CHECK: cir.func dso_local @my_lround
+ // CHECK: %{{.+}} = cir.lround %{{.+}} : !cir.double -> !s64i
+
+ // LLVM: define dso_local i64 @my_lround
+ // LLVM: %{{.+}} = call i64 @llvm.lround.i64.f64(double %{{.+}})
+ // LLVM: }
+}
+
+long my_lroundl(long double f) {
+ return __builtin_lroundl(f);
+ // CHECK: cir.func dso_local @my_lroundl
+ // CHECK: %{{.+}} = cir.lround %{{.+}} : !cir.long_double<!cir.f80> -> !s64i
+ // AARCH64: %{{.+}} = cir.lround %{{.+}} : !cir.long_double<!cir.double> ->
!s64i
+
+ // LLVM: define dso_local i64 @my_lroundl
+ // LLVM: %{{.+}} = call i64 @llvm.lround.i64.f80(x86_fp80 %{{.+}})
+ // LLVM: }
+}
+
+long lroundf(float);
+long lround(double);
+long lroundl(long double);
+
+long call_lroundf(float f) {
+ return lroundf(f);
+ // CHECK: cir.func dso_local @call_lroundf
+ // CHECK: %{{.+}} = cir.lround %{{.+}} : !cir.float -> !s64i
+
+ // LLVM: define dso_local i64 @call_lroundf
+ // LLVM: %{{.+}} = call i64 @llvm.lround.i64.f32(float %{{.+}})
+ // LLVM: }
+}
+
+long call_lround(double f) {
+ return lround(f);
+ // CHECK: cir.func dso_local @call_lround
+ // CHECK: %{{.+}} = cir.lround %{{.+}} : !cir.double -> !s64i
+
+ // LLVM: define dso_local i64 @call_lround
+ // LLVM: %{{.+}} = call i64 @llvm.lround.i64.f64(double %{{.+}})
+ // LLVM: }
+}
+
+long call_lroundl(long double f) {
+ return lroundl(f);
+ // CHECK: cir.func dso_local @call_lroundl
+ // CHECK: %{{.+}} = cir.lround %{{.+}} : !cir.long_double<!cir.f80> -> !s64i
+ // AARCH64: %{{.+}} = cir.lround %{{.+}} : !cir.long_double<!cir.double> ->
!s64i
+
+ // LLVM: define dso_local i64 @call_lroundl
+ // LLVM: %{{.+}} = call i64 @llvm.lround.i64.f80(x86_fp80 %{{.+}})
+ // LLVM: }
+}
+
+// llround
+
+long long my_llroundf(float f) {
+ return __builtin_llroundf(f);
+ // CHECK: cir.func dso_local @my_llroundf
+ // CHECK: %{{.+}} = cir.llround %{{.+}} : !cir.float -> !s64i
+
+ // LLVM: define dso_local i64 @my_llroundf
+ // LLVM: %{{.+}} = call i64 @llvm.llround.i64.f32(float %{{.+}})
+ // LLVM: }
+}
+
+long long my_llround(double f) {
+ return __builtin_llround(f);
+ // CHECK: cir.func dso_local @my_llround
+ // CHECK: %{{.+}} = cir.llround %{{.+}} : !cir.double -> !s64i
+
+ // LLVM: define dso_local i64 @my_llround
+ // LLVM: %{{.+}} = call i64 @llvm.llround.i64.f64(double %{{.+}})
+ // LLVM: }
+}
+
+long long my_llroundl(long double f) {
+ return __builtin_llroundl(f);
+ // CHECK: cir.func dso_local @my_llroundl
+ // CHECK: %{{.+}} = cir.llround %{{.+}} : !cir.long_double<!cir.f80> -> !s64i
+ // AARCH64: %{{.+}} = cir.llround %{{.+}} : !cir.long_double<!cir.double> ->
!s64i
+
+ // LLVM: define dso_local i64 @my_llroundl
+ // LLVM: %{{.+}} = call i64 @llvm.llround.i64.f80(x86_fp80 %{{.+}})
+ // LLVM: }
+}
+
+long long llroundf(float);
+long long llround(double);
+long long llroundl(long double);
+
+long long call_llroundf(float f) {
+ return llroundf(f);
+ // CHECK: cir.func dso_local @call_llroundf
+ // CHECK: %{{.+}} = cir.llround %{{.+}} : !cir.float -> !s64i
+
+ // LLVM: define dso_local i64 @call_llroundf
+ // LLVM: %{{.+}} = call i64 @llvm.llround.i64.f32(float %{{.+}})
+ // LLVM: }
+}
+
+long long call_llround(double f) {
+ return llround(f);
+ // CHECK: cir.func dso_local @call_llround
+ // CHECK: %{{.+}} = cir.llround %{{.+}} : !cir.double -> !s64i
+
+ // LLVM: define dso_local i64 @call_llround
+ // LLVM: %{{.+}} = call i64 @llvm.llround.i64.f64(double %{{.+}})
+ // LLVM: }
+}
+
+long long call_llroundl(long double f) {
+ return llroundl(f);
+ // CHECK: cir.func dso_local @call_llroundl
+ // CHECK: %{{.+}} = cir.llround %{{.+}} : !cir.long_double<!cir.f80> -> !s64i
+ // AARCH64: %{{.+}} = cir.llround %{{.+}} : !cir.long_double<!cir.double> ->
!s64i
+
+ // LLVM: define dso_local i64 @call_llroundl
+ // LLVM: %{{.+}} = call i64 @llvm.llround.i64.f80(x86_fp80 %{{.+}})
+ // LLVM: }
+}
+
+// lrint
+
+long my_lrintf(float f) {
+ return __builtin_lrintf(f);
+ // CHECK: cir.func dso_local @my_lrintf
+ // CHECK: %{{.+}} = cir.lrint %{{.+}} : !cir.float -> !s64i
+
+ // LLVM: define dso_local i64 @my_lrintf
+ // LLVM: %{{.+}} = call i64 @llvm.lrint.i64.f32(float %{{.+}})
+ // LLVM: }
+}
+
+long my_lrint(double f) {
+ return __builtin_lrint(f);
+ // CHECK: cir.func dso_local @my_lrint
+ // CHECK: %{{.+}} = cir.lrint %{{.+}} : !cir.double -> !s64i
+
+ // LLVM: define dso_local i64 @my_lrint
+ // LLVM: %{{.+}} = call i64 @llvm.lrint.i64.f64(double %{{.+}})
+ // LLVM: }
+}
+
+long my_lrintl(long double f) {
+ return __builtin_lrintl(f);
+ // CHECK: cir.func dso_local @my_lrintl
+ // CHECK: %{{.+}} = cir.lrint %{{.+}} : !cir.long_double<!cir.f80> -> !s64i
+ // AARCH64: %{{.+}} = cir.lrint %{{.+}} : !cir.long_double<!cir.double> ->
!s64i
+
+ // LLVM: define dso_local i64 @my_lrintl
+ // LLVM: %{{.+}} = call i64 @llvm.lrint.i64.f80(x86_fp80 %{{.+}})
+ // LLVM: }
+}
+
+long lrintf(float);
+long lrint(double);
+long lrintl(long double);
+
+long call_lrintf(float f) {
+ return lrintf(f);
+ // CHECK: cir.func dso_local @call_lrintf
+ // CHECK: %{{.+}} = cir.lrint %{{.+}} : !cir.float -> !s64i
+
+ // LLVM: define dso_local i64 @call_lrintf
+ // LLVM: %{{.+}} = call i64 @llvm.lrint.i64.f32(float %{{.+}})
+ // LLVM: }
+}
+
+long call_lrint(double f) {
+ return lrint(f);
+ // CHECK: cir.func dso_local @call_lrint
+ // CHECK: %{{.+}} = cir.lrint %{{.+}} : !cir.double -> !s64i
+
+ // LLVM: define dso_local i64 @call_lrint
+ // LLVM: %{{.+}} = call i64 @llvm.lrint.i64.f64(double %{{.+}})
+ // LLVM: }
+}
+
+long call_lrintl(long double f) {
+ return lrintl(f);
+ // CHECK: cir.func dso_local @call_lrintl
+ // CHECK: %{{.+}} = cir.lrint %{{.+}} : !cir.long_double<!cir.f80> -> !s64i
+ // AARCH64: %{{.+}} = cir.lrint %{{.+}} : !cir.long_double<!cir.double> ->
!s64i
+
+ // LLVM: define dso_local i64 @call_lrintl
+ // LLVM: %{{.+}} = call i64 @llvm.lrint.i64.f80(x86_fp80 %{{.+}})
+ // LLVM: }
+}
+
+// llrint
+
+long long my_llrintf(float f) {
+ return __builtin_llrintf(f);
+ // CHECK: cir.func dso_local @my_llrintf
+ // CHECK: %{{.+}} = cir.llrint %{{.+}} : !cir.float -> !s64i
+
+ // LLVM: define dso_local i64 @my_llrintf
+ // LLVM: %{{.+}} = call i64 @llvm.llrint.i64.f32(float %{{.+}})
+ // LLVM: }
+}
+
+long long my_llrint(double f) {
+ return __builtin_llrint(f);
+ // CHECK: cir.func dso_local @my_llrint
+ // CHECK: %{{.+}} = cir.llrint %{{.+}} : !cir.double -> !s64i
+
+ // LLVM: define dso_local i64 @my_llrint
+ // LLVM: %{{.+}} = call i64 @llvm.llrint.i64.f64(double %{{.+}})
+ // LLVM: }
+}
+
+long long my_llrintl(long double f) {
+ return __builtin_llrintl(f);
+ // CHECK: cir.func dso_local @my_llrintl
+ // CHECK: %{{.+}} = cir.llrint %{{.+}} : !cir.long_double<!cir.f80> -> !s64i
+ // AARCH64: %{{.+}} = cir.llrint %{{.+}} : !cir.long_double<!cir.double> ->
!s64i
+
+ // LLVM: define dso_local i64 @my_llrintl
+ // LLVM: %{{.+}} = call i64 @llvm.llrint.i64.f80(x86_fp80 %{{.+}})
+ // LLVM: }
+}
+
+long long llrintf(float);
+long long llrint(double);
+long long llrintl(long double);
+
+long long call_llrintf(float f) {
+ return llrintf(f);
+ // CHECK: cir.func dso_local @call_llrintf
+ // CHECK: %{{.+}} = cir.llrint %{{.+}} : !cir.float -> !s64i
+
+ // LLVM: define dso_local i64 @call_llrintf
+ // LLVM: %{{.+}} = call i64 @llvm.llrint.i64.f32(float %{{.+}})
+ // LLVM: }
+}
+
+long long call_llrint(double f) {
+ return llrint(f);
+ // CHECK: cir.func dso_local @call_llrint
+ // CHECK: %{{.+}} = cir.llrint %{{.+}} : !cir.double -> !s64i
+
+ // LLVM: define dso_local i64 @call_llrint
+ // LLVM: %{{.+}} = call i64 @llvm.llrint.i64.f64(double %{{.+}})
+ // LLVM: }
+}
+
+long long call_llrintl(long double f) {
+ return llrintl(f);
+ // CHECK: cir.func dso_local @call_llrintl
+ // CHECK: %{{.+}} = cir.llrint %{{.+}} : !cir.long_double<!cir.f80> -> !s64i
+ // AARCH64: %{{.+}} = cir.llrint %{{.+}} : !cir.long_double<!cir.double> ->
!s64i
+
+ // LLVM: define dso_local i64 @call_llrintl
+ // LLVM: %{{.+}} = call i64 @llvm.llrint.i64.f80(x86_fp80 %{{.+}})
+ // LLVM: }
+}
+
+// ceil
+
+float my_ceilf(float f) {
+ return __builtin_ceilf(f);
+ // CHECK: cir.func dso_local @my_ceilf
+ // CHECK: {{.+}} = cir.ceil {{.+}} : !cir.float
+
+ // LLVM: define dso_local float @my_ceilf(float %0)
+ // LLVM: %{{.+}} = call float @llvm.ceil.f32(float %{{.+}})
+ // LLVM: }
+}
+
+double my_ceil(double f) {
+ return __builtin_ceil(f);
+ // CHECK: cir.func dso_local @my_ceil
+ // CHECK: {{.+}} = cir.ceil {{.+}} : !cir.double
+
+ // LLVM: define dso_local double @my_ceil(double %0)
+ // LLVM: %{{.+}} = call double @llvm.ceil.f64(double %{{.+}})
+ // LLVM: }
+}
+
+long double my_ceill(long double f) {
+ return __builtin_ceill(f);
+ // CHECK: cir.func dso_local @my_ceill
+ // CHECK: {{.+}} = cir.ceil {{.+}} : !cir.long_double<!cir.f80>
+ // AARCH64: {{.+}} = cir.ceil {{.+}} : !cir.long_double<!cir.double>
+
+ // LLVM: define dso_local x86_fp80 @my_ceill(x86_fp80 %0)
+ // LLVM: %{{.+}} = call x86_fp80 @llvm.ceil.f80(x86_fp80 %{{.+}})
+ // LLVM: }
+}
+
+float ceilf(float);
+double ceil(double);
+long double ceill(long double);
+
+float call_ceilf(float f) {
+ return ceilf(f);
+ // CHECK: cir.func dso_local @call_ceilf
+ // CHECK: {{.+}} = cir.ceil {{.+}} : !cir.float
+
+ // LLVM: define dso_local float @call_ceilf(float %0)
+ // LLVM: %{{.+}} = call float @llvm.ceil.f32(float %{{.+}})
+ // LLVM: }
+}
+
+double call_ceil(double f) {
+ return ceil(f);
+ // CHECK: cir.func dso_local @call_ceil
+ // CHECK: {{.+}} = cir.ceil {{.+}} : !cir.double
+
+ // LLVM: define dso_local double @call_ceil(double %0)
+ // LLVM: %{{.+}} = call double @llvm.ceil.f64(double %{{.+}})
+ // LLVM: }
+}
+
+long double call_ceill(long double f) {
+ return ceill(f);
+ // CHECK: cir.func dso_local @call_ceill
+ // CHECK: {{.+}} = cir.ceil {{.+}} : !cir.long_double<!cir.f80>
+ // AARCH64: {{.+}} = cir.ceil {{.+}} : !cir.long_double<!cir.double>
+
+ // LLVM: define dso_local x86_fp80 @call_ceill(x86_fp80 %0)
+ // LLVM: %{{.+}} = call x86_fp80 @llvm.ceil.f80(x86_fp80 %{{.+}})
+ // LLVM: }
+}
+
+// cos
+
+float my_cosf(float f) {
+ return __builtin_cosf(f);
+ // CHECK: cir.func dso_local @my_cosf
+ // CHECK: {{.+}} = cir.cos {{.+}} : !cir.float
+
+ // LLVM: define dso_local float @my_cosf(float %0)
+ // LLVM: %{{.+}} = call float @llvm.cos.f32(float %{{.+}})
+ // LLVM: }
+}
+
+double my_cos(double f) {
+ return __builtin_cos(f);
----------------
HendrikHuebner wrote:
Some of these are already implemented and we have tests for them: Please check
out `test/CIR/CodeGenBuiltins/builtins-floating-point.c`. I think you can just
add the ones missing ones to that test instead of adding a new file here.
https://github.com/llvm/llvm-project/pull/175233
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits