1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
|
diff --git a/avidemux/ADM_coreImage/src/ADM_interlaceUtil.cpp b/avidemux/ADM_coreImage/src/ADM_interlaceUtil.cpp
index 33b2a7f..99f0664 100644
--- a/avidemux/ADM_coreImage/src/ADM_interlaceUtil.cpp
+++ b/avidemux/ADM_coreImage/src/ADM_interlaceUtil.cpp
@@ -30,19 +30,8 @@ Skip factor=2
***************************************************************************/
#include "ADM_default.h"
-
-//#include "ADM_editor/ADM_edit.hxx"
#include "ADM_videoFilter.h"
-//#define MMX_TRACE
-#warning remove mmxmacro and debug asm
-//#define ASM_ILACING
-
-
-#include "ADM_mmxMacros.h"
-
-
-
#define SKIP_FACTOR 2 // 2^SKIPFACTOR=SKIP_LINEAR+1
#define SKIP_LINEAR 3
@@ -62,7 +51,7 @@ Skip factor=2
*/
#if defined(ADM_CPU_X86) && defined(ASM_ILACING)
-
+#warning REWRITE IN PLAIN ASM
static uint32_t ADMVideo_interlaceCount_MMX( uint8_t *src ,uint32_t w, uint32_t h);
static uint8_t * FUNNY_MANGLE(_l_p) =NULL;
static uint8_t * FUNNY_MANGLE(_l_c) =NULL;
diff --git a/avidemux/ADM_coreImage/src/ADM_vidFieldASM.cpp b/avidemux/ADM_coreImage/src/ADM_vidFieldASM.cpp
index 61d11d4..479731c 100644
--- a/avidemux/ADM_coreImage/src/ADM_vidFieldASM.cpp
+++ b/avidemux/ADM_coreImage/src/ADM_vidFieldASM.cpp
@@ -20,15 +20,13 @@
***************************************************************************/
#include "ADM_default.h"
-
#include "ADM_videoFilter.h"
-
#include"ADM_vidField.h"
#ifdef ADM_CPU_X86
// #define DEBUG_DEINT 1
// #define MMX_TRACE 1
- #include "ADM_mmxMacros.h"
+// #include "ADM_mmxMacros.h"
void myDeintASM(void);
@@ -36,25 +34,27 @@
static uint8_t * FUNNY_MANGLE(_l_p) , * FUNNY_MANGLE(_l_c) ,* FUNNY_MANGLE(_l_n);
static uint8_t * FUNNY_MANGLE(_l_e) , * FUNNY_MANGLE(_l_e2);
#define EXPAND(x) (x)+((x)<<16)+((x)<<32) +((x)<<48)
-static mmx_t _mmTHRESH1;
-static mmx_t _mmTHRESH2;
+static uint64_t __attribute__((used)) __attribute__ ((__aligned__ (8))) FUNNY_MANGLE(_mmTHRESH1) ;
+static uint64_t __attribute__((used)) __attribute__ ((__aligned__ (8))) FUNNY_MANGLE(_mmTHRESH2) ;
-#define COMPUTE_MMX \
-punpcklbw_r2r(mm5,mm0); /*c expand 4 bytes -> 4 word */ \
-punpcklbw_r2r(mm5,mm1); /*p*/ \
-punpcklbw_r2r(mm5,mm2); /* n*/ \
-movq_r2r(mm0,mm3); /* mm3 also c*/ \
-psubw_r2r(mm1,mm0) ; /* mm0=mm0-mm1 = c-p*/ \
-psubw_r2r(mm2,mm3) ; /* mm3=mm3-mm2 = c-n*/ \
-psraw_i2r(1,mm0); /* to protect from overflow*/ \
-psraw_i2r(1,mm3);\
-pmullw_r2r(mm0,mm3); /* mm3=(c-p)*(c-n) / 4;*/ \
-movq_r2r(mm3,mm0) ; /* mm0 also c-p*c-n */ \
-pcmpgtw_r2r(mm4,mm3); /* keep only > size*/ \
-pcmpgtw_r2r(mm6,mm0); /* keep only > size*/ \
-packsswb_r2r(mm5,mm0); \
-packsswb_r2r(mm5,mm3);
+#define COMPUTE_MMX \
+__asm__ __volatile__(\
+"punpcklbw %%mm5,%%mm0\n\t" \
+"punpcklbw %%mm5,%%mm1\n\t" \
+"punpcklbw %%mm5,%%mm2\n\t" \
+"movq %%mm0,%%mm3\n\t" \
+"psubw %%mm1,%%mm0\n\t" \
+"psubw %%mm2,%%mm3\n\t" \
+"psraw $1,%%mm0\n\t" \
+"psraw $1,%%mm3\n\t" \
+"pmullw %%mm0,%%mm3\n\t" \
+"movq %%mm3,%%mm0\n\t" \
+"pcmpgtw %%mm4,%%mm3\n\t" \
+"pcmpgtw %%mm6,%%mm0\n\t" \
+"packsswb %%mm5,%%mm0\n\t" \
+"packsswb %%mm5,%%mm3\n\t" \
+::)
#endif
void ADMVideoFields::hasMotion_C(uint8_t *p,uint8_t *c,
@@ -90,8 +90,8 @@ void ADMVideoFields::hasMotion_MMX(uint8_t *p,uint8_t *c,
{
- _mmTHRESH1.uq=EXPAND((uint64_t ) ((_param->motion_trigger*_param->motion_trigger)>>2) );
- _mmTHRESH2.uq=EXPAND((uint64_t ) ((_param->blend_trigger*_param->blend_trigger)>>2) );
+ _mmTHRESH1=EXPAND((uint64_t ) ((_param->motion_trigger*_param->motion_trigger)>>2) );
+ _mmTHRESH2=EXPAND((uint64_t ) ((_param->blend_trigger*_param->blend_trigger)>>2) );
_l_h=_info.height-2;
_l_w=_info.width>>2;
@@ -102,10 +102,11 @@ void ADMVideoFields::hasMotion_MMX(uint8_t *p,uint8_t *c,
_l_e=e;
_l_e2=e2;
// printf("\n MMX \n");
-
- pxor_r2r(mm5,mm5);
- movq_m2r(_mmTHRESH1,mm4);
- movq_m2r(_mmTHRESH2,mm6);
+ __asm__ __volatile__ (
+ "pxor %%mm5,%%mm5\n\t"
+ "movq "Mangle(_mmTHRESH1)",%%mm4\n\t"
+ "movq "Mangle(_mmTHRESH2)",%%mm6\n\t"
+ ::);
myDeintASM();
}
#if !defined(DEBUG_DEINT)
@@ -149,7 +150,7 @@ void myDeintASM(void)
:
: "eax", "ecx","edx","esi"
);
- emms();
+ __asm__ __volatile__ ("emms");
}
#else
|