Author: post
Date: 2012-01-31 17:46:29 +0100 (Tue, 31 Jan 2012)
New Revision: 4115
Modified:
trunk/plugins/lensfun/lensfun-avx.c
Log:
Greatly simplify clamping in lensfun AVX code
Modified: trunk/plugins/lensfun/lensfun-avx.c
===================================================================
--- trunk/plugins/lensfun/lensfun-avx.c 2012-01-31 16:23:22 UTC (rev 4114)
+++ trunk/plugins/lensfun/lensfun-avx.c 2012-01-31 16:46:29 UTC (rev 4115)
@@ -24,7 +24,7 @@
#if defined (__AVX__)
-#include <emmintrin.h>
+#include <smmintrin.h>
static gfloat twofiftytwo_ps[4] __attribute__ ((aligned (16))) = {256.0f,
256.0f, 256.0f, 0.0f};
static gint _zero12[4] __attribute__ ((aligned (16))) = {0,1,2,0};
@@ -239,17 +239,12 @@
__m128i x_gt, y_gt;
/* Clamping */
- x_gt = _mm_cmpgt_epi32(x, _m_w);
- y_gt = _mm_cmpgt_epi32(y, _m_h);
-
- x = _mm_or_si128(_mm_andnot_si128(x_gt, x), _mm_and_si128(_m_w, x_gt));
- y = _mm_or_si128(_mm_andnot_si128(y_gt, y), _mm_and_si128(_m_h, y_gt));
+ x = _mm_min_epi32(x, _m_w);
+ y = _mm_min_epi32(y, _m_h);
__m128i zero = _mm_setzero_si128();
- __m128i x_lt = _mm_cmplt_epi32(x, zero);
- __m128i y_lt = _mm_cmplt_epi32(y, zero);
- x = _mm_andnot_si128(x_lt, x);
- y = _mm_andnot_si128(y_lt, y);
+ x = _mm_max_epi32(x, zero);
+ y = _mm_max_epi32(y, zero);
__m128i one = _mm_set1_epi32(1);
__m128i nx = _mm_add_epi32(one, _mm_srai_epi32(x, 8));
@@ -259,11 +254,8 @@
_m_w = _mm_srai_epi32(_m_w, 8);
_m_h = _mm_srai_epi32(_m_h, 8);
- x_gt = _mm_cmpgt_epi32(nx, _m_w);
- y_gt = _mm_cmpgt_epi32(ny, _m_h);
-
- nx = _mm_or_si128(_mm_andnot_si128(x_gt, nx), _mm_and_si128(_m_w,
x_gt));
- ny = _mm_or_si128(_mm_andnot_si128(y_gt, ny), _mm_and_si128(_m_h,
y_gt));
+ nx = _mm_min_epi32(nx, _m_w);
+ ny = _mm_min_epi32(ny, _m_h);
int xfer[16] __attribute__ ((aligned (16)));
_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit