ソースを参照

libobs: Convert sse inline funcs to macros

jp9000 7 年 前
コミット
4785d9906c
1 ファイル変更18 行追加17 行削除
  1. 18 17
      libobs/obs-audio-controls.c

+ 18 - 17
libobs/obs-audio-controls.c

@@ -279,10 +279,8 @@ static int get_nr_channels_from_audio_data(const struct audio_data *data)
 
 /* x(d, c, b, a) --> (|d|, |c|, |b|, |a|)
  */
-static inline __m128 abs_ps(__m128 v)
-{
-	return _mm_andnot_ps(_mm_set1_ps(-0.f), v);
-}
+#define abs_ps(v) \
+	_mm_andnot_ps(_mm_set1_ps(-0.f), v)
 
 /* Take cross product of a vector with a matrix resulting in vector.
  */
@@ -302,17 +300,15 @@ static inline __m128 abs_ps(__m128 v)
 
 /* x4(d, c, b, a)  -->  max(a, b, c, d)
  */
-static inline float hmax_ps(__m128 x4)
-{
-	float x4_mem[4];
-	_mm_store_ps(x4_mem, x4);
-
-	float r = x4_mem[0];
-	r = fmaxf(r, x4_mem[1]);
-	r = fmaxf(r, x4_mem[2]);
-	r = fmaxf(r, x4_mem[3]);
-	return r;
-}
+#define hmax_ps(r, x4) \
+	do { \
+		float x4_mem[4]; \
+		_mm_store_ps(x4_mem, x4); \
+		r = x4_mem[0]; \
+		r = fmaxf(r, x4_mem[1]); \
+		r = fmaxf(r, x4_mem[2]); \
+		r = fmaxf(r, x4_mem[3]); \
+	} while (false)
 
 /* Calculate the true peak over a set of samples.
  * The algorithm implements 5x oversampling by using Whittaker–Shannon
@@ -365,7 +361,9 @@ static float get_true_peak(__m128 previous_samples, const float *samples,
 		peak = _mm_max_ps(peak, abs_ps(intrp_samples));
 	}
 
-	return hmax_ps(peak);
+	float r;
+	hmax_ps(r, peak);
+	return r;
 }
 
 /* points contain the first four samples to calculate the sinc interpolation
@@ -379,7 +377,10 @@ static float get_sample_peak(__m128 previous_samples, const float *samples,
 		__m128 new_work = _mm_load_ps(&samples[i]);
 		peak = _mm_max_ps(peak, abs_ps(new_work));
 	}
-	return hmax_ps(peak);
+
+	float r;
+	hmax_ps(r, peak);
+	return r;
 }
 
 static void volmeter_process_peak_last_samples(obs_volmeter_t *volmeter,