Skip to content

Commit 4aeb290

Browse files
authored
[libc] Add more elementwise wrapper functions (#156515)
Summary: Fills out some of the missing fundamental floating point operations. These just wrap the elementwise builtin of the same name.
1 parent 74275a1 commit 4aeb290

File tree

2 files changed

+52
-2
lines changed

2 files changed

+52
-2
lines changed

libc/src/__support/CPP/simd.h

Lines changed: 51 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@
1515

1616
#include "hdr/stdint_proxy.h"
1717
#include "src/__support/CPP/algorithm.h"
18-
#include "src/__support/CPP/bit.h"
19-
#include "src/__support/CPP/type_traits/integral_constant.h"
18+
#include "src/__support/CPP/limits.h"
19+
#include "src/__support/CPP/type_traits.h"
2020
#include "src/__support/macros/attributes.h"
2121
#include "src/__support/macros/config.h"
2222

@@ -128,6 +128,55 @@ LIBC_INLINE constexpr simd<T, N> max(simd<T, N> x, simd<T, N> y) {
128128
return __builtin_elementwise_max(x, y);
129129
}
130130

131+
template <typename T, size_t N>
132+
LIBC_INLINE constexpr simd<T, N> abs(simd<T, N> x) {
133+
return __builtin_elementwise_abs(x);
134+
}
135+
template <typename T, size_t N>
136+
LIBC_INLINE constexpr simd<T, N> fma(simd<T, N> x, simd<T, N> y, simd<T, N> z) {
137+
return __builtin_elementwise_fma(x, y, z);
138+
}
139+
template <typename T, size_t N>
140+
LIBC_INLINE constexpr simd<T, N> ceil(simd<T, N> x) {
141+
return __builtin_elementwise_ceil(x);
142+
}
143+
template <typename T, size_t N>
144+
LIBC_INLINE constexpr simd<T, N> floor(simd<T, N> x) {
145+
return __builtin_elementwise_floor(x);
146+
}
147+
template <typename T, size_t N>
148+
LIBC_INLINE constexpr simd<T, N> roundeven(simd<T, N> x) {
149+
return __builtin_elementwise_roundeven(x);
150+
}
151+
template <typename T, size_t N>
152+
LIBC_INLINE constexpr simd<T, N> round(simd<T, N> x) {
153+
return __builtin_elementwise_round(x);
154+
}
155+
template <typename T, size_t N>
156+
LIBC_INLINE constexpr simd<T, N> trunc(simd<T, N> x) {
157+
return __builtin_elementwise_trunc(x);
158+
}
159+
template <typename T, size_t N>
160+
LIBC_INLINE constexpr simd<T, N> nearbyint(simd<T, N> x) {
161+
return __builtin_elementwise_nearbyint(x);
162+
}
163+
template <typename T, size_t N>
164+
LIBC_INLINE constexpr simd<T, N> rint(simd<T, N> x) {
165+
return __builtin_elementwise_rint(x);
166+
}
167+
template <typename T, size_t N>
168+
LIBC_INLINE constexpr simd<T, N> canonicalize(simd<T, N> x) {
169+
return __builtin_elementwise_canonicalize(x);
170+
}
171+
template <typename T, size_t N>
172+
LIBC_INLINE constexpr simd<T, N> copysign(simd<T, N> x, simd<T, N> y) {
173+
return __builtin_elementwise_copysign(x, y);
174+
}
175+
template <typename T, size_t N>
176+
LIBC_INLINE constexpr simd<T, N> fmod(simd<T, N> x, simd<T, N> y) {
177+
return __builtin_elementwise_fmod(x, y);
178+
}
179+
131180
// Reduction operations.
132181
template <typename T, size_t N, typename Op = cpp::plus<>>
133182
LIBC_INLINE constexpr T reduce(simd<T, N> v, Op op = {}) {

libc/src/string/memory_utils/generic/inline_strlen.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#ifndef LLVM_LIBC_SRC_STRING_MEMORY_UTILS_GENERIC_INLINE_STRLEN_H
1010
#define LLVM_LIBC_SRC_STRING_MEMORY_UTILS_GENERIC_INLINE_STRLEN_H
1111

12+
#include "src/__support/CPP/bit.h"
1213
#include "src/__support/CPP/simd.h"
1314
#include "src/__support/common.h"
1415

0 commit comments

Comments
 (0)