@@ -32,6 +32,13 @@ | |||||
#include <list> | #include <list> | ||||
/** NOTE alignas is required in some systems in order to allow SSE usage. */ | |||||
#ifndef ARCH_MAC | |||||
#define SIMD_ALIGN alignas(32) | |||||
#else | |||||
#define SIMD_ALIGN | |||||
#endif | |||||
namespace rack { | namespace rack { | ||||
namespace engine { | namespace engine { | ||||
@@ -48,7 +55,7 @@ struct Port { | |||||
/** Voltage of the port. */ | /** Voltage of the port. */ | ||||
/** NOTE alignas is required in order to allow SSE usage. | /** NOTE alignas is required in order to allow SSE usage. | ||||
Consecutive data (like in a vector) would otherwise pack Ports in a way that breaks SSE. */ | Consecutive data (like in a vector) would otherwise pack Ports in a way that breaks SSE. */ | ||||
union alignas(32) { | |||||
union SIMD_ALIGN { | |||||
/** Unstable API. Use getVoltage() and setVoltage() instead. */ | /** Unstable API. Use getVoltage() and setVoltage() instead. */ | ||||
float voltages[PORT_MAX_CHANNELS] = {}; | float voltages[PORT_MAX_CHANNELS] = {}; | ||||
/** DEPRECATED. Unstable API. Use getVoltage() and setVoltage() instead. */ | /** DEPRECATED. Unstable API. Use getVoltage() and setVoltage() instead. */ | ||||
@@ -30,6 +30,13 @@ | |||||
#include <cstring> | #include <cstring> | ||||
#include <pmmintrin.h> | #include <pmmintrin.h> | ||||
/** NOTE alignas is required in some systems in order to allow SSE usage. */ | |||||
#ifndef ARCH_MAC | |||||
#define SIMD_ALIGN alignas(32) | |||||
#else | |||||
#define SIMD_ALIGN | |||||
#endif | |||||
namespace rack { | namespace rack { | ||||
@@ -62,8 +69,7 @@ struct Vector<float, 4> { | |||||
using type = float; | using type = float; | ||||
constexpr static int size = 4; | constexpr static int size = 4; | ||||
/** NOTE alignas is required in order to allow SSE usage. */ | |||||
union alignas(32) { | |||||
union SIMD_ALIGN { | |||||
__m128 v; | __m128 v; | ||||
/** Accessing this array of scalars is slow and defeats the purpose of vectorizing. | /** Accessing this array of scalars is slow and defeats the purpose of vectorizing. | ||||
*/ | */ | ||||
@@ -137,8 +143,7 @@ struct Vector<int32_t, 4> { | |||||
using type = int32_t; | using type = int32_t; | ||||
constexpr static int size = 4; | constexpr static int size = 4; | ||||
/** NOTE alignas is required in order to allow SSE usage. */ | |||||
union alignas(32) { | |||||
union SIMD_ALIGN { | |||||
__m128i v; | __m128i v; | ||||
int32_t s[4]; | int32_t s[4]; | ||||
}; | }; | ||||