37 static const poly_float kLagrangeOne(0.0f, 1.0f, 0.0f, 0.0f);
38 static const poly_float kLagrangeTwo(-1.0f, -1.0f, 1.0f, 1.0f);
39 static const poly_float kLagrangeThree(-2.0f, -2.0f, -2.0f, -1.0f);
40 static const poly_float kLagrangeMult(-1.0f / 6.0f, 1.0f / 2.0f, -1.0f / 2.0f, 1.0f / 6.0f);
45 static const poly_float kOptimalOne(0.00224072707074864375f, 0.20184198969656244725f,
46 0.59244492420272312725f, 0.20345744715566445625f);
47 static const poly_float kOptimalTwo(-0.0059513775678254975f, -0.456633315206820491f,
48 -0.035736698832993691f, 0.4982319203618311775f);
49 static const poly_float kOptimalThree(0.093515484757265265f, 0.294278871937834749f,
50 -0.786648885977648931f, 0.398765058036740415f);
51 static const poly_float kOptimalFour(-0.10174985775982505f, 0.36030925263849456f,
52 -0.36030925263849456f, 0.10174985775982505f);
82 template<mono_
float(*func)(mono_
float)>
85 for (
int i = 0; i < poly_float::kSize; ++i)
86 result.
set(i, func(value[i]));
171 return _mm256_sqrt_ps(value.
value);
173 return _mm_sqrt_ps(value.
value);
183 return mulAdd(from, to - from, t);
191 return kLagrangeMult * (t + kLagrangeOne) * (t + kLagrangeTwo) * (t + kLagrangeThree);
199 return ((kOptimalFour * t + kOptimalThree) * t + kOptimalTwo) * t + kOptimalOne;
206 static constexpr mono_float kMultPrev = -1.0f / 6.0f;
207 static constexpr mono_float kMultFrom = 1.0f / 2.0f;
208 static constexpr mono_float kMultTo = -1.0f / 2.0f;
209 static constexpr mono_float kMultNext = 1.0f / 6.0f;
218 return matrix(t_from * t_to_next * kMultPrev,
219 t_prev * t_to_next * kMultFrom,
220 t_prev_from * t_next * kMultTo,
221 t_prev_from * t_to * kMultNext);
233 return matrix(half_t2 * 2.0f - half_t3 - half_t,
234 mulSub(half_three_t3, half_t2, 5.0f) + 1.0f,
235 mulAdd(half_t, half_t2, 4.0f) - half_three_t3,
251 return _mm256_loadu_ps(unaligned);
253 return _mm_loadu_ps(unaligned);
255 return vld1q_f32(unaligned);
283 return mulAdd(from, to - from, t);
290 return mulAdd(from, to - from, t);
299 poly_float interpolate_t = t * t * (t * -2.0f + 3.0f);
300 return interpolate(interpolate_from, interpolate_to, interpolate_t) * 2.0f;
352 poly_float old_values = zero_value & ~reset_mask;
353 poly_float new_values = one_value & reset_mask;
355 return old_values + new_values;
362 poly_int old_values = zero_value & ~reset_mask;
363 poly_int new_values = one_value & reset_mask;
365 return old_values | new_values;
375 return maskLoad(lower, value, less_mask);
390 int size = poly_float::kSize;
391 for (
int i = 0; i < size; ++i)
392 result.
set(i, powf(base[i], exponent[i]));
401 for (
int i = 0; i < length; ++i) {
403 silent_mask &= zero_mask;
413 return _mm256_shuffle_ps(value.
value, value.
value, _MM_SHUFFLE(2, 3, 0, 1));
415 return _mm_shuffle_ps(value.
value, value.
value, _MM_SHUFFLE(2, 3, 0, 1));
417 return vrev64q_f32(value.
value);
426 return _mm256_shuffle_epi32(value.
value, _MM_SHUFFLE(2, 3, 0, 1));
428 return _mm_shuffle_epi32(value.
value, _MM_SHUFFLE(2, 3, 0, 1));
430 return vrev64q_u32(value.
value);
439 return _mm256_shuffle_ps(value.
value, value.
value, _MM_SHUFFLE(1, 0, 3, 2));
441 return _mm_shuffle_ps(value.
value, value.
value, _MM_SHUFFLE(1, 0, 3, 2));
443 return vextq_f32(value.
value, value.
value, 2);
452 return _mm256_shuffle_epi32(value.
value, value.
value, _MM_SHUFFLE(1, 0, 3, 2));
454 return _mm_shuffle_epi32(value.
value, _MM_SHUFFLE(1, 0, 3, 2));
456 return vextq_u32(value.
value, value.
value, 2);
465 return _mm256_shuffle_ps(value.
value, value.
value, _MM_SHUFFLE(3, 1, 2, 0));
467 return _mm_shuffle_ps(value.
value, value.
value, _MM_SHUFFLE(3, 1, 2, 0));
469 float32x4_t rotated = vextq_f32(value.
value, value.
value, 2);
470 float32x4x2_t zipped = vzipq_f32(value.
value, rotated);
471 return zipped.val[0];
480 return _mm256_shuffle_ps(value.
value, value.
value, _MM_SHUFFLE(0, 1, 2, 3));
482 return _mm_shuffle_ps(value.
value, value.
value, _MM_SHUFFLE(0, 1, 2, 3));
493 return _mm256_unpacklo_ps(one.
value, two.
value);
497 return vzipq_f32(one.
value, two.
value).val[0];
506 return _mm256_shuffle_ps(one.
value, two.
value, _MM_SHUFFLE(1, 0, 1, 0));
508 return _mm_shuffle_ps(one.
value, two.
value, _MM_SHUFFLE(1, 0, 1, 0));
510 return vcombine_f32(vget_low_f32(one.
value), vget_low_f32(two.
value));
559 for (
int i = 0; i < num; i += skip) {
571 for (
int i = 0; i < size; ++i)
579 for (
int i = 0; i < size; ++i)
587 for (
int i = 0; i < size; ++i)
595 for (
int i = 0; i < size; ++i)
603 for (
int i = 0; i < size; ++i)
604 dest[i] = b1[i] + b2[i];
611 for (
int i = 0; i < poly_float::kSize; ++i) {
613 if (!std::isfinite(val))
625 return (greater_mask.
sum() + less_than_mask.
sum()) == 0;
633 return isInRange(value, -kRange, kRange);
640 for (
int i = 0; i < size; ++i) {
651 for (
int i = 0; i < size; ++i) {
663 return isInRange(buffer, size, -kRange, kRange);
671 return isSilent(mono_buffer, size * poly_float::kSize);
679 for (
int i = 0; i < poly_float::kSize; ++i) {
680 int index = indices[i];
681 result.
set(i, buffer[index]);
691 for (
int i = 0; i < poly_float::kSize; ++i) {
692 int index = indices[i];
693 value.
set(i, buffer[index]);
694 next.
set(i, buffer[index + 1]);
703 for (
int i = 0; i < poly_float::kSize; ++i) {
704 int index = indices[i];
705 result.
set(i, buffers[i][index]);
716 for (
int i = 0; i < poly_float::kSize; ++i) {
717 int index = indices[i];
718 value.
set(i, buffers[i][index]);
719 next.
set(i, buffers[i][index + 1]);
727 return power * value / ((power - 1.0f) * value + 1.0f);
737 return _mm256_cvtepi32_ps(integers.
value);
739 return _mm_cvtepi32_ps(integers.
value);
741 return vcvtq_f32_s32(vreinterpretq_s32_u32(integers.
value));
752 return _mm256_cvtps_epi32(floats.
value);
754 return _mm_cvtps_epi32(floats.
value);
756 return vreinterpretq_u32_s32(vcvtq_s32_f32(floats.
value));
808 return floor(value + 0.5f);
815 return value -
floor(value);
823 return _mm256_castsi256_ps(value.
value);
825 return _mm_castsi128_ps(value.
value);
827 return vreinterpretq_f32_u32(value.
value);
836 return _mm256_castps_si256(value.
value);
838 return _mm_castps_si128(value.
value);
840 return vreinterpretq_u32_f32(value.
value);
844 template<
size_t shift>
847 return _mm256_srli_epi32(integers.value, shift);
849 return _mm_srli_epi32(integer.
value, shift);
851 return vshrq_n_u32(integer.
value, shift);
855 template<
size_t shift>
858 return _mm256_slli_epi32(integers.value, shift);
860 return _mm_slli_epi32(integer.
value, shift);
862 return vshlq_n_u32(integer.
value, shift);
887 for (
int i = 0; i < poly_float::kSize; ++i) {
888 double freq = frequency[i];
889 double cycles = freq * seconds;
899 int sample_rate,
int oversample_amount) {
900 double tick_time = (1.0 * oversample_amount) / sample_rate;
901 double seconds_passed = tick_time * samples;
910 poly_float tranpose_from_octave = transpose - octave_floored;
912 poly_float transpose_in_octave = tranpose_from_octave;
918 transpose_in_octave =
utils::maskLoad(transpose_in_octave, i, best_mask);
922 return octave_floored + transpose_in_octave;
929 float min_snap = 0.0f;
930 float max_snap = 0.0f;
932 if ((transpose_quantize >> i) & 1) {
934 if (min_snap == 0.0f)
944 snap_buffer[i] = offset;
949 if (offset < snap_buffer[i])
950 snap_buffer[i] = i + offset;
951 else if (snap_buffer[i] != 0.0f)
952 snap_buffer[i] = i - snap_buffer[i];
973 return quantize & kTransposeMask;
991 return { phase, voice };
#define VITAL_ASSERT(x)
Definition common.h:11
#define force_inline
Definition common.h:23
Contains a collection of utility functions and classes used throughout Vital.
const poly_float kStereoSplit
Splits stereo channels into left and right components.
Definition synth_constants.h:251
force_inline poly_float mod(poly_float value)
Returns the fractional part of each lane by subtracting the floored value.
Definition poly_utils.h:814
force_inline poly_float pow2ToFloat(poly_int value)
Definition poly_utils.h:866
force_inline poly_float cos(poly_float value)
Computes the cosine of each element (in radians).
Definition poly_utils.h:164
force_inline void addBuffers(poly_float *dest, const poly_float *b1, const poly_float *b2, int size)
Adds two poly_float buffers element-by-element, storing in dest.
Definition poly_utils.h:602
force_inline poly_int reinterpretToInt(poly_float value)
Reinterprets a poly_float as a poly_int (bitcast).
Definition poly_utils.h:834
force_inline poly_float clamp(poly_float value, mono_float min, mono_float max)
Clamps each lane of a vector to [min, max].
Definition poly_utils.h:306
force_inline bool isSilent(const poly_float *buffer, int size)
Determines if the entire buffer is silent (very close to zero).
Definition poly_utils.h:669
force_inline poly_float trunc(poly_float value)
Returns the truncated value of each lane in value.
Definition poly_utils.h:770
force_inline poly_float triangleWave(poly_float t)
Generates a simple triangle wave [0..1] from a fraction t in [0..1].
Definition poly_utils.h:873
force_inline void adjacentGatherSeparate(const mono_float *const *buffers, const poly_int &indices, poly_float &value, poly_float &next)
Similar to adjacentGather but for separate buffers.
Definition poly_utils.h:713
force_inline poly_float consolidateAudio(poly_float one, poly_float two)
Interleaves two stereo poly_floats into a single vector with left channels first, then right channels...
Definition poly_utils.h:491
force_inline bool isFinite(poly_float value)
Checks if all lanes in a poly_float are finite.
Definition poly_utils.h:610
force_inline void zeroBuffer(mono_float *buffer, int size)
Zeros a mono buffer (standard array).
Definition poly_utils.h:570
constexpr unsigned int kNotePressedMask
A bitmask used in voice encoding for note-on states.
Definition poly_utils.h:26
force_inline poly_float toFloat(poly_int integers)
Casts a poly_int to poly_float lane-by-lane.
Definition poly_utils.h:733
force_inline poly_float encodePhaseAndVoice(poly_float phase, poly_float voice)
Encodes a phase [0..1) and a voice index into a single float, storing the voice in the integer portio...
Definition poly_utils.h:979
force_inline bool isTransposeQuantizeGlobal(int quantize)
Checks if the transpose quantize mask applies globally (over multiple octaves).
Definition poly_utils.h:964
force_inline poly_float reinterpretToFloat(poly_int value)
Reinterprets a poly_int as a poly_float (bitcast).
Definition poly_utils.h:821
force_inline void fillSnapBuffer(int transpose_quantize, float *snap_buffer)
Fills a buffer with snap offsets for a given quantize mask.
Definition poly_utils.h:928
force_inline poly_float encodeMidSide(poly_float value)
Converts an L/R stereo representation into M/S (mid/side) encoding.
Definition poly_utils.h:543
force_inline poly_float peak(const poly_float *buffer, int num, int skip=1)
Returns the peak magnitude of a buffer (considering both positive and negative values).
Definition poly_utils.h:557
force_inline poly_float decodeMidSide(poly_float value)
Converts a mid/side encoded stereo value back to L/R (decodes).
Definition poly_utils.h:550
force_inline poly_float mulAdd(poly_float a, poly_float b, poly_float c)
Performs a fused multiply-add on SIMD data: (a * b) + c.
Definition poly_utils.h:61
force_inline poly_float round(poly_float value)
Rounds each lane to the nearest integer as a poly_float.
Definition poly_utils.h:807
force_inline poly_float modOnce(poly_float value)
A special mod operation that ensures the result stays below 1.0, subtracting 1.0 if needed.
Definition poly_utils.h:372
force_inline poly_int roundToInt(poly_float value)
Rounds each lane to the nearest integer.
Definition poly_utils.h:792
force_inline poly_float floor(poly_float value)
Floors each lane in value.
Definition poly_utils.h:777
force_inline poly_float swapInner(poly_float value)
Reorders internal stereo lanes.
Definition poly_utils.h:463
force_inline poly_float tan(poly_float value)
Computes the tangent of each element (in radians) in a poly_float.
Definition poly_utils.h:154
force_inline poly_float min(poly_float left, poly_float right)
Returns the minimum of two poly_floats lane-by-lane.
Definition poly_utils.h:334
constexpr mono_float kPhaseEncodingMultiplier
Used as a multiplier when encoding phase and voice data in a single float.
Definition poly_utils.h:21
force_inline poly_mask closeToZeroMask(poly_float value)
Returns a mask where lanes are true if value is close to 0.
Definition poly_utils.h:381
force_inline poly_float getCycleOffsetFromSamples(long long samples, poly_float frequency, int sample_rate, int oversample_amount)
Computes a cycle offset given a sample count, frequency, sample rate, and oversampling factor.
Definition poly_utils.h:898
force_inline poly_float getCycleOffsetFromSeconds(double seconds, poly_float frequency)
Computes a cycle offset given a time in seconds and a frequency.
Definition poly_utils.h:885
force_inline bool isInRange(poly_float value, mono_float min, mono_float max)
Checks if each lane in a poly_float is within [min, max].
Definition poly_utils.h:622
force_inline matrix getPolynomialInterpolationMatrix(poly_float t_from)
Creates a matrix for polynomial interpolation given a starting poly_float t_from.
Definition poly_utils.h:205
force_inline poly_float magnitudeToDb(poly_float value)
Converts a magnitude value to decibels (vectorized).
Definition poly_utils.h:144
force_inline poly_mask getSilentMask(const poly_float *buffer, int length)
Creates a mask indicating whether all values in the given buffer are near zero.
Definition poly_utils.h:399
force_inline bool isContained(poly_float value)
Checks if all lanes in a poly_float are within a broad range [-8000..8000].
Definition poly_utils.h:631
force_inline poly_float toPolyFloatFromUnaligned(const mono_float *unaligned)
Loads a poly_float from an unaligned float pointer.
Definition poly_utils.h:249
force_inline poly_float getOptimalInterpolationValues(mono_float mono_t)
Returns an "optimal" polynomial interpolation for a scalar mono_t.
Definition poly_utils.h:197
force_inline poly_float getCubicInterpolationValues(mono_float mono_t)
Returns the cubic Lagrange interpolation constants for a scalar mono_t.
Definition poly_utils.h:189
force_inline poly_int shiftRight(poly_int integer)
Definition poly_utils.h:845
force_inline matrix getLinearInterpolationMatrix(poly_float t)
Creates a matrix for simple linear interpolation using scalar or vector t.
Definition poly_utils.h:242
force_inline poly_float pow(poly_float base, poly_float exponent)
Raises each lane in base to the power of the corresponding lane in exponent.
Definition poly_utils.h:388
force_inline poly_float frequencyToMidiNote(poly_float value)
Converts a frequency to a MIDI note (vectorized).
Definition poly_utils.h:130
force_inline poly_int shiftLeft(poly_int integer)
Definition poly_utils.h:856
force_inline poly_float dbToMagnitude(poly_float value)
Converts a dB value to linear magnitude (vectorized).
Definition poly_utils.h:149
force_inline poly_float ratioToMidiTranspose(poly_float value)
Converts a ratio to MIDI transpose (vectorized).
Definition poly_utils.h:109
force_inline poly_float max(poly_float left, poly_float right)
Returns the maximum of two poly_floats lane-by-lane.
Definition poly_utils.h:327
force_inline bool equal(poly_float left, poly_float right)
Checks if two poly_floats are equal lane-by-lane. Returns true if all lanes match.
Definition poly_utils.h:341
force_inline mono_float minFloat(poly_float values)
Returns the minimum lane value from a poly_float.
Definition poly_utils.h:534
force_inline mono_float maxFloat(poly_float values)
Returns the maximum lane value from a poly_float.
Definition poly_utils.h:525
force_inline poly_float swapVoices(poly_float value)
Swaps the first half of the lanes with the second half.
Definition poly_utils.h:437
force_inline poly_float map(poly_float value)
Applies a scalar function to each element in a poly_float.
Definition poly_utils.h:83
force_inline matrix getCatmullInterpolationMatrix(poly_float t)
Creates a Catmull-Rom interpolation matrix from a poly_float t.
Definition poly_utils.h:227
force_inline poly_float sumSplitAudio(poly_float sum)
Adds two stereo lanes for each voice, returning a combined mono result in each lane.
Definition poly_utils.h:517
force_inline matrix getValueMatrix(const mono_float *buffer, poly_int indices)
Creates a matrix of 4 poly_float lanes from a single buffer at varying indices.
Definition poly_utils.h:262
force_inline poly_float snapTranspose(poly_float transpose, int quantize)
Snaps a MIDI transpose value to a quantization mask (e.g., scale degrees).
Definition poly_utils.h:908
force_inline poly_float gatherSeparate(const mono_float *const *buffers, const poly_int &indices)
Gathers values from different buffers, with each lane potentially reading from a different buffer ind...
Definition poly_utils.h:701
force_inline poly_float fltScale(poly_float value, poly_float power)
Performs a simple filter scaling operation (power * value) / ((power - 1)*value + 1).
Definition poly_utils.h:726
force_inline poly_int floorToInt(poly_float value)
Floors each lane and returns the result as an integer.
Definition poly_utils.h:785
force_inline void copyBuffer(mono_float *dest, const mono_float *source, int size)
Copies data from a source mono buffer to a destination mono buffer.
Definition poly_utils.h:586
force_inline poly_float maskLoad(poly_float zero_value, poly_float one_value, poly_mask reset_mask)
Selects between two values (zero_value or one_value) based on a mask in each lane.
Definition poly_utils.h:351
force_inline poly_float midiNoteToFrequency(poly_float value)
Converts a MIDI note to a frequency (vectorized).
Definition poly_utils.h:123
force_inline poly_int toInt(poly_float floats)
Casts a poly_float to poly_int by truncation.
Definition poly_utils.h:748
force_inline poly_float sqrt(poly_float value)
Computes the square root of each element in a poly_float.
Definition poly_utils.h:169
force_inline poly_float sin(poly_float value)
Computes the sine of each element (in radians).
Definition poly_utils.h:159
force_inline poly_int truncToInt(poly_float value)
Truncates a poly_float to an integer (effectively floor for positive values).
Definition poly_utils.h:763
force_inline poly_float noteOffsetToRatio(poly_float value)
Converts note offsets to frequency ratios. Similar to centsToRatio, but may differ in how offset is d...
Definition poly_utils.h:102
force_inline poly_float interpolate(poly_float from, poly_float to, mono_float t)
Performs a linear interpolation between two poly_floats using a scalar t in [0..1].
Definition poly_utils.h:182
force_inline poly_float frequencyToMidiCents(poly_float value)
Converts a frequency to MIDI cents (vectorized).
Definition poly_utils.h:137
force_inline poly_float midiCentsToFrequency(poly_float value)
Converts MIDI cents to frequency (vectorized).
Definition poly_utils.h:116
force_inline void adjacentGather(const mono_float *buffer, const poly_int &indices, poly_float &value, poly_float &next)
Gathers adjacent values for each lane, storing them in value and next.
Definition poly_utils.h:689
force_inline bool isTransposeSnapping(int quantize)
Checks if any snapping bits are set in the transpose quantize mask.
Definition poly_utils.h:971
force_inline poly_float compactFirstVoices(poly_float one, poly_float two)
Packs the first voice from two different poly_floats into a single vector.
Definition poly_utils.h:504
force_inline poly_float perlinInterpolate(poly_float from, poly_float to, poly_float t)
A specialized interpolation function used in perlin-like routines.
Definition poly_utils.h:296
force_inline poly_float reverse(poly_float value)
Reverses the order of stereo lanes from (L, R, L, R) to (R, L, R, L).
Definition poly_utils.h:478
force_inline poly_float ceil(poly_float value)
Ceils each lane in value.
Definition poly_utils.h:799
force_inline poly_float swapStereo(poly_float value)
Swaps the left and right channels of a stereo poly_float.
Definition poly_utils.h:411
force_inline std::pair< poly_float, poly_float > decodePhaseAndVoice(poly_float encoded)
Decodes a phase and voice from an encoded float, returning (phase, voice).
Definition poly_utils.h:987
force_inline poly_float gather(const mono_float *buffer, const poly_int &indices)
Gathers values from a mono float buffer into a poly_float, using per-lane indices.
Definition poly_utils.h:677
force_inline poly_float centsToRatio(poly_float value)
Converts semitone cents to a linear frequency ratio (vectorized).
Definition poly_utils.h:95
force_inline poly_float mulSub(poly_float a, poly_float b, poly_float c)
Performs a fused multiply-sub on SIMD data: (a * b) - c.
Definition poly_utils.h:72
Contains classes and functions used within the Vital synthesizer framework.
constexpr int kNotesPerOctave
Number of semitones per octave.
Definition common.h:51
constexpr mono_float kEpsilon
A small epsilon for floating comparisons.
Definition common.h:38
float mono_float
Definition common.h:33
A structure representing a 4x1 matrix of poly_float rows.
Definition matrix.h:19
Represents a vector of floating-point values using SIMD instructions.
Definition poly_values.h:600
static force_inline simd_type vector_call mulSub(simd_type one, simd_type two, simd_type three)
Fused multiply-sub operation: one = one - (two * three).
Definition poly_values.h:800
static force_inline mask_simd_type vector_call equal(simd_type one, simd_type two)
Compares two SIMD float registers for equality, element-wise.
Definition poly_values.h:954
static force_inline poly_mask vector_call lessThan(poly_float one, poly_float two)
Definition poly_values.h:1105
simd_type value
The underlying SIMD register for float.
Definition poly_values.h:1112
static force_inline simd_type vector_call min(simd_type one, simd_type two)
Returns the element-wise minimum of two SIMD float registers.
Definition poly_values.h:920
static force_inline simd_type vector_call max(simd_type one, simd_type two)
Returns the element-wise maximum of two SIMD float registers.
Definition poly_values.h:904
static force_inline simd_type vector_call abs(simd_type value)
Computes the absolute value of each element in the SIMD float register.
Definition poly_values.h:935
static force_inline mask_simd_type vector_call notEqual(simd_type one, simd_type two)
Compares two SIMD float registers for non-equality, element-wise.
Definition poly_values.h:1003
static force_inline simd_type vector_call mulAdd(simd_type one, simd_type two, simd_type three)
Fused multiply-add operation: one = one + (two * three).
Definition poly_values.h:779
force_inline void vector_call set(size_t index, float new_value) noexcept
Sets a specific element in the SIMD register.
Definition poly_values.h:1182
static force_inline mask_simd_type vector_call greaterThan(simd_type one, simd_type two)
Compares two SIMD float registers, element-wise, for greater than.
Definition poly_values.h:971
Represents a vector of integer values using SIMD instructions.
Definition poly_values.h:56
simd_type value
The underlying SIMD register.
Definition poly_values.h:385
static force_inline simd_type vector_call max(simd_type one, simd_type two)
Returns the element-wise maximum of two SIMD integer registers.
Definition poly_values.h:253
static force_inline uint32_t vector_call sum(simd_type value)
Computes the sum of all elements in a SIMD integer register.
Definition poly_values.h:326
static force_inline simd_type vector_call min(simd_type one, simd_type two)
Returns the element-wise minimum of two SIMD integer registers.
Definition poly_values.h:272
Provides various utility functions, classes, and constants for audio, math, and general-purpose opera...