template <typename T, typename U> \
typename enable_if< \
is_same<U, CLASS>::value && is_pod<T>::value, bool>::type \
operator OP(
const T &pod,
const CLASS &obj)
FL_NOEXCEPT { \
return pod OP obj; \
} \
template <typename T> \
typename enable_if<is_pod<T>::value, bool>::type operator OP( \
return obj OP pod; \
}
1020#pragma once
1021
1024
1030
1032
1033
1035
1040
1041
1042
1047 }
1048
1049
1051 return from_raw(simd::platforms::load_u32_4(
reinterpret_cast<const u32*
>(ptr)));
1052 }
1053
1054
1056 simd::platforms::store_u32_4(
reinterpret_cast<u32*
>(ptr),
raw);
1057 }
1058
1059
1061 return from_raw(simd::platforms::set1_u32_4(
static_cast<u32
>(
value.raw())));
1062 }
1063
1064
1065
1068 }
1069
1072 }
1073
1075
1077 }
1078
1080
1081 auto zero = simd::set1_u32_4(0);
1083 }
1084
1087 }
1088
1091 }
1092
1093
1094
1096
1097
1098
1101
1102 auto mask = simd::sra_i32_4(
raw, 31);
1103
1104 auto flipped = simd::xor_u32_4(
raw, mask);
1105 return from_raw(simd::sub_i32_4(flipped, mask));
1106 }
1107
1111 }
1112
1116 }
1117
1121 }
1122
1127 auto diff = b - (*this);
1128 return (*this) + (diff * t_vec);
1129 }
1130
1134
1135
1136 static constexpr i32 RAD_TO_24 = 2670177;
1137
1138
1139 auto angles_u32 = simd::mulhi_su32_4(
raw, simd::set1_u32_4(
static_cast<u32
>(RAD_TO_24)));
1140
1141
1143
1144
1145 out_sin =
from_raw(simd::sra_i32_4(sc.sin_vals, 15));
1146 out_cos =
from_raw(simd::sra_i32_4(sc.cos_vals, 15));
1147 }
1148
1151 s16x16x4 sin_out, cos_out;
1152 sincos(sin_out, cos_out);
1153 return sin_out;
1154 }
1155
1158 s16x16x4 sin_out, cos_out;
1159 sincos(sin_out, cos_out);
1160 return cos_out;
1161 }
1162};
1163
1164
1165
1167
1168}
Alignment macros and utilities for FastLED.
platforms::simd_u32x4 simd_u32x4
constexpr int type_rank< T >::value
FASTLED_FORCE_INLINE SinCos32_simd sincos32_simd(simd::simd_u32x4 angles) FL_NOEXCEPT
Process 4 angles simultaneously, returning vectorized sin/cos values SIMD-optimized: vectorized angle...
expected< T, E > result
Alias for expected (Rust-style naming)
Base definition for an LED controller.
#define FASTLED_FORCE_INLINE
Umbrella header for SIMD subsystem.
Cross-type SIMD fixed-point operations (implemented after all types are defined)
4-wide s0x32 vector (normalized values [-1, 1]) Backed by 128-bit SIMD register (4× i32 in Q31 format...
FASTLED_FORCE_INLINE s16x16x4 min(s16x16x4 b) const
Element-wise minimum.
FASTLED_FORCE_INLINE s16x16x4 clamp(s16x16x4 lo, s16x16x4 hi) const
Clamp to [lo, hi].
FASTLED_FORCE_INLINE s16x16x4 cos() const
Compute cosine of 4 angles (in radians)
FASTLED_FORCE_INLINE s16x16x4 operator-() const
FASTLED_FORCE_INLINE s16x16x4 operator*(s16x16x4 b) const
FASTLED_FORCE_INLINE void store(s16x16 *ptr) const
FASTLED_FORCE_INLINE void sincos(s16x16x4 &out_sin, s16x16x4 &out_cos) const
Compute sin and cos of 4 angles (in radians) Results written to out_sin and out_cos.
FASTLED_FORCE_INLINE s16x16x4 sin() const
Compute sine of 4 angles (in radians)
FASTLED_FORCE_INLINE s16x16x4 abs() const
Absolute value: branchless via mask and xor.
FASTLED_FORCE_INLINE s16x16x4 operator>>(int shift) const
static FASTLED_FORCE_INLINE s16x16x4 from_raw(simd::simd_u32x4 r)
FASTLED_FORCE_INLINE s16x16x4 operator<<(int shift) const
FASTLED_FORCE_INLINE s16x16x4 max(s16x16x4 b) const
Element-wise maximum.
static FASTLED_FORCE_INLINE s16x16x4 load(const s16x16 *ptr)
static FASTLED_FORCE_INLINE s16x16x4 set1(s16x16 value)
FASTLED_FORCE_INLINE s16x16x4 lerp(s16x16x4 b, s16x16 t) const
Linear interpolation: a + (b - a) * t (using Q16 multiply) t: s16x16 interpolation factor in [0,...
FASTLED_FORCE_INLINE s16x16x4 operator+(s16x16x4 b) const
4-wide s16x16 vector (general fixed-point) Backed by 128-bit SIMD register (4× i32 in Q16 format)