diff options
author | Sv. Lockal <lockalsash@gmail.com> | 2014-02-27 14:49:21 +0400 |
---|---|---|
committer | Sv. Lockal <lockalsash@gmail.com> | 2014-02-27 15:01:20 +0400 |
commit | 7808360c5f35c5a6371c3627758a70db431955a2 (patch) | |
tree | 0a3cb25e749917dd0021f308a5627442888b1ecb /intern/cycles/util/util_simd.h | |
parent | 8badec14f97df80b328a6d8106c6cdbcafb171c0 (diff) |
Cycles: fix crash in SSE hair and half-floats on x86+vc2008
MSVC 2008 ignores alignement attribute when assigning from unaligned
float4 vector, returned from other function. Now Cycles uses unaligned
loads instead of casts for win32 in x86 mode.
Diffstat (limited to 'intern/cycles/util/util_simd.h')
-rw-r--r-- | intern/cycles/util/util_simd.h | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/intern/cycles/util/util_simd.h b/intern/cycles/util/util_simd.h index fd5ba1de37b..fff682bb436 100644 --- a/intern/cycles/util/util_simd.h +++ b/intern/cycles/util/util_simd.h @@ -180,6 +180,30 @@ ccl_device_inline const __m128 set_sign_bit(const __m128 &a) return _mm_xor_ps(a, _mm_castsi128_ps(_mm_setr_epi32(S1 << 31, S2 << 31, S3 << 31, S4 << 31))); } +#ifdef __KERNEL_WITH_SSE_ALIGN__ +ccl_device_inline const __m128 load_m128(const float4 &vec) +{ + return _mm_load_ps(&vec.x); +} + +ccl_device_inline const __m128 load_m128(const float3 &vec) +{ + return _mm_load_ps(&vec.x); +} + +#else + +ccl_device_inline const __m128 load_m128(const float4 &vec) +{ + return _mm_loadu_ps(&vec.x); +} + +ccl_device_inline const __m128 load_m128(const float3 &vec) +{ + return _mm_loadu_ps(&vec.x); +} +#endif /* __KERNEL_WITH_SSE_ALIGN__ */ + #endif /* __KERNEL_SSE2__ */ CCL_NAMESPACE_END |