提交 4460a860 编写于 作者: J J.R. Mauro 提交者: Greg Kroah-Hartman

Staging: Lindent the echo driver

Lindent drivers/staging/echo*

Signed-off by: J.R. Mauro <jrm8005@gmail.com>
Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
上级 786ed801
...@@ -36,14 +36,15 @@ ...@@ -36,14 +36,15 @@
\return The bit number of the highest set bit, or -1 if the word is zero. */ \return The bit number of the highest set bit, or -1 if the word is zero. */
static __inline__ int top_bit(unsigned int bits) static __inline__ int top_bit(unsigned int bits)
{ {
int res; int res;
__asm__ (" xorl %[res],%[res];\n" __asm__(" xorl %[res],%[res];\n"
" decl %[res];\n" " decl %[res];\n"
" bsrl %[bits],%[res]\n" " bsrl %[bits],%[res]\n"
: [res] "=&r" (res) :[res] "=&r" (res)
: [bits] "rm" (bits)); :[bits] "rm"(bits)
return res; );
return res;
} }
/*! \brief Find the bit position of the lowest set bit in a word /*! \brief Find the bit position of the lowest set bit in a word
...@@ -51,84 +52,75 @@ static __inline__ int top_bit(unsigned int bits) ...@@ -51,84 +52,75 @@ static __inline__ int top_bit(unsigned int bits)
\return The bit number of the lowest set bit, or -1 if the word is zero. */ \return The bit number of the lowest set bit, or -1 if the word is zero. */
static __inline__ int bottom_bit(unsigned int bits) static __inline__ int bottom_bit(unsigned int bits)
{ {
int res; int res;
__asm__ (" xorl %[res],%[res];\n" __asm__(" xorl %[res],%[res];\n"
" decl %[res];\n" " decl %[res];\n"
" bsfl %[bits],%[res]\n" " bsfl %[bits],%[res]\n"
: [res] "=&r" (res) :[res] "=&r" (res)
: [bits] "rm" (bits)); :[bits] "rm"(bits)
return res; );
return res;
} }
#else #else
static __inline__ int top_bit(unsigned int bits) static __inline__ int top_bit(unsigned int bits)
{ {
int i; int i;
if (bits == 0) if (bits == 0)
return -1; return -1;
i = 0; i = 0;
if (bits & 0xFFFF0000) if (bits & 0xFFFF0000) {
{ bits &= 0xFFFF0000;
bits &= 0xFFFF0000; i += 16;
i += 16; }
} if (bits & 0xFF00FF00) {
if (bits & 0xFF00FF00) bits &= 0xFF00FF00;
{ i += 8;
bits &= 0xFF00FF00; }
i += 8; if (bits & 0xF0F0F0F0) {
} bits &= 0xF0F0F0F0;
if (bits & 0xF0F0F0F0) i += 4;
{ }
bits &= 0xF0F0F0F0; if (bits & 0xCCCCCCCC) {
i += 4; bits &= 0xCCCCCCCC;
} i += 2;
if (bits & 0xCCCCCCCC) }
{ if (bits & 0xAAAAAAAA) {
bits &= 0xCCCCCCCC; bits &= 0xAAAAAAAA;
i += 2; i += 1;
} }
if (bits & 0xAAAAAAAA) return i;
{
bits &= 0xAAAAAAAA;
i += 1;
}
return i;
} }
static __inline__ int bottom_bit(unsigned int bits) static __inline__ int bottom_bit(unsigned int bits)
{ {
int i; int i;
if (bits == 0) if (bits == 0)
return -1; return -1;
i = 32; i = 32;
if (bits & 0x0000FFFF) if (bits & 0x0000FFFF) {
{ bits &= 0x0000FFFF;
bits &= 0x0000FFFF; i -= 16;
i -= 16; }
} if (bits & 0x00FF00FF) {
if (bits & 0x00FF00FF) bits &= 0x00FF00FF;
{ i -= 8;
bits &= 0x00FF00FF; }
i -= 8; if (bits & 0x0F0F0F0F) {
} bits &= 0x0F0F0F0F;
if (bits & 0x0F0F0F0F) i -= 4;
{ }
bits &= 0x0F0F0F0F; if (bits & 0x33333333) {
i -= 4; bits &= 0x33333333;
} i -= 2;
if (bits & 0x33333333) }
{ if (bits & 0x55555555) {
bits &= 0x33333333; bits &= 0x55555555;
i -= 2; i -= 1;
} }
if (bits & 0x55555555) return i;
{
bits &= 0x55555555;
i -= 1;
}
return i;
} }
#endif #endif
...@@ -138,13 +130,14 @@ static __inline__ int bottom_bit(unsigned int bits) ...@@ -138,13 +130,14 @@ static __inline__ int bottom_bit(unsigned int bits)
static __inline__ uint8_t bit_reverse8(uint8_t x) static __inline__ uint8_t bit_reverse8(uint8_t x)
{ {
#if defined(__i386__) || defined(__x86_64__) #if defined(__i386__) || defined(__x86_64__)
/* If multiply is fast */ /* If multiply is fast */
return ((x*0x0802U & 0x22110U) | (x*0x8020U & 0x88440U))*0x10101U >> 16; return ((x * 0x0802U & 0x22110U) | (x * 0x8020U & 0x88440U)) *
0x10101U >> 16;
#else #else
/* If multiply is slow, but we have a barrel shifter */ /* If multiply is slow, but we have a barrel shifter */
x = (x >> 4) | (x << 4); x = (x >> 4) | (x << 4);
x = ((x & 0xCC) >> 2) | ((x & 0x33) << 2); x = ((x & 0xCC) >> 2) | ((x & 0x33) << 2);
return ((x & 0xAA) >> 1) | ((x & 0x55) << 1); return ((x & 0xAA) >> 1) | ((x & 0x55) << 1);
#endif #endif
} }
...@@ -184,7 +177,7 @@ uint16_t make_mask16(uint16_t x); ...@@ -184,7 +177,7 @@ uint16_t make_mask16(uint16_t x);
\return The word with the single set bit. */ \return The word with the single set bit. */
static __inline__ uint32_t least_significant_one32(uint32_t x) static __inline__ uint32_t least_significant_one32(uint32_t x)
{ {
return (x & (-(int32_t) x)); return (x & (-(int32_t) x));
} }
/*! \brief Find the most significant one in a word, and return a word /*! \brief Find the most significant one in a word, and return a word
...@@ -194,10 +187,10 @@ static __inline__ uint32_t least_significant_one32(uint32_t x) ...@@ -194,10 +187,10 @@ static __inline__ uint32_t least_significant_one32(uint32_t x)
static __inline__ uint32_t most_significant_one32(uint32_t x) static __inline__ uint32_t most_significant_one32(uint32_t x)
{ {
#if defined(__i386__) || defined(__x86_64__) #if defined(__i386__) || defined(__x86_64__)
return 1 << top_bit(x); return 1 << top_bit(x);
#else #else
x = make_mask32(x); x = make_mask32(x);
return (x ^ (x >> 1)); return (x ^ (x >> 1));
#endif #endif
} }
...@@ -206,8 +199,8 @@ static __inline__ uint32_t most_significant_one32(uint32_t x) ...@@ -206,8 +199,8 @@ static __inline__ uint32_t most_significant_one32(uint32_t x)
\return 1 for odd, or 0 for even. */ \return 1 for odd, or 0 for even. */
static __inline__ int parity8(uint8_t x) static __inline__ int parity8(uint8_t x)
{ {
x = (x ^ (x >> 4)) & 0x0F; x = (x ^ (x >> 4)) & 0x0F;
return (0x6996 >> x) & 1; return (0x6996 >> x) & 1;
} }
/*! \brief Find the parity of a 16 bit word. /*! \brief Find the parity of a 16 bit word.
...@@ -215,9 +208,9 @@ static __inline__ int parity8(uint8_t x) ...@@ -215,9 +208,9 @@ static __inline__ int parity8(uint8_t x)
\return 1 for odd, or 0 for even. */ \return 1 for odd, or 0 for even. */
static __inline__ int parity16(uint16_t x) static __inline__ int parity16(uint16_t x)
{ {
x ^= (x >> 8); x ^= (x >> 8);
x = (x ^ (x >> 4)) & 0x0F; x = (x ^ (x >> 4)) & 0x0F;
return (0x6996 >> x) & 1; return (0x6996 >> x) & 1;
} }
/*! \brief Find the parity of a 32 bit word. /*! \brief Find the parity of a 32 bit word.
...@@ -225,10 +218,10 @@ static __inline__ int parity16(uint16_t x) ...@@ -225,10 +218,10 @@ static __inline__ int parity16(uint16_t x)
\return 1 for odd, or 0 for even. */ \return 1 for odd, or 0 for even. */
static __inline__ int parity32(uint32_t x) static __inline__ int parity32(uint32_t x)
{ {
x ^= (x >> 16); x ^= (x >> 16);
x ^= (x >> 8); x ^= (x >> 8);
x = (x ^ (x >> 4)) & 0x0F; x = (x ^ (x >> 4)) & 0x0F;
return (0x6996 >> x) & 1; return (0x6996 >> x) & 1;
} }
#endif #endif
......
此差异已折叠。
...@@ -124,9 +124,8 @@ a minor burden. ...@@ -124,9 +124,8 @@ a minor burden.
G.168 echo canceller descriptor. This defines the working state for a line G.168 echo canceller descriptor. This defines the working state for a line
echo canceller. echo canceller.
*/ */
struct oslec_state struct oslec_state {
{ int16_t tx, rx;
int16_t tx,rx;
int16_t clean; int16_t clean;
int16_t clean_nlp; int16_t clean_nlp;
...@@ -170,4 +169,4 @@ struct oslec_state ...@@ -170,4 +169,4 @@ struct oslec_state
int16_t *snapshot; int16_t *snapshot;
}; };
#endif /* __ECHO_H */ #endif /* __ECHO_H */
...@@ -72,8 +72,7 @@ ...@@ -72,8 +72,7 @@
16 bit integer FIR descriptor. This defines the working state for a single 16 bit integer FIR descriptor. This defines the working state for a single
instance of an FIR filter using 16 bit integer coefficients. instance of an FIR filter using 16 bit integer coefficients.
*/ */
typedef struct typedef struct {
{
int taps; int taps;
int curr_pos; int curr_pos;
const int16_t *coeffs; const int16_t *coeffs;
...@@ -85,8 +84,7 @@ typedef struct ...@@ -85,8 +84,7 @@ typedef struct
instance of an FIR filter using 32 bit integer coefficients, and filtering instance of an FIR filter using 32 bit integer coefficients, and filtering
16 bit integer data. 16 bit integer data.
*/ */
typedef struct typedef struct {
{
int taps; int taps;
int curr_pos; int curr_pos;
const int32_t *coeffs; const int32_t *coeffs;
...@@ -97,39 +95,37 @@ typedef struct ...@@ -97,39 +95,37 @@ typedef struct
Floating point FIR descriptor. This defines the working state for a single Floating point FIR descriptor. This defines the working state for a single
instance of an FIR filter using floating point coefficients and data. instance of an FIR filter using floating point coefficients and data.
*/ */
typedef struct typedef struct {
{
int taps; int taps;
int curr_pos; int curr_pos;
const float *coeffs; const float *coeffs;
float *history; float *history;
} fir_float_state_t; } fir_float_state_t;
static __inline__ const int16_t *fir16_create(fir16_state_t *fir, static __inline__ const int16_t *fir16_create(fir16_state_t * fir,
const int16_t *coeffs, const int16_t * coeffs, int taps)
int taps)
{ {
fir->taps = taps; fir->taps = taps;
fir->curr_pos = taps - 1; fir->curr_pos = taps - 1;
fir->coeffs = coeffs; fir->coeffs = coeffs;
#if defined(USE_MMX) || defined(USE_SSE2) || defined(__bfin__) #if defined(USE_MMX) || defined(USE_SSE2) || defined(__bfin__)
fir->history = kcalloc(2*taps, sizeof(int16_t), GFP_KERNEL); fir->history = kcalloc(2 * taps, sizeof(int16_t), GFP_KERNEL);
#else #else
fir->history = kcalloc(taps, sizeof(int16_t), GFP_KERNEL); fir->history = kcalloc(taps, sizeof(int16_t), GFP_KERNEL);
#endif #endif
return fir->history; return fir->history;
} }
static __inline__ void fir16_flush(fir16_state_t *fir) static __inline__ void fir16_flush(fir16_state_t * fir)
{ {
#if defined(USE_MMX) || defined(USE_SSE2) || defined(__bfin__) #if defined(USE_MMX) || defined(USE_SSE2) || defined(__bfin__)
memset(fir->history, 0, 2*fir->taps*sizeof(int16_t)); memset(fir->history, 0, 2 * fir->taps * sizeof(int16_t));
#else #else
memset(fir->history, 0, fir->taps*sizeof(int16_t)); memset(fir->history, 0, fir->taps * sizeof(int16_t));
#endif #endif
} }
static __inline__ void fir16_free(fir16_state_t *fir) static __inline__ void fir16_free(fir16_state_t * fir)
{ {
kfree(fir->history); kfree(fir->history);
} }
...@@ -137,166 +133,162 @@ static __inline__ void fir16_free(fir16_state_t *fir) ...@@ -137,166 +133,162 @@ static __inline__ void fir16_free(fir16_state_t *fir)
#ifdef __bfin__ #ifdef __bfin__
static inline int32_t dot_asm(short *x, short *y, int len) static inline int32_t dot_asm(short *x, short *y, int len)
{ {
int dot; int dot;
len--; len--;
__asm__ __asm__("I0 = %1;\n\t"
( "I1 = %2;\n\t"
"I0 = %1;\n\t" "A0 = 0;\n\t"
"I1 = %2;\n\t" "R0.L = W[I0++] || R1.L = W[I1++];\n\t"
"A0 = 0;\n\t" "LOOP dot%= LC0 = %3;\n\t"
"R0.L = W[I0++] || R1.L = W[I1++];\n\t" "LOOP_BEGIN dot%=;\n\t"
"LOOP dot%= LC0 = %3;\n\t" "A0 += R0.L * R1.L (IS) || R0.L = W[I0++] || R1.L = W[I1++];\n\t"
"LOOP_BEGIN dot%=;\n\t" "LOOP_END dot%=;\n\t"
"A0 += R0.L * R1.L (IS) || R0.L = W[I0++] || R1.L = W[I1++];\n\t" "A0 += R0.L*R1.L (IS);\n\t"
"LOOP_END dot%=;\n\t" "R0 = A0;\n\t"
"A0 += R0.L*R1.L (IS);\n\t" "%0 = R0;\n\t"
"R0 = A0;\n\t" :"=&d"(dot)
"%0 = R0;\n\t" :"a"(x), "a"(y), "a"(len)
: "=&d" (dot) :"I0", "I1", "A1", "A0", "R0", "R1"
: "a" (x), "a" (y), "a" (len) );
: "I0", "I1", "A1", "A0", "R0", "R1"
); return dot;
return dot;
} }
#endif #endif
static __inline__ int16_t fir16(fir16_state_t *fir, int16_t sample) static __inline__ int16_t fir16(fir16_state_t * fir, int16_t sample)
{ {
int32_t y; int32_t y;
#if defined(USE_MMX) #if defined(USE_MMX)
int i; int i;
mmx_t *mmx_coeffs; mmx_t *mmx_coeffs;
mmx_t *mmx_hist; mmx_t *mmx_hist;
fir->history[fir->curr_pos] = sample; fir->history[fir->curr_pos] = sample;
fir->history[fir->curr_pos + fir->taps] = sample; fir->history[fir->curr_pos + fir->taps] = sample;
mmx_coeffs = (mmx_t *) fir->coeffs; mmx_coeffs = (mmx_t *) fir->coeffs;
mmx_hist = (mmx_t *) &fir->history[fir->curr_pos]; mmx_hist = (mmx_t *) & fir->history[fir->curr_pos];
i = fir->taps; i = fir->taps;
pxor_r2r(mm4, mm4); pxor_r2r(mm4, mm4);
/* 8 samples per iteration, so the filter must be a multiple of 8 long. */ /* 8 samples per iteration, so the filter must be a multiple of 8 long. */
while (i > 0) while (i > 0) {
{ movq_m2r(mmx_coeffs[0], mm0);
movq_m2r(mmx_coeffs[0], mm0); movq_m2r(mmx_coeffs[1], mm2);
movq_m2r(mmx_coeffs[1], mm2); movq_m2r(mmx_hist[0], mm1);
movq_m2r(mmx_hist[0], mm1); movq_m2r(mmx_hist[1], mm3);
movq_m2r(mmx_hist[1], mm3); mmx_coeffs += 2;
mmx_coeffs += 2; mmx_hist += 2;
mmx_hist += 2; pmaddwd_r2r(mm1, mm0);
pmaddwd_r2r(mm1, mm0); pmaddwd_r2r(mm3, mm2);
pmaddwd_r2r(mm3, mm2); paddd_r2r(mm0, mm4);
paddd_r2r(mm0, mm4); paddd_r2r(mm2, mm4);
paddd_r2r(mm2, mm4); i -= 8;
i -= 8; }
} movq_r2r(mm4, mm0);
movq_r2r(mm4, mm0); psrlq_i2r(32, mm0);
psrlq_i2r(32, mm0); paddd_r2r(mm0, mm4);
paddd_r2r(mm0, mm4); movd_r2m(mm4, y);
movd_r2m(mm4, y); emms();
emms();
#elif defined(USE_SSE2) #elif defined(USE_SSE2)
int i; int i;
xmm_t *xmm_coeffs; xmm_t *xmm_coeffs;
xmm_t *xmm_hist; xmm_t *xmm_hist;
fir->history[fir->curr_pos] = sample; fir->history[fir->curr_pos] = sample;
fir->history[fir->curr_pos + fir->taps] = sample; fir->history[fir->curr_pos + fir->taps] = sample;
xmm_coeffs = (xmm_t *) fir->coeffs; xmm_coeffs = (xmm_t *) fir->coeffs;
xmm_hist = (xmm_t *) &fir->history[fir->curr_pos]; xmm_hist = (xmm_t *) & fir->history[fir->curr_pos];
i = fir->taps; i = fir->taps;
pxor_r2r(xmm4, xmm4); pxor_r2r(xmm4, xmm4);
/* 16 samples per iteration, so the filter must be a multiple of 16 long. */ /* 16 samples per iteration, so the filter must be a multiple of 16 long. */
while (i > 0) while (i > 0) {
{ movdqu_m2r(xmm_coeffs[0], xmm0);
movdqu_m2r(xmm_coeffs[0], xmm0); movdqu_m2r(xmm_coeffs[1], xmm2);
movdqu_m2r(xmm_coeffs[1], xmm2); movdqu_m2r(xmm_hist[0], xmm1);
movdqu_m2r(xmm_hist[0], xmm1); movdqu_m2r(xmm_hist[1], xmm3);
movdqu_m2r(xmm_hist[1], xmm3); xmm_coeffs += 2;
xmm_coeffs += 2; xmm_hist += 2;
xmm_hist += 2; pmaddwd_r2r(xmm1, xmm0);
pmaddwd_r2r(xmm1, xmm0); pmaddwd_r2r(xmm3, xmm2);
pmaddwd_r2r(xmm3, xmm2); paddd_r2r(xmm0, xmm4);
paddd_r2r(xmm0, xmm4); paddd_r2r(xmm2, xmm4);
paddd_r2r(xmm2, xmm4); i -= 16;
i -= 16; }
} movdqa_r2r(xmm4, xmm0);
movdqa_r2r(xmm4, xmm0); psrldq_i2r(8, xmm0);
psrldq_i2r(8, xmm0); paddd_r2r(xmm0, xmm4);
paddd_r2r(xmm0, xmm4); movdqa_r2r(xmm4, xmm0);
movdqa_r2r(xmm4, xmm0); psrldq_i2r(4, xmm0);
psrldq_i2r(4, xmm0); paddd_r2r(xmm0, xmm4);
paddd_r2r(xmm0, xmm4); movd_r2m(xmm4, y);
movd_r2m(xmm4, y);
#elif defined(__bfin__) #elif defined(__bfin__)
fir->history[fir->curr_pos] = sample; fir->history[fir->curr_pos] = sample;
fir->history[fir->curr_pos + fir->taps] = sample; fir->history[fir->curr_pos + fir->taps] = sample;
y = dot_asm((int16_t*)fir->coeffs, &fir->history[fir->curr_pos], fir->taps); y = dot_asm((int16_t *) fir->coeffs, &fir->history[fir->curr_pos],
fir->taps);
#else #else
int i; int i;
int offset1; int offset1;
int offset2; int offset2;
fir->history[fir->curr_pos] = sample; fir->history[fir->curr_pos] = sample;
offset2 = fir->curr_pos; offset2 = fir->curr_pos;
offset1 = fir->taps - offset2; offset1 = fir->taps - offset2;
y = 0; y = 0;
for (i = fir->taps - 1; i >= offset1; i--) for (i = fir->taps - 1; i >= offset1; i--)
y += fir->coeffs[i]*fir->history[i - offset1]; y += fir->coeffs[i] * fir->history[i - offset1];
for ( ; i >= 0; i--) for (; i >= 0; i--)
y += fir->coeffs[i]*fir->history[i + offset2]; y += fir->coeffs[i] * fir->history[i + offset2];
#endif #endif
if (fir->curr_pos <= 0) if (fir->curr_pos <= 0)
fir->curr_pos = fir->taps; fir->curr_pos = fir->taps;
fir->curr_pos--; fir->curr_pos--;
return (int16_t) (y >> 15); return (int16_t) (y >> 15);
} }
static __inline__ const int16_t *fir32_create(fir32_state_t *fir, static __inline__ const int16_t *fir32_create(fir32_state_t * fir,
const int32_t *coeffs, const int32_t * coeffs, int taps)
int taps)
{ {
fir->taps = taps; fir->taps = taps;
fir->curr_pos = taps - 1; fir->curr_pos = taps - 1;
fir->coeffs = coeffs; fir->coeffs = coeffs;
fir->history = kcalloc(taps, sizeof(int16_t), GFP_KERNEL); fir->history = kcalloc(taps, sizeof(int16_t), GFP_KERNEL);
return fir->history; return fir->history;
} }
static __inline__ void fir32_flush(fir32_state_t *fir) static __inline__ void fir32_flush(fir32_state_t * fir)
{ {
memset(fir->history, 0, fir->taps*sizeof(int16_t)); memset(fir->history, 0, fir->taps * sizeof(int16_t));
} }
static __inline__ void fir32_free(fir32_state_t *fir) static __inline__ void fir32_free(fir32_state_t * fir)
{ {
kfree(fir->history); kfree(fir->history);
} }
static __inline__ int16_t fir32(fir32_state_t *fir, int16_t sample) static __inline__ int16_t fir32(fir32_state_t * fir, int16_t sample)
{ {
int i; int i;
int32_t y; int32_t y;
int offset1; int offset1;
int offset2; int offset2;
fir->history[fir->curr_pos] = sample; fir->history[fir->curr_pos] = sample;
offset2 = fir->curr_pos; offset2 = fir->curr_pos;
offset1 = fir->taps - offset2; offset1 = fir->taps - offset2;
y = 0; y = 0;
for (i = fir->taps - 1; i >= offset1; i--) for (i = fir->taps - 1; i >= offset1; i--)
y += fir->coeffs[i]*fir->history[i - offset1]; y += fir->coeffs[i] * fir->history[i - offset1];
for ( ; i >= 0; i--) for (; i >= 0; i--)
y += fir->coeffs[i]*fir->history[i + offset2]; y += fir->coeffs[i] * fir->history[i + offset2];
if (fir->curr_pos <= 0) if (fir->curr_pos <= 0)
fir->curr_pos = fir->taps; fir->curr_pos = fir->taps;
fir->curr_pos--; fir->curr_pos--;
return (int16_t) (y >> 15); return (int16_t) (y >> 15);
} }
#endif #endif
......
...@@ -27,24 +27,23 @@ ...@@ -27,24 +27,23 @@
* values by ULL, lest they be truncated by the compiler) * values by ULL, lest they be truncated by the compiler)
*/ */
typedef union { typedef union {
long long q; /* Quadword (64-bit) value */ long long q; /* Quadword (64-bit) value */
unsigned long long uq; /* Unsigned Quadword */ unsigned long long uq; /* Unsigned Quadword */
int d[2]; /* 2 Doubleword (32-bit) values */ int d[2]; /* 2 Doubleword (32-bit) values */
unsigned int ud[2]; /* 2 Unsigned Doubleword */ unsigned int ud[2]; /* 2 Unsigned Doubleword */
short w[4]; /* 4 Word (16-bit) values */ short w[4]; /* 4 Word (16-bit) values */
unsigned short uw[4]; /* 4 Unsigned Word */ unsigned short uw[4]; /* 4 Unsigned Word */
char b[8]; /* 8 Byte (8-bit) values */ char b[8]; /* 8 Byte (8-bit) values */
unsigned char ub[8]; /* 8 Unsigned Byte */ unsigned char ub[8]; /* 8 Unsigned Byte */
float s[2]; /* Single-precision (32-bit) value */ float s[2]; /* Single-precision (32-bit) value */
} mmx_t; /* On an 8-byte (64-bit) boundary */ } mmx_t; /* On an 8-byte (64-bit) boundary */
/* SSE registers */ /* SSE registers */
typedef union { typedef union {
char b[16]; char b[16];
} xmm_t; } xmm_t;
#define mmx_i2r(op,imm,reg) \ #define mmx_i2r(op,imm,reg) \
__asm__ __volatile__ (#op " %0, %%" #reg \ __asm__ __volatile__ (#op " %0, %%" #reg \
: /* nothing */ \ : /* nothing */ \
...@@ -63,7 +62,6 @@ typedef union { ...@@ -63,7 +62,6 @@ typedef union {
#define mmx_r2r(op,regs,regd) \ #define mmx_r2r(op,regs,regd) \
__asm__ __volatile__ (#op " %" #regs ", %" #regd) __asm__ __volatile__ (#op " %" #regs ", %" #regd)
#define emms() __asm__ __volatile__ ("emms") #define emms() __asm__ __volatile__ ("emms")
#define movd_m2r(var,reg) mmx_m2r (movd, var, reg) #define movd_m2r(var,reg) mmx_m2r (movd, var, reg)
...@@ -192,16 +190,13 @@ typedef union { ...@@ -192,16 +190,13 @@ typedef union {
#define pxor_m2r(var,reg) mmx_m2r (pxor, var, reg) #define pxor_m2r(var,reg) mmx_m2r (pxor, var, reg)
#define pxor_r2r(regs,regd) mmx_r2r (pxor, regs, regd) #define pxor_r2r(regs,regd) mmx_r2r (pxor, regs, regd)
/* 3DNOW extensions */ /* 3DNOW extensions */
#define pavgusb_m2r(var,reg) mmx_m2r (pavgusb, var, reg) #define pavgusb_m2r(var,reg) mmx_m2r (pavgusb, var, reg)
#define pavgusb_r2r(regs,regd) mmx_r2r (pavgusb, regs, regd) #define pavgusb_r2r(regs,regd) mmx_r2r (pavgusb, regs, regd)
/* AMD MMX extensions - also available in intel SSE */ /* AMD MMX extensions - also available in intel SSE */
#define mmx_m2ri(op,mem,reg,imm) \ #define mmx_m2ri(op,mem,reg,imm) \
__asm__ __volatile__ (#op " %1, %0, %%" #reg \ __asm__ __volatile__ (#op " %1, %0, %%" #reg \
: /* nothing */ \ : /* nothing */ \
...@@ -216,7 +211,6 @@ typedef union { ...@@ -216,7 +211,6 @@ typedef union {
: /* nothing */ \ : /* nothing */ \
: "m" (mem)) : "m" (mem))
#define maskmovq(regs,maskreg) mmx_r2ri (maskmovq, regs, maskreg) #define maskmovq(regs,maskreg) mmx_r2ri (maskmovq, regs, maskreg)
#define movntq_r2m(mmreg,var) mmx_r2m (movntq, mmreg, var) #define movntq_r2m(mmreg,var) mmx_r2m (movntq, mmreg, var)
...@@ -284,5 +278,4 @@ typedef union { ...@@ -284,5 +278,4 @@ typedef union {
#define punpcklqdq_r2r(regs,regd) mmx_r2r (punpcklqdq, regs, regd) #define punpcklqdq_r2r(regs,regd) mmx_r2r (punpcklqdq, regs, regd)
#define punpckhqdq_r2r(regs,regd) mmx_r2r (punpckhqdq, regs, regd) #define punpckhqdq_r2r(regs,regd) mmx_r2r (punpckhqdq, regs, regd)
#endif /* AVCODEC_I386MMX_H */ #endif /* AVCODEC_I386MMX_H */
...@@ -83,4 +83,4 @@ int16_t oslec_update(struct oslec_state *ec, int16_t tx, int16_t rx); ...@@ -83,4 +83,4 @@ int16_t oslec_update(struct oslec_state *ec, int16_t tx, int16_t rx);
*/ */
int16_t oslec_hpf_tx(struct oslec_state *ec, int16_t tx); int16_t oslec_hpf_tx(struct oslec_state *ec, int16_t tx);
#endif /* __OSLEC_H */ #endif /* __OSLEC_H */
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册