Ticket #5890: soundtouch-update.patch

File soundtouch-update.patch, 11.3 KB (added by foobum@…, 15 years ago)
  • mythtv/libs/libmythsoundtouch/STTypes.h

    diff --git a/mythtv/libs/libmythsoundtouch/STTypes.h b/mythtv/libs/libmythsoundtouch/STTypes.h
    index acba355..58472de 100644
    a b namespace soundtouch 
    116116            #if _WIN32 || __MMX__ || MMX
    117117                // Allow MMX optimizations
    118118                #define ALLOW_MMX   1
     119                #define ALLOW_SSE   1
    119120            #endif
    120121        #endif
    121122
  • mythtv/libs/libmythsoundtouch/libmythsoundtouch.pro

    diff --git a/mythtv/libs/libmythsoundtouch/libmythsoundtouch.pro b/mythtv/libs/libmythsoundtouch/libmythsoundtouch.pro
    index 3c98681..01aabbf 100644
    a b INCLUDEPATH += ../../libs/libavcodec ../.. 
    1111#build position independent code since the library is linked into a shared library
    1212QMAKE_CXXFLAGS += -fPIC -DPIC
    1313
    14 contains(ARCH_X86_64, yes) { DEFINES += ALLOW_SSE }
    15 
    1614QMAKE_CLEAN += $(TARGET) $(TARGETA) $(TARGETD) $(TARGET0) $(TARGET1) $(TARGET2)
    1715
    1816# Input
    SOURCES += SoundTouch.cpp 
    3028SOURCES += TDStretch.cpp
    3129SOURCES += cpu_detect_x86_gcc.cpp
    3230SOURCES += mmx_gcc.cpp
    33 
    34 contains(ARCH_X86_64, yes) { SOURCES += sse_gcc.cpp }
     31SOURCES += sse_gcc.cpp
    3532
    3633include ( ../libs-targetfix.pro )
  • mythtv/libs/libmythsoundtouch/sse_gcc.cpp

    diff --git a/mythtv/libs/libmythsoundtouch/sse_gcc.cpp b/mythtv/libs/libmythsoundtouch/sse_gcc.cpp
    index 872f441..732f4eb 100644
    a b  
    11// SSE2 version of the expensive routines for 16 bit integer samples
     2#include "../../config.h"
    23#include "STTypes.h"
    34#include "TDStretch.h"
    45using namespace std;
    56using namespace soundtouch;
    67
     8#if defined(ARCH_X86_32)
     9static unsigned long long ones = 0x0001ffff0001ffffULL;
     10#elif defined(ARCH_X86_64)
     11static unsigned long ones = 0x0001ffff0001ffffUL;
     12#endif
     13
    714#ifdef ALLOW_SSE
    815long TDStretchSSE::calcCrossCorrMulti(const short *mPos, const short *cPos) const
    916{
    10        
    1117    long corr = 0;
    1218    int i, out[4];
    1319    int count = (overlapLength * channels) - channels;
    long TDStretchSSE::calcCrossCorrMulti(const short *mPos, const short *cPos) cons 
    1824    cPos += channels;
    1925
    2026    asm(
    21         "xorps      %%xmm8, %%xmm8      \n\t"
    22         "movd       %4, %%xmm9          \n\t"
     27        "xorps      %%xmm5, %%xmm5      \n\t"
     28        "movd       %4, %%xmm7          \n\t"
    2329        "1:                             \n\t"
    2430        "movupd     (%1), %%xmm0        \n\t"
     31        "movupd     (%2), %%xmm1        \n\t"
    2532        "movupd     16(%1), %%xmm2      \n\t"
     33        "pmaddwd    %%xmm0, %%xmm1      \n\t"
    2634        "movupd     32(%1), %%xmm4      \n\t"
    2735        "movupd     48(%1), %%xmm6      \n\t"
    28         "movupd     (%2), %%xmm1        \n\t"
     36        "psrad      %%xmm7, %%xmm1      \n\t"
    2937        "movupd     16(%2), %%xmm3      \n\t"
    30         "movupd     32(%2), %%xmm5      \n\t"
    31         "movupd     48(%2), %%xmm7      \n\t"
    32         "pmaddwd    %%xmm0, %%xmm1      \n\t"
     38        "paddd      %%xmm1, %%xmm5      \n\t"
     39        "movupd     32(%2), %%xmm0      \n\t"
    3340        "pmaddwd    %%xmm2, %%xmm3      \n\t"
    34         "pmaddwd    %%xmm4, %%xmm5      \n\t"
    35         "pmaddwd    %%xmm6, %%xmm7      \n\t"
    36         "psrad      %%xmm9, %%xmm1      \n\t"
    37         "psrad      %%xmm9, %%xmm3      \n\t"
    38         "paddd      %%xmm1, %%xmm8      \n\t"
    39         "psrad      %%xmm9, %%xmm5      \n\t"
    40         "paddd      %%xmm3, %%xmm8      \n\t"
    41         "psrad      %%xmm9, %%xmm7      \n\t"
     41        "movupd     48(%2), %%xmm1      \n\t"
     42        "pmaddwd    %%xmm4, %%xmm0      \n\t"
     43        "psrad      %%xmm7, %%xmm3      \n\t"
     44        "pmaddwd    %%xmm6, %%xmm1      \n\t"
     45        "psrad      %%xmm7, %%xmm0      \n\t"
     46        "paddd      %%xmm3, %%xmm5      \n\t"
     47        "psrad      %%xmm7, %%xmm1      \n\t"
     48        "paddd      %%xmm0, %%xmm5      \n\t"
    4249        "add        $64, %1             \n\t"
    43         "paddd      %%xmm5, %%xmm8      \n\t"
     50        "paddd      %%xmm1, %%xmm5      \n\t"
    4451        "add        $64, %2             \n\t"
    45         "paddd      %%xmm7, %%xmm8      \n\t"
    4652        "loop       1b                  \n\t"
    47         "movdqa     %%xmm8, %0          \n\t"
    48         :"=m"(out)
    49         :"r"(mPos), "r"(cPos), "c"(loops), "r"(overlapDividerBits)
     53        "movdqa     %%xmm5, %0          \n\t"
     54        :"=m"(out[0])
     55        :"r"(mPos), "r"(cPos), "c"(loops), "m"(overlapDividerBits)
    5056    );
    5157
    5258    corr = out[0] + out[1] + out[2] + out[3];
    long TDStretchSSE::calcCrossCorrMulti(const short *mPos, const short *cPos) cons 
    5864        corr += (mPos[i] * cPos[i]) >> overlapDividerBits;
    5965
    6066    return corr;
    61 
    6267}
    6368
    6469long TDStretchSSE::calcCrossCorrStereo(const short *mPos, const short *cPos) const
    6570{
    66        
    6771    long corr = 0;
    6872    int i, out[4];
    6973    int count = (overlapLength<<1) - 2;
    long TDStretchSSE::calcCrossCorrStereo(const short *mPos, const short *cPos) con 
    7478    cPos += 2;
    7579
    7680    asm(
    77         "xorps      %%xmm8, %%xmm8      \n\t"
    78         "movd       %4, %%xmm9          \n\t"
     81        "xorps      %%xmm5, %%xmm5      \n\t"
     82        "movd       %4, %%xmm7          \n\t"
    7983        "1:                             \n\t"
    8084        "movupd     (%1), %%xmm0        \n\t"
     85        "movupd     (%2), %%xmm1        \n\t"
    8186        "movupd     16(%1), %%xmm2      \n\t"
     87        "pmaddwd    %%xmm0, %%xmm1      \n\t"
    8288        "movupd     32(%1), %%xmm4      \n\t"
    8389        "movupd     48(%1), %%xmm6      \n\t"
    84         "movupd     (%2), %%xmm1        \n\t"
     90        "psrad      %%xmm7, %%xmm1      \n\t"
    8591        "movupd     16(%2), %%xmm3      \n\t"
    86         "movupd     32(%2), %%xmm5      \n\t"
    87         "movupd     48(%2), %%xmm7      \n\t"
    88         "pmaddwd    %%xmm0, %%xmm1      \n\t"
     92        "paddd      %%xmm1, %%xmm5      \n\t"
     93        "movupd     32(%2), %%xmm0      \n\t"
    8994        "pmaddwd    %%xmm2, %%xmm3      \n\t"
    90         "pmaddwd    %%xmm4, %%xmm5      \n\t"
    91         "pmaddwd    %%xmm6, %%xmm7      \n\t"
    92         "psrad      %%xmm9, %%xmm1      \n\t"
    93         "psrad      %%xmm9, %%xmm3      \n\t"
    94         "paddd      %%xmm1, %%xmm8      \n\t"
    95         "psrad      %%xmm9, %%xmm5      \n\t"
    96         "paddd      %%xmm3, %%xmm8      \n\t"
    97         "psrad      %%xmm9, %%xmm7      \n\t"
     95        "movupd     48(%2), %%xmm1      \n\t"
     96        "pmaddwd    %%xmm4, %%xmm0      \n\t"
     97        "psrad      %%xmm7, %%xmm3      \n\t"
     98        "pmaddwd    %%xmm6, %%xmm1      \n\t"
     99        "psrad      %%xmm7, %%xmm0      \n\t"
     100        "paddd      %%xmm3, %%xmm5      \n\t"
     101        "psrad      %%xmm7, %%xmm1      \n\t"
     102        "paddd      %%xmm0, %%xmm5      \n\t"
    98103        "add        $64, %1             \n\t"
    99         "paddd      %%xmm5, %%xmm8      \n\t"
     104        "paddd      %%xmm1, %%xmm5      \n\t"
    100105        "add        $64, %2             \n\t"
    101         "paddd      %%xmm7, %%xmm8      \n\t"
    102106        "loop       1b                  \n\t"
    103         "movdqa     %%xmm8, %0          \n\t"
    104         :"=m"(out)
    105         :"r"(mPos), "r"(cPos), "c"(loops), "r"(overlapDividerBits)
     107        "movdqa     %%xmm5, %0          \n\t"
     108        :"=m"(out[0])
     109        :"r"(mPos), "r"(cPos), "c"(loops), "m"(overlapDividerBits)
    106110    );
    107111
    108112    corr = out[0] + out[1] + out[2] + out[3];
    long TDStretchSSE::calcCrossCorrStereo(const short *mPos, const short *cPos) con 
    115119                 mPos[i+1] * cPos[i+1]) >> overlapDividerBits;
    116120
    117121    return corr;
    118 
    119122}
    120123
    121124void TDStretchSSE::overlapMulti(short *output, const short *input) const
    122125{
    123     unsigned long ones = 0x0001ffff0001ffffUL;
    124    
    125126    asm(
    126127        "movd       %%ecx, %%xmm0       \n\t"
    127         "punpckldq  %%xmm0, %%xmm0      \n\t"
    128128        "shl        %6                  \n\t"
    129129        "punpckldq  %%xmm0, %%xmm0      \n\t"
    130         "movd       %1, %%xmm1          \n\t"
    131130        "movq       %2, %%xmm2          \n\t"
     131        "punpckldq  %%xmm0, %%xmm0      \n\t"
     132        "movd       %1, %%xmm1          \n\t"
    132133        "punpckldq  %%xmm2, %%xmm2      \n\t"
    133134        "1:                             \n\t"
    134135        "movdqu     (%3), %%xmm3        \n\t"
    135136        "movdqu     (%4), %%xmm4        \n\t"
    136         "movdqu     %%xmm4, %%xmm5      \n\t"
     137        "movdqa     %%xmm4, %%xmm5      \n\t"
    137138        "punpcklwd  %%xmm3, %%xmm4      \n\t"
    138         "punpckhwd  %%xmm3, %%xmm5      \n\t"
    139139        "add        %6, %3              \n\t"
     140        "punpckhwd  %%xmm3, %%xmm5      \n\t"
    140141        "pmaddwd    %%xmm0, %%xmm4      \n\t"
     142        "add        %6, %4              \n\t"
    141143        "pmaddwd    %%xmm0, %%xmm5      \n\t"
    142144        "psrad      %%xmm1, %%xmm4      \n\t"
    143145        "psrad      %%xmm1, %%xmm5      \n\t"
    144         "add        %6, %4              \n\t"
    145146        "packssdw   %%xmm5, %%xmm4      \n\t"
     147        "paddw      %%xmm2, %%xmm0      \n\t"
    146148        "movdqu     %%xmm4, (%5)        \n\t"
    147149        "add        %6, %5              \n\t"
    148         "paddw      %%xmm2, %%xmm0      \n\t"
    149150        "loop       1b                  \n\t"
    150         ::"c"(overlapLength),"r"(overlapDividerBits),
    151         "r"(ones),"r"(input),"r"(pMidBuffer),"r"(output),
     151        ::"c"(overlapLength),"m"(overlapDividerBits),
     152        "m"(ones),"r"(input),"r"(pMidBuffer),"r"(output),
    152153        "r"((long)channels)
    153154    );
    154155}
    void TDStretchSSE::overlapMulti(short *output, const short *input) const 
    156157void TDStretchSSE::overlapStereo(short *output, const short *input) const
    157158{
    158159    // 4 bytes per sample - use MMX
    159     unsigned long ones = 0x0001ffff0001ffffUL;
    160 
    161160    asm(
    162161        "movd       %%ecx, %%mm0        \n\t"
    163         "shr        $1, %%ecx           \n\t"
    164162        "punpckldq  %%mm0, %%mm0        \n\t"
    165         "movq       %1, %%mm1           \n\t"
     163        "shr        $1, %%ecx           \n\t"
    166164        "movq       %%mm0, %%mm6        \n\t"
    167165        "movq       %2, %%mm2           \n\t"
    168166        "paddw      %%mm2, %%mm6        \n\t"
     167        "movd       %1, %%mm1           \n\t"
    169168        "paddw      %%mm2, %%mm2        \n\t"
    170169        "1:                             \n\t"
    171         "movq       (%3), %%mm3         \n\t"
    172170        "movq       (%4), %%mm4         \n\t"
     171        "movq       (%3), %%mm3         \n\t"
    173172        "movq       %%mm4, %%mm5        \n\t"
    174173        "punpcklwd  %%mm3, %%mm4        \n\t"
    175         "punpckhwd  %%mm3, %%mm5        \n\t"
    176174        "add        $8, %3              \n\t"
    177175        "pmaddwd    %%mm0, %%mm4        \n\t"
    178         "pmaddwd    %%mm6, %%mm5        \n\t"
     176        "punpckhwd  %%mm3, %%mm5        \n\t"
    179177        "psrad      %%mm1, %%mm4        \n\t"
    180         "psrad      %%mm1, %%mm5        \n\t"
     178        "pmaddwd    %%mm6, %%mm5        \n\t"
    181179        "add        $8, %4              \n\t"
     180        "psrad      %%mm1, %%mm5        \n\t"
     181        "paddw      %%mm2, %%mm0        \n\t"
    182182        "packssdw   %%mm5, %%mm4        \n\t"
     183        "paddw      %%mm2, %%mm6        \n\t"
    183184        "movq       %%mm4, (%5)         \n\t"
    184185        "add        $8, %5              \n\t"
    185         "paddw      %%mm2, %%mm0        \n\t"
    186         "paddw      %%mm2, %%mm6        \n\t"
    187186        "loop       1b                  \n\t"
    188187        "emms                           \n\t"
    189         ::"c"(overlapLength),"r"((long)overlapDividerBits),
    190         "r"(ones),"r"(input),"r"(pMidBuffer),"r"(output)
     188        ::"c"(overlapLength),"m"(overlapDividerBits),
     189        "m"(ones),"r"(input),"r"(pMidBuffer),"r"(output)
    191190    );
    192 
    193191}
    194192#endif // ALLOW_SSE