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