LMMS
Loading...
Searching...
No Matches
juce_SIMDRegister.h
Go to the documentation of this file.
1/*
2 ==============================================================================
3
4 This file is part of the JUCE library.
5 Copyright (c) 2022 - Raw Material Software Limited
6
7 JUCE is an open source library subject to commercial or open-source
8 licensing.
9
10 By using JUCE, you agree to the terms of both the JUCE 7 End-User License
11 Agreement and JUCE Privacy Policy.
12
13 End User License Agreement: www.juce.com/juce-7-licence
14 Privacy Policy: www.juce.com/juce-privacy-policy
15
16 Or: You may also use this code under the terms of the GPL v3 (see
17 www.gnu.org/licenses).
18
19 JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
20 EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
21 DISCLAIMED.
22
23 ==============================================================================
24*/
25
26namespace juce
27{
28namespace dsp
29{
30
31#ifndef DOXYGEN
32 // This class is needed internally.
33 template <typename Scalar>
34 struct CmplxSIMDOps;
35#endif
36
37//==============================================================================
61template <typename Type>
63{
64 //==============================================================================
66 using ElementType = Type;
67
70
74
75 //==============================================================================
76 // Here are some types which are needed internally
77
80
83
85 using vSIMDType = typename NativeOps::vSIMDType;
86
89
92
96
99 struct ElementAccess;
100
101 //==============================================================================
103 static constexpr size_t SIMDRegisterSize = sizeof (vSIMDType);
104
106 static constexpr size_t SIMDNumElements = SIMDRegisterSize / sizeof (ElementType);
107
109
111 inline SIMDRegister() noexcept = default;
112
115
117 inline SIMDRegister (Type s) noexcept { *this = s; }
118
119 //==============================================================================
121 static constexpr size_t size() noexcept { return SIMDNumElements; }
122
123 //==============================================================================
127
130 static SIMDRegister JUCE_VECTOR_CALLTYPE fromNative (vSIMDType a) noexcept { return {a}; }
131
134 {
136 return {CmplxOps::load (a)};
137 }
138
140 inline void JUCE_VECTOR_CALLTYPE copyToRawArray (ElementType* a) const noexcept
141 {
144 }
145
146 //==============================================================================
149 inline ElementType JUCE_VECTOR_CALLTYPE get (size_t idx) const noexcept
150 {
151 jassert (idx < SIMDNumElements);
152 return CmplxOps::get (value, idx);
153 }
154
157 inline void JUCE_VECTOR_CALLTYPE set (size_t idx, ElementType v) noexcept
158 {
159 jassert (idx < SIMDNumElements);
160 value = CmplxOps::set (value, idx, v);
161 }
162
163 //==============================================================================
166 inline ElementType JUCE_VECTOR_CALLTYPE operator[] (size_t idx) const noexcept
167 {
168 return get (idx);
169 }
170
173 inline ElementAccess JUCE_VECTOR_CALLTYPE operator[] (size_t idx) noexcept
174 {
175 jassert (idx < SIMDNumElements);
176 return ElementAccess (*this, idx);
177 }
178
179 //==============================================================================
181 inline SIMDRegister& JUCE_VECTOR_CALLTYPE operator+= (SIMDRegister v) noexcept { value = NativeOps::add (value, v.value); return *this; }
182
184 inline SIMDRegister& JUCE_VECTOR_CALLTYPE operator-= (SIMDRegister v) noexcept { value = NativeOps::sub (value, v.value); return *this; }
185
187 inline SIMDRegister& JUCE_VECTOR_CALLTYPE operator*= (SIMDRegister v) noexcept { value = CmplxOps::mul (value, v.value); return *this; }
188
189 //==============================================================================
191 inline SIMDRegister& JUCE_VECTOR_CALLTYPE operator= (ElementType s) noexcept { value = CmplxOps::expand (s); return *this; }
192
194 inline SIMDRegister& JUCE_VECTOR_CALLTYPE operator+= (ElementType s) noexcept { value = NativeOps::add (value, CmplxOps::expand (s)); return *this; }
195
197 inline SIMDRegister& JUCE_VECTOR_CALLTYPE operator-= (ElementType s) noexcept { value = NativeOps::sub (value, CmplxOps::expand (s)); return *this; }
198
200 inline SIMDRegister& JUCE_VECTOR_CALLTYPE operator*= (ElementType s) noexcept { value = CmplxOps::mul (value, CmplxOps::expand (s)); return *this; }
201
202 //==============================================================================
204 inline SIMDRegister& JUCE_VECTOR_CALLTYPE operator&= (vMaskType v) noexcept { value = NativeOps::bit_and (value, toVecType (v.value)); return *this; }
205
207 inline SIMDRegister& JUCE_VECTOR_CALLTYPE operator|= (vMaskType v) noexcept { value = NativeOps::bit_or (value, toVecType (v.value)); return *this; }
208
210 inline SIMDRegister& JUCE_VECTOR_CALLTYPE operator^= (vMaskType v) noexcept { value = NativeOps::bit_xor (value, toVecType (v.value)); return *this; }
211
212 //==============================================================================
214 inline SIMDRegister& JUCE_VECTOR_CALLTYPE operator&= (MaskType s) noexcept { value = NativeOps::bit_and (value, toVecType (s)); return *this; }
215
217 inline SIMDRegister& JUCE_VECTOR_CALLTYPE operator|= (MaskType s) noexcept { value = NativeOps::bit_or (value, toVecType (s)); return *this; }
218
220 inline SIMDRegister& JUCE_VECTOR_CALLTYPE operator^= (MaskType s) noexcept { value = NativeOps::bit_xor (value, toVecType (s)); return *this; }
221
222 //==============================================================================
224 inline SIMDRegister JUCE_VECTOR_CALLTYPE operator+ (SIMDRegister v) const noexcept { return { NativeOps::add (value, v.value) }; }
225
227 inline SIMDRegister JUCE_VECTOR_CALLTYPE operator- (SIMDRegister v) const noexcept { return { NativeOps::sub (value, v.value) }; }
228
230 inline SIMDRegister JUCE_VECTOR_CALLTYPE operator* (SIMDRegister v) const noexcept { return { CmplxOps::mul (value, v.value) }; }
231
232 //==============================================================================
234 inline SIMDRegister JUCE_VECTOR_CALLTYPE operator+ (ElementType s) const noexcept { return { NativeOps::add (value, CmplxOps::expand (s)) }; }
235
237 inline SIMDRegister JUCE_VECTOR_CALLTYPE operator- (ElementType s) const noexcept { return { NativeOps::sub (value, CmplxOps::expand (s)) }; }
238
240 inline SIMDRegister JUCE_VECTOR_CALLTYPE operator* (ElementType s) const noexcept { return { CmplxOps::mul (value, CmplxOps::expand (s)) }; }
241
242 //==============================================================================
244 inline SIMDRegister JUCE_VECTOR_CALLTYPE operator& (vMaskType v) const noexcept { return { NativeOps::bit_and (value, toVecType (v.value)) }; }
245
247 inline SIMDRegister JUCE_VECTOR_CALLTYPE operator| (vMaskType v) const noexcept { return { NativeOps::bit_or (value, toVecType (v.value)) }; }
248
250 inline SIMDRegister JUCE_VECTOR_CALLTYPE operator^ (vMaskType v) const noexcept { return { NativeOps::bit_xor (value, toVecType (v.value)) }; }
251
253 inline SIMDRegister JUCE_VECTOR_CALLTYPE operator~() const noexcept { return { NativeOps::bit_not (value) }; }
254
255 //==============================================================================
257 inline SIMDRegister JUCE_VECTOR_CALLTYPE operator& (MaskType s) const noexcept { return { NativeOps::bit_and (value, toVecType (s)) }; }
258
260 inline SIMDRegister JUCE_VECTOR_CALLTYPE operator| (MaskType s) const noexcept { return { NativeOps::bit_or (value, toVecType (s)) }; }
261
263 inline SIMDRegister JUCE_VECTOR_CALLTYPE operator^ (MaskType s) const noexcept { return { NativeOps::bit_xor (value, toVecType (s)) }; }
264
265 //==============================================================================
267 inline bool JUCE_VECTOR_CALLTYPE operator== (SIMDRegister other) const noexcept { return NativeOps::allEqual (value, other.value); }
268
270 inline bool JUCE_VECTOR_CALLTYPE operator!= (SIMDRegister other) const noexcept { return ! (*this == other); }
271
273 inline bool JUCE_VECTOR_CALLTYPE operator== (Type s) const noexcept { return *this == SIMDRegister::expand (s); }
274
276 inline bool JUCE_VECTOR_CALLTYPE operator!= (Type s) const noexcept { return ! (*this == s); }
277
278 //==============================================================================
282 static vMaskType JUCE_VECTOR_CALLTYPE equal (SIMDRegister a, SIMDRegister b) noexcept { return toMaskType (NativeOps::equal (a.value, b.value)); }
283
287 static vMaskType JUCE_VECTOR_CALLTYPE notEqual (SIMDRegister a, SIMDRegister b) noexcept { return toMaskType (NativeOps::notEqual (a.value, b.value)); }
288
292 static vMaskType JUCE_VECTOR_CALLTYPE lessThan (SIMDRegister a, SIMDRegister b) noexcept { return toMaskType (NativeOps::greaterThan (b.value, a.value)); }
293
297 static vMaskType JUCE_VECTOR_CALLTYPE lessThanOrEqual (SIMDRegister a, SIMDRegister b) noexcept { return toMaskType (NativeOps::greaterThanOrEqual (b.value, a.value)); }
298
302 static vMaskType JUCE_VECTOR_CALLTYPE greaterThan (SIMDRegister a, SIMDRegister b) noexcept { return toMaskType (NativeOps::greaterThan (a.value, b.value)); }
303
307 static vMaskType JUCE_VECTOR_CALLTYPE greaterThanOrEqual (SIMDRegister a, SIMDRegister b) noexcept { return toMaskType (NativeOps::greaterThanOrEqual (a.value, b.value)); }
308
309 //==============================================================================
311 static SIMDRegister JUCE_VECTOR_CALLTYPE min (SIMDRegister a, SIMDRegister b) noexcept { return { NativeOps::min (a.value, b.value) }; }
312
314 static SIMDRegister JUCE_VECTOR_CALLTYPE max (SIMDRegister a, SIMDRegister b) noexcept { return { NativeOps::max (a.value, b.value) }; }
315
316 //==============================================================================
319 {
320 return { CmplxOps::muladd (a.value, b.value, c.value) };
321 }
322
323 //==============================================================================
326
327 //==============================================================================
330 static SIMDRegister JUCE_VECTOR_CALLTYPE truncate (SIMDRegister a) noexcept { return { NativeOps::truncate (a.value) }; }
331
332 //==============================================================================
335 {
336 return a - (a * (expand (ElementType (2)) & lessThan (a, expand (ElementType (0)))));
337 }
338
339 //==============================================================================
341 static bool isSIMDAligned (const ElementType* ptr) noexcept
342 {
343 uintptr_t bitmask = SIMDRegisterSize - 1;
344 return (reinterpret_cast<uintptr_t> (ptr) & bitmask) == 0;
345 }
346
356
357private:
359 {
360 union
361 {
364 } u;
365
366 u.in = a;
367 return vMaskType::fromNative (u.out);
368 }
369
371 {
372 union
373 {
376 } u;
377
378 u.in = a;
379 return u.out;
380 }
381
383 {
384 union
385 {
388 } u;
389
391 return u.out;
392 }
393};
394
395} // namespace dsp
396} // namespace juce
397
398#ifndef DOXYGEN
399 #include "juce_SIMDRegister_Impl.h"
400#endif
#define noexcept
Definition DistrhoDefines.h:72
uint8_t a
Definition Spc_Cpu.h:141
unsigned v[N_MAX]
Definition inflate.c:1584
struct huft * u[BMAX]
Definition inflate.c:1583
unsigned s
Definition inflate.c:1555
#define jassert(expression)
#define JUCE_VECTOR_CALLTYPE
Definition juce_dsp.h:100
float in
Definition lilv_test.c:1460
float out
Definition lilv_test.c:1461
Definition juce_AudioBlock.h:29
Definition carla_juce.cpp:31
jack_client_t client jack_client_t client jack_client_t client jack_client_t JackInfoShutdownCallback void arg jack_client_t jack_port_t port void func jack_client_t const char const char unsigned long flags const jack_port_t port jack_client_t jack_port_id_t port_id const jack_port_t const char port_name const jack_port_t port void * ptr
Definition juce_linux_JackAudio.cpp:79
Type * snapPointerToAlignment(Type *basePointer, IntegerType alignmentBytes) noexcept
Definition juce_Memory.h:45
Definition juce_SIMDRegister_Impl.h:56
static vSIMDType JUCE_VECTOR_CALLTYPE load(const ElementType *a) noexcept
Definition juce_SIMDRegister_Impl.h:59
static void JUCE_VECTOR_CALLTYPE store(vSIMDType value, ElementType *dest) noexcept
Definition juce_SIMDRegister_Impl.h:64
static ElementType JUCE_VECTOR_CALLTYPE sum(vSIMDType a) noexcept
Definition juce_SIMDRegister_Impl.h:84
static vSIMDType JUCE_VECTOR_CALLTYPE muladd(vSIMDType a, vSIMDType b, vSIMDType c) noexcept
Definition juce_SIMDRegister_Impl.h:94
static vSIMDType JUCE_VECTOR_CALLTYPE mul(vSIMDType a, vSIMDType b) noexcept
Definition juce_SIMDRegister_Impl.h:89
static vSIMDType JUCE_VECTOR_CALLTYPE set(vSIMDType v, std::size_t i, ElementType s) noexcept
Definition juce_SIMDRegister_Impl.h:79
static vSIMDType JUCE_VECTOR_CALLTYPE expand(ElementType s) noexcept
Definition juce_SIMDRegister_Impl.h:69
static ElementType JUCE_VECTOR_CALLTYPE get(vSIMDType v, std::size_t i) noexcept
Definition juce_SIMDRegister_Impl.h:74
Primitive type
Definition juce_fallback_SIMDNativeOps.h:34
typename std::remove_cv< Primitive >::type type
Definition juce_fallback_SIMDNativeOps.h:45
Definition juce_avx_SIMDNativeOps.h:52
static SIMDRegister JUCE_VECTOR_CALLTYPE truncate(SIMDRegister a) noexcept
Definition juce_SIMDRegister.h:330
static SIMDRegister JUCE_VECTOR_CALLTYPE expand(ElementType s) noexcept
Definition juce_SIMDRegister.h:126
typename NativeOps::vSIMDType vSIMDType
Definition juce_SIMDRegister.h:85
ElementType sum() const noexcept
Definition juce_SIMDRegister.h:325
void JUCE_VECTOR_CALLTYPE copyToRawArray(ElementType *a) const noexcept
Definition juce_SIMDRegister.h:140
static SIMDRegister JUCE_VECTOR_CALLTYPE max(SIMDRegister a, SIMDRegister b) noexcept
Definition juce_SIMDRegister.h:314
static vMaskType JUCE_VECTOR_CALLTYPE toMaskType(vSIMDType a) noexcept
Definition juce_SIMDRegister.h:358
static ElementType * getNextSIMDAlignedPtr(ElementType *ptr) noexcept
Definition juce_SIMDRegister.h:352
static vMaskType JUCE_VECTOR_CALLTYPE greaterThanOrEqual(SIMDRegister a, SIMDRegister b) noexcept
Definition juce_SIMDRegister.h:307
static vMaskType JUCE_VECTOR_CALLTYPE greaterThan(SIMDRegister a, SIMDRegister b) noexcept
Definition juce_SIMDRegister.h:302
static bool isSIMDAligned(const ElementType *ptr) noexcept
Definition juce_SIMDRegister.h:341
static SIMDRegister JUCE_VECTOR_CALLTYPE abs(SIMDRegister a) noexcept
Definition juce_SIMDRegister.h:334
SIMDRegister< MaskType > vMaskType
Definition juce_SIMDRegister.h:88
static constexpr size_t SIMDRegisterSize
Definition juce_SIMDRegister.h:103
static vMaskType JUCE_VECTOR_CALLTYPE equal(SIMDRegister a, SIMDRegister b) noexcept
Definition juce_SIMDRegister.h:282
ElementType JUCE_VECTOR_CALLTYPE get(size_t idx) const noexcept
Definition juce_SIMDRegister.h:149
SIMDNativeOps< PrimitiveType > NativeOps
Definition juce_SIMDRegister.h:82
vSIMDType value
Definition juce_SIMDRegister.h:108
static SIMDRegister JUCE_VECTOR_CALLTYPE multiplyAdd(SIMDRegister a, const SIMDRegister b, SIMDRegister c) noexcept
Definition juce_SIMDRegister.h:318
static constexpr size_t size() noexcept
Definition juce_SIMDRegister.h:121
static vSIMDType JUCE_VECTOR_CALLTYPE toVecType(vMaskSIMDType a) noexcept
Definition juce_SIMDRegister.h:370
static vMaskType JUCE_VECTOR_CALLTYPE lessThan(SIMDRegister a, SIMDRegister b) noexcept
Definition juce_SIMDRegister.h:292
SIMDRegister() noexcept=default
Type ElementType
Definition juce_SIMDRegister.h:66
static SIMDRegister JUCE_VECTOR_CALLTYPE min(SIMDRegister a, SIMDRegister b) noexcept
Definition juce_SIMDRegister.h:311
static vSIMDType JUCE_VECTOR_CALLTYPE toVecType(MaskType a) noexcept
Definition juce_SIMDRegister.h:382
static constexpr size_t SIMDNumElements
Definition juce_SIMDRegister.h:106
typename vMaskType::vSIMDType vMaskSIMDType
Definition juce_SIMDRegister.h:91
void JUCE_VECTOR_CALLTYPE set(size_t idx, ElementType v) noexcept
Definition juce_SIMDRegister.h:157
static vMaskType JUCE_VECTOR_CALLTYPE lessThanOrEqual(SIMDRegister a, SIMDRegister b) noexcept
Definition juce_SIMDRegister.h:297
SIMDRegister JUCE_VECTOR_CALLTYPE operator~() const noexcept
Definition juce_SIMDRegister.h:253
SIMDRegister(Type s) noexcept
Definition juce_SIMDRegister.h:117
static SIMDRegister JUCE_VECTOR_CALLTYPE fromNative(vSIMDType a) noexcept
Definition juce_SIMDRegister.h:130
typename SIMDInternal::MaskTypeFor< ElementType >::type MaskType
Definition juce_SIMDRegister.h:73
CmplxSIMDOps< ElementType > CmplxOps
Definition juce_SIMDRegister.h:95
typename SIMDInternal::PrimitiveType< ElementType >::type PrimitiveType
Definition juce_SIMDRegister.h:79
static SIMDRegister JUCE_VECTOR_CALLTYPE fromRawArray(const ElementType *a) noexcept
Definition juce_SIMDRegister.h:133
static vMaskType JUCE_VECTOR_CALLTYPE notEqual(SIMDRegister a, SIMDRegister b) noexcept
Definition juce_SIMDRegister.h:287
ElementType value_type
Definition juce_SIMDRegister.h:69
return c
Definition crypt.c:175
b
Definition crypt.c:628
#define const
Definition zconf.h:137