1 #pragma once
2
3 #ifdef __SSE2__
4 #include <x86intrin.h>
5 #endif
6
7 float median3x3(float* array);
8 float median24(float *array);
9 float median5x5(float* array);
10 float median7x7(float* array);
11 float median9x9(float* array);
12
mymin(float a,float b)13 inline __attribute__((always_inline)) float mymin(float a, float b) {
14 return b < a ? b : a;
15 }
16
mymax(float a,float b)17 inline __attribute__((always_inline))float mymax(float a, float b) {
18 return a < b ? b : a;
19 }
20
median9f(float array0,float array1,float array2,float array3,float array4,float array5,float array6,float array7,float array8)21 inline __attribute__((always_inline)) float median9f(float array0, float array1, float array2, float array3, float array4, float array5, float array6, float array7, float array8)
22 {
23 float tmp = mymin(array1, array2);
24 array2 = mymax(array1, array2);
25 array1 = tmp;
26 tmp = mymin(array4, array5);
27 array5 = mymax(array4, array5);
28 array4 = tmp;
29 tmp = mymin(array7, array8);
30 array8 = mymax(array7, array8);
31 array7 = tmp;
32 tmp = mymin(array0, array1);
33 array1 = mymax(array0, array1);
34 array0 = tmp;
35 tmp = mymin(array3, array4);
36 array4 = mymax(array3, array4);
37 array3 = tmp;
38 tmp = mymin(array6, array7);
39 array7 = mymax(array6, array7);
40 array6 = tmp;
41 tmp = mymin(array1, array2);
42 array2 = mymax(array1, array2);
43 array1 = tmp;
44 tmp = mymin(array4, array5);
45 array5 = mymax(array4, array5);
46 array4 = tmp;
47 tmp = mymin(array7, array8);
48 array8 = mymax(array7, array8);
49 array3 = mymax(array0, array3);
50 array5 = mymin(array5, array8);
51 array7 = mymax(array4, tmp);
52 tmp = mymin(array4, tmp);
53 array6 = mymax(array3, array6);
54 array4 = mymax(array1, tmp);
55 array2 = mymin(array2, array5);
56 array4 = mymin(array4, array7);
57 tmp = mymin(array4, array2);
58 array2 = mymax(array4, array2);
59 array4 = mymax(array6, tmp);
60 return mymin(array4, array2);
61 }
62
63 #ifdef __SSE2__
median9sse(__m128 array0,__m128 array1,__m128 array2,__m128 array3,__m128 array4,__m128 array5,__m128 array6,__m128 array7,__m128 array8)64 inline __attribute__((always_inline)) __m128 median9sse(__m128 array0, __m128 array1, __m128 array2, __m128 array3, __m128 array4, __m128 array5, __m128 array6, __m128 array7, __m128 array8)
65 {
66 __m128 tmp = _mm_min_ps(array1, array2);
67 array2 = _mm_max_ps(array1, array2);
68 array1 = tmp;
69 tmp = _mm_min_ps(array4, array5);
70 array5 = _mm_max_ps(array4, array5);
71 array4 = tmp;
72 tmp = _mm_min_ps(array7, array8);
73 array8 = _mm_max_ps(array7, array8);
74 array7 = tmp;
75 tmp = _mm_min_ps(array0, array1);
76 array1 = _mm_max_ps(array0, array1);
77 array0 = tmp;
78 tmp = _mm_min_ps(array3, array4);
79 array4 = _mm_max_ps(array3, array4);
80 array3 = tmp;
81 tmp = _mm_min_ps(array6, array7);
82 array7 = _mm_max_ps(array6, array7);
83 array6 = tmp;
84 tmp = _mm_min_ps(array1, array2);
85 array2 = _mm_max_ps(array1, array2);
86 array1 = tmp;
87 tmp = _mm_min_ps(array4, array5);
88 array5 = _mm_max_ps(array4, array5);
89 array4 = tmp;
90 tmp = _mm_min_ps(array7, array8);
91 array8 = _mm_max_ps(array7, array8);
92 array3 = _mm_max_ps(array0, array3);
93 array5 = _mm_min_ps(array5, array8);
94 array7 = _mm_max_ps(array4, tmp);
95 tmp = _mm_min_ps(array4, tmp);
96 array6 = _mm_max_ps(array3, array6);
97 array4 = _mm_max_ps(array1, tmp);
98 array2 = _mm_min_ps(array2, array5);
99 array4 = _mm_min_ps(array4, array7);
100 tmp = _mm_min_ps(array4, array2);
101 array2 = _mm_max_ps(array4, array2);
102 array4 = _mm_max_ps(array6, tmp);
103 return _mm_min_ps(array4, array2);
104 }
105
106 __m128 median3x3sse(__m128* array);
107 __m128 median5x5sse(__m128* array);
108 __m128 median7x7sse(__m128* array);
109 __m128 median9x9sse(__m128* array);
110 #endif
111