[libc-commits] [libc] [libc] Add more elementwise wrapper functions (PR #156515)
Joseph Huber via libc-commits
libc-commits at lists.llvm.org
Tue Sep 2 12:51:01 PDT 2025
https://github.com/jhuber6 updated https://github.com/llvm/llvm-project/pull/156515
>From d80dfb3606f69aa6902df203902410d1f00b10bf Mon Sep 17 00:00:00 2001
From: Joseph Huber <huberjn at outlook.com>
Date: Tue, 2 Sep 2025 13:37:15 -0500
Subject: [PATCH] [libc] Add more elementwise wrapper functions
Summary:
Fills out some of the missing fundamental floating point operations.
These just wrap the elementwise builtin of the same name.
---
libc/src/__support/CPP/simd.h | 53 ++++++++++++++++++-
.../memory_utils/generic/inline_strlen.h | 1 +
2 files changed, 52 insertions(+), 2 deletions(-)
diff --git a/libc/src/__support/CPP/simd.h b/libc/src/__support/CPP/simd.h
index 972f156419d4d..449455c5c0390 100644
--- a/libc/src/__support/CPP/simd.h
+++ b/libc/src/__support/CPP/simd.h
@@ -15,8 +15,8 @@
#include "hdr/stdint_proxy.h"
#include "src/__support/CPP/algorithm.h"
-#include "src/__support/CPP/bit.h"
-#include "src/__support/CPP/type_traits/integral_constant.h"
+#include "src/__support/CPP/limits.h"
+#include "src/__support/CPP/type_traits.h"
#include "src/__support/macros/attributes.h"
#include "src/__support/macros/config.h"
@@ -128,6 +128,55 @@ LIBC_INLINE constexpr simd<T, N> max(simd<T, N> x, simd<T, N> y) {
return __builtin_elementwise_max(x, y);
}
+template <typename T, size_t N>
+LIBC_INLINE constexpr simd<T, N> abs(simd<T, N> x) {
+ return __builtin_elementwise_abs(x);
+}
+template <typename T, size_t N>
+LIBC_INLINE constexpr simd<T, N> fma(simd<T, N> x, simd<T, N> y, simd<T, N> z) {
+ return __builtin_elementwise_fma(x, y, z);
+}
+template <typename T, size_t N>
+LIBC_INLINE constexpr simd<T, N> ceil(simd<T, N> x) {
+ return __builtin_elementwise_ceil(x);
+}
+template <typename T, size_t N>
+LIBC_INLINE constexpr simd<T, N> floor(simd<T, N> x) {
+ return __builtin_elementwise_floor(x);
+}
+template <typename T, size_t N>
+LIBC_INLINE constexpr simd<T, N> roundeven(simd<T, N> x) {
+ return __builtin_elementwise_roundeven(x);
+}
+template <typename T, size_t N>
+LIBC_INLINE constexpr simd<T, N> round(simd<T, N> x) {
+ return __builtin_elementwise_round(x);
+}
+template <typename T, size_t N>
+LIBC_INLINE constexpr simd<T, N> trunc(simd<T, N> x) {
+ return __builtin_elementwise_trunc(x);
+}
+template <typename T, size_t N>
+LIBC_INLINE constexpr simd<T, N> nearbyint(simd<T, N> x) {
+ return __builtin_elementwise_nearbyint(x);
+}
+template <typename T, size_t N>
+LIBC_INLINE constexpr simd<T, N> rint(simd<T, N> x) {
+ return __builtin_elementwise_rint(x);
+}
+template <typename T, size_t N>
+LIBC_INLINE constexpr simd<T, N> canonicalize(simd<T, N> x) {
+ return __builtin_elementwise_canonicalize(x);
+}
+template <typename T, size_t N>
+LIBC_INLINE constexpr simd<T, N> copysign(simd<T, N> x, simd<T, N> y) {
+ return __builtin_elementwise_copysign(x, y);
+}
+template <typename T, size_t N>
+LIBC_INLINE constexpr simd<T, N> fmod(simd<T, N> x, simd<T, N> y) {
+ return __builtin_elementwise_fmod(x, y);
+}
+
// Reduction operations.
template <typename T, size_t N, typename Op = cpp::plus<>>
LIBC_INLINE constexpr T reduce(simd<T, N> v, Op op = {}) {
diff --git a/libc/src/string/memory_utils/generic/inline_strlen.h b/libc/src/string/memory_utils/generic/inline_strlen.h
index 111da35b85eeb..68fba2afb3a5c 100644
--- a/libc/src/string/memory_utils/generic/inline_strlen.h
+++ b/libc/src/string/memory_utils/generic/inline_strlen.h
@@ -9,6 +9,7 @@
#ifndef LLVM_LIBC_SRC_STRING_MEMORY_UTILS_GENERIC_INLINE_STRLEN_H
#define LLVM_LIBC_SRC_STRING_MEMORY_UTILS_GENERIC_INLINE_STRLEN_H
+#include "src/__support/CPP/bit.h"
#include "src/__support/CPP/simd.h"
#include "src/__support/common.h"
More information about the libc-commits
mailing list