Use DECLARE_ALIGNED and remove unneeded attribute_used
[ffmpeg.git] / libavcodec / i386 / idct_mmx_xvid.c
index c27a354..15e5290 100644 (file)
@@ -1,54 +1,46 @@
-///****************************************************************************
-// *
-// *  XVID MPEG-4 VIDEO CODEC
-// *  - MMX and XMM forward discrete cosine transform -
-// *
-// *  Copyright(C) 2001 Peter Ross <pross@xvid.org>
-// *
-// *  This program is free software; you can redistribute it and/or modify it
-// *  under the terms of the GNU General Public License as published by
-// *  the Free Software Foundation; either version 2 of the License, or
-// *  (at your option) any later version.
-// *
-// *  This program is distributed in the hope that it will be useful,
-// *  but WITHOUT ANY WARRANTY; without even the implied warranty of
-// *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// *  GNU General Public License for more details.
-// *
-// *  You should have received a copy of the GNU General Public License
-// *  along with this program; if not, write to the Free Software
-// *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-// *
-// * $Id$
-// *
-// ***************************************************************************/
-
-// ****************************************************************************
-//
-// Originally provided by Intel at AP-922
-// http://developer.intel.com/vtune/cbts/strmsimd/922down.htm
-// (See more app notes at http://developer.intel.com/vtune/cbts/strmsimd/appnotes.htm)
-// but in a limited edition.
-// New macro implements a column part for precise iDCT
-// The routine precision now satisfies IEEE standard 1180-1990.
-//
-// Copyright(C) 2000-2001 Peter Gubanov <peter@elecard.net.ru>
-// Rounding trick Copyright(C) 2000 Michel Lespinasse <walken@zoy.org>
-//
-// http://www.elecard.com/peter/idct.html
-// http://www.linuxvideo.org/mpeg2dec/
-//
-// ***************************************************************************/
-//
-// These examples contain code fragments for first stage iDCT 8x8
-// (for rows) and first stage DCT 8x8 (for columns)
-//
-
-// conversion to gcc syntax by michael niedermayer
-
+/*
+ * XVID MPEG-4 VIDEO CODEC
+ * - MMX and XMM forward discrete cosine transform -
+ *
+ * Copyright(C) 2001 Peter Ross <pross@xvid.org>
+ *
+ * Originally provided by Intel at AP-922
+ * http://developer.intel.com/vtune/cbts/strmsimd/922down.htm
+ * (See more app notes at http://developer.intel.com/vtune/cbts/strmsimd/appnotes.htm)
+ * but in a limited edition.
+ * New macro implements a column part for precise iDCT
+ * The routine precision now satisfies IEEE standard 1180-1990.
+ *
+ * Copyright(C) 2000-2001 Peter Gubanov <peter@elecard.net.ru>
+ * Rounding trick Copyright(C) 2000 Michel Lespinasse <walken@zoy.org>
+ *
+ * http://www.elecard.com/peter/idct.html
+ * http://www.linuxvideo.org/mpeg2dec/
+ *
+ * These examples contain code fragments for first stage iDCT 8x8
+ * (for rows) and first stage DCT 8x8 (for columns)
+ *
+ * conversion to gcc syntax by Michael Niedermayer
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with FFmpeg; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
 
 #include <inttypes.h>
-#include "../avcodec.h"
+#include "avcodec.h"
 
 //=============================================================================
 // Macros and other preprocessor constants
 //-----------------------------------------------------------------------------
 
 
-static const int16_t one_corr[4] attribute_used __attribute__ ((aligned(8))) = {
-  1,1,1,1};
-static const int32_t round_inv_row[2] attribute_used __attribute__ ((aligned(8))) = { 
- RND_INV_ROW,  RND_INV_ROW};
-static const int16_t round_inv_col[4] attribute_used __attribute__ ((aligned(8))) = { 
- RND_INV_COL,  RND_INV_COL,  RND_INV_COL, RND_INV_COL};
-static const int16_t round_inv_corr[4] attribute_used __attribute__ ((aligned(8))) = { 
- RND_INV_CORR, RND_INV_CORR, RND_INV_CORR, RND_INV_CORR};
-static const int32_t round_frw_row[2] attribute_used __attribute__ ((aligned(8))) = { 
- RND_FRW_ROW,  RND_FRW_ROW};
-static const int16_t tg_1_16[4] attribute_used __attribute__ ((aligned(8))) = { 
-  13036,13036,13036,13036};       // tg * (2<<16) + 0.5
-static const int16_t tg_2_16[4] attribute_used __attribute__ ((aligned(8))) = { 
-  27146,27146,27146,27146};       // tg * (2<<16) + 0.5
-static const int16_t tg_3_16[4] attribute_used __attribute__ ((aligned(8))) = { 
-  -21746,-21746,-21746,-21746};    // tg * (2<<16) + 0.5
-static const int16_t cos_4_16[4] attribute_used __attribute__ ((aligned(8))) = { 
-  -19195,-19195,-19195,-19195};    // cos * (2<<16) + 0.5
-static const int16_t ocos_4_16[4] attribute_used __attribute__ ((aligned(8))) = { 
+DECLARE_ALIGNED(8, static const int16_t, tg_1_16[4*4]) = {
+  13036,13036,13036,13036,        // tg * (2<<16) + 0.5
+  27146,27146,27146,27146,        // tg * (2<<16) + 0.5
+  -21746,-21746,-21746,-21746,    // tg * (2<<16) + 0.5
   23170,23170,23170,23170};       // cos * (2<<15) + 0.5
-static const int16_t otg_3_16[4] attribute_used __attribute__ ((aligned(8))) = { 
-  21895,21895,21895,21895};       // tg * (2<<16) + 0.5
 
-static const int32_t rounder_0[2*8] attribute_used __attribute__ ((aligned(8))) = { 
+DECLARE_ALIGNED(8, static const int32_t, rounder_0[2*8]) = {
   65536,65536,
   3597,3597,
   2260,2260,
@@ -165,7 +140,7 @@ static const int32_t rounder_0[2*8] attribute_used __attribute__ ((aligned(8)))
 //-----------------------------------------------------------------------------
 
 // Table for rows 0,4 - constants are multiplied by cos_4_16
-static const int16_t tab_i_04_mmx[32*4] attribute_used __attribute__ ((aligned(8))) = { 
+DECLARE_ALIGNED(8, static const int16_t, tab_i_04_mmx[32*4]) = {
   16384,16384,16384,-16384,       // movq-> w06 w04 w02 w00
   21407,8867,8867,-21407,         // w07 w05 w03 w01
   16384,-16384,16384,16384,       // w14 w12 w10 w08
@@ -207,7 +182,7 @@ static const int16_t tab_i_04_mmx[32*4] attribute_used __attribute__ ((aligned(8
 //-----------------------------------------------------------------------------
 
 // %3 for rows 0,4 - constants are multiplied by cos_4_16
-static const int16_t tab_i_04_xmm[32*4] attribute_used __attribute__ ((aligned(8))) = { 
+DECLARE_ALIGNED(8, static const int16_t, tab_i_04_xmm[32*4]) = {
   16384,21407,16384,8867,      // movq-> w05 w04 w01 w00
   16384,8867,-16384,-21407,    // w07 w06 w03 w02
   16384,-8867,16384,-21407,    // w13 w12 w09 w08
@@ -311,17 +286,17 @@ static const int16_t tab_i_04_xmm[32*4] attribute_used __attribute__ ((aligned(8
   "movq 8+" #A1 ",%%mm1                \n\t"/* 1     ; x7 x6 x5 x4*/\
   "movq %%mm0,%%mm2                \n\t"/* 2     ; x3 x2 x1 x0*/\
   "movq " #A3 ",%%mm3                  \n\t"/* 3     ; w05 w04 w01 w00*/\
-  "pshufw $0b10001000,%%mm0,%%mm0  \n\t"/* x2 x0 x2 x0*/\
+  "pshufw $0x88,%%mm0,%%mm0        \n\t"/* x2 x0 x2 x0*/\
   "movq 8+" #A3 ",%%mm4                \n\t"/* 4     ; w07 w06 w03 w02*/\
   "movq %%mm1,%%mm5                \n\t"/* 5     ; x7 x6 x5 x4*/\
   "pmaddwd %%mm0,%%mm3             \n\t"/* x2*w05+x0*w04 x2*w01+x0*w00*/\
   "movq 32+" #A3 ",%%mm6               \n\t"/* 6     ; w21 w20 w17 w16*/\
-  "pshufw $0b10001000,%%mm1,%%mm1  \n\t"/* x6 x4 x6 x4*/\
+  "pshufw $0x88,%%mm1,%%mm1        \n\t"/* x6 x4 x6 x4*/\
   "pmaddwd %%mm1,%%mm4             \n\t"/* x6*w07+x4*w06 x6*w03+x4*w02*/\
   "movq 40+" #A3 ",%%mm7               \n\t"/* 7    ; w23 w22 w19 w18*/\
-  "pshufw $0b11011101,%%mm2,%%mm2  \n\t"/* x3 x1 x3 x1*/\
+  "pshufw $0xdd,%%mm2,%%mm2        \n\t"/* x3 x1 x3 x1*/\
   "pmaddwd %%mm2,%%mm6             \n\t"/* x3*w21+x1*w20 x3*w17+x1*w16*/\
-  "pshufw $0b11011101,%%mm5,%%mm5  \n\t"/* x7 x5 x7 x5*/\
+  "pshufw $0xdd,%%mm5,%%mm5        \n\t"/* x7 x5 x7 x5*/\
   "pmaddwd %%mm5,%%mm7             \n\t"/* x7*w23+x5*w22 x7*w19+x5*w18*/\
   "paddd " #A4 ",%%mm3                 \n\t"/* +%4*/\
   "pmaddwd 16+" #A3 ",%%mm0            \n\t"/* x2*w13+x0*w12 x2*w09+x0*w08*/\
@@ -346,7 +321,7 @@ static const int16_t tab_i_04_xmm[32*4] attribute_used __attribute__ ((aligned(8
   "packssdw %%mm0,%%mm3            \n\t"/* 0     ; y3 y2 y1 y0*/\
   "packssdw %%mm4,%%mm7            \n\t"/* 4     ; y6 y7 y4 y5*/\
   "movq %%mm3, " #A2 "                  \n\t"/* 3     ; save y3 y2 y1 y0*/\
-  "pshufw $0b10110001,%%mm7,%%mm7  \n\t"/* y7 y6 y5 y4*/\
+  "pshufw $0xb1,%%mm7,%%mm7        \n\t"/* y7 y6 y5 y4*/\
   "movq %%mm7,8                +" #A2 "\n\t"/* 7     ; save y7 y6 y5 y4*/\
 
 
@@ -414,12 +389,12 @@ static const int16_t tab_i_04_xmm[32*4] attribute_used __attribute__ ((aligned(8
 //-----------------------------------------------------------------------------
 
 #define DCT_8_INV_COL(A1,A2)\
-  "movq tg_3_16,%%mm0\n\t"\
+  "movq 2*8(%3),%%mm0\n\t"\
   "movq 16*3+" #A1 ",%%mm3\n\t"\
   "movq %%mm0,%%mm1            \n\t"/* tg_3_16*/\
   "movq 16*5+" #A1 ",%%mm5\n\t"\
   "pmulhw %%mm3,%%mm0          \n\t"/* x3*(tg_3_16-1)*/\
-  "movq tg_1_16,%%mm4\n\t"\
+  "movq (%3),%%mm4\n\t"\
   "pmulhw %%mm5,%%mm1          \n\t"/* x5*(tg_3_16-1)*/\
   "movq 16*7+" #A1 ",%%mm7\n\t"\
   "movq %%mm4,%%mm2            \n\t"/* tg_1_16*/\
@@ -429,7 +404,7 @@ static const int16_t tab_i_04_xmm[32*4] attribute_used __attribute__ ((aligned(8
   "pmulhw %%mm6,%%mm2          \n\t"/* x1*tg_1_16*/\
   "paddsw %%mm3,%%mm1          \n\t"/* x3+x5*(tg_3_16-1)*/\
   "psubsw %%mm5,%%mm0          \n\t"/* x3*tg_3_16-x5 = tm35*/\
-  "movq ocos_4_16,%%mm3\n\t"\
+  "movq 3*8(%3),%%mm3\n\t"\
   "paddsw %%mm5,%%mm1          \n\t"/* x3+x5*tg_3_16 = tp35*/\
   "paddsw %%mm6,%%mm4          \n\t"/* x1+tg_1_16*x7 = tp17*/\
   "psubsw %%mm7,%%mm2          \n\t"/* x1*tg_1_16-x7 = tm17*/\
@@ -439,7 +414,7 @@ static const int16_t tab_i_04_xmm[32*4] attribute_used __attribute__ ((aligned(8
   "psubsw %%mm0,%%mm6          \n\t"/* tm17-tm35 = b3*/\
   "psubsw %%mm1,%%mm4          \n\t"/* tp17-tp35 = t1*/\
   "paddsw %%mm0,%%mm2          \n\t"/* tm17+tm35 = t2*/\
-  "movq tg_2_16,%%mm7\n\t"\
+  "movq 1*8(%3),%%mm7\n\t"\
   "movq %%mm4,%%mm1            \n\t"/* t1*/\
   "movq %%mm5,3*16         +" #A2 "\n\t"/* save b0*/\
   "paddsw %%mm2,%%mm1          \n\t"/* t1+t2*/\
@@ -518,11 +493,11 @@ asm volatile(
     DCT_8_INV_ROW_MMX(5*16(%0), 5*16(%0), 64*3(%2), 8*5(%1))
     DCT_8_INV_ROW_MMX(6*16(%0), 6*16(%0), 64*2(%2), 8*6(%1))
     DCT_8_INV_ROW_MMX(7*16(%0), 7*16(%0), 64*1(%2), 8*7(%1))
-    
+
             //# Process the columns (4 at a time)
     DCT_8_INV_COL(0(%0), 0(%0))
     DCT_8_INV_COL(8(%0), 8(%0))
-    :: "r"(block), "r"(rounder_0), "r"(tab_i_04_mmx));
+    :: "r"(block), "r"(rounder_0), "r"(tab_i_04_mmx), "r"(tg_1_16));
 }
 
 //-----------------------------------------------------------------------------
@@ -541,10 +516,10 @@ asm volatile(
     DCT_8_INV_ROW_XMM(5*16(%0), 5*16(%0), 64*3(%2), 8*5(%1))
     DCT_8_INV_ROW_XMM(6*16(%0), 6*16(%0), 64*2(%2), 8*6(%1))
     DCT_8_INV_ROW_XMM(7*16(%0), 7*16(%0), 64*1(%2), 8*7(%1))
-    
+
             //# Process the columns (4 at a time)
     DCT_8_INV_COL(0(%0), 0(%0))
     DCT_8_INV_COL(8(%0), 8(%0))
-    :: "r"(block), "r"(rounder_0), "r"(tab_i_04_xmm));
+    :: "r"(block), "r"(rounder_0), "r"(tab_i_04_xmm), "r"(tg_1_16));
 }