Changeset 531dda8035e8700b48033ceb0e9a1015537944c7

Show
Ignore:
Timestamp:
23/08/07 01:26:16 (1 year ago)
Author:
Damien Fouilleul <damienf@videolan.org>
git-committer:
Damien Fouilleul <damienf@videolan.org> 1187825176 +0000
git-parent:

[dbcad1d80868a0854570ef3c6049634ad8d959d6]

git-author:
Damien Fouilleul <damienf@videolan.org> 1187825176 +0000
Message:

i420_yuy2: for MMX and SSE2, split inline assembly to avoid register starvation

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • configure.ac

    r1048cc3 r531dda8  
    10461046if test "${ac_cv_c_omit_frame_pointer}" != "no"; then 
    10471047    CFLAGS_OPTIM_NODEBUG="${CFLAGS_OPTIM_NODEBUG} -fomit-frame-pointer" 
    1048     # these plugins do not compile without -fomit-frame-pointer, damn gcc! 
    1049     VLC_ADD_CFLAGS([i420_yuy2_mmx i420_yuy2_sse2],[-fomit-frame-pointer]) 
    10501048fi 
    10511049 
  • modules/video_chroma/i420_yuy2.h

    rdf3b5ee r531dda8  
    3232    do {                                    \ 
    3333    __asm__ __volatile__(                   \ 
     34        ".p2align 3 \n\t                    \ 
     35movd       (%1), %%mm1  # Load 4 Cb           00 00 00 00 u3 u2 u1 u0     \n\ 
     36movd       (%2), %%mm2  # Load 4 Cr           00 00 00 00 v3 v2 v1 v0     \n\ 
     37movq       (%2), %%mm0  # Load 8 Y            y7 y6 y5 y4 y3 y2 y1 y0     \n\ 
     38movq       (%3), %%mm3  # Load 8 Y            Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0     \n\ 
     39" \ 
     40        :                                   \ 
     41        : "r" (p_u), "r" (p_v),             \ 
     42          "r" (p_y1), "r" (p_y2) );         \ 
     43    __asm__ __volatile__(                   \ 
    3444        ".p2align 3 \n\t"                   \ 
    3545        MMX_INSTRUCTIONS                    \ 
    3646        :                                   \ 
    37         : "r" (p_line1), "r" (p_line2),     \ 
    38           "r" (p_y1), "r" (p_y2),           \ 
    39           "r" (p_u), "r" (p_v) );           \ 
     47        : "r" (p_line1), "r" (p_line2) );   \ 
    4048        p_line1 += 16; p_line2 += 16;       \ 
    4149        p_y1 += 8; p_y2 += 8;               \ 
     
    4654 
    4755#define MMX_YUV420_YUYV "                                                 \n\ 
    48 movd       (%4), %%mm1  # Load 4 Cb           00 00 00 00 u3 u2 u1 u0     \n\ 
    49 movd       (%5), %%mm2  # Load 4 Cr           00 00 00 00 v3 v2 v1 v0     \n\ 
    50 movq       (%2), %%mm0  # Load 8 Y            y7 y6 y5 y4 y3 y2 y1 y0     \n\ 
    51 movq       (%3), %%mm3  # Load 8 Y            Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0     \n\ 
    5256punpcklbw %%mm2, %%mm1  #                     v3 u3 v2 u2 v1 u1 v0 u0     \n\ 
    5357movq      %%mm0, %%mm2  #                     y7 y6 y5 y4 y3 y2 y1 y0     \n\ 
     
    6468 
    6569#define MMX_YUV420_YVYU "                                                 \n\ 
    66 movd       (%4), %%mm2  # Load 4 Cb           00 00 00 00 u3 u2 u1 u0     \n\ 
    67 movd       (%5), %%mm1  # Load 4 Cr           00 00 00 00 v3 v2 v1 v0     \n\ 
    68 movq       (%2), %%mm0  # Load 8 Y            y7 y6 y5 y4 y3 y2 y1 y0     \n\ 
    69 movq       (%3), %%mm3  # Load 8 Y            Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0     \n\ 
    70 punpcklbw %%mm2, %%mm1  #                     u3 v3 u2 v2 u1 v1 u0 v0     \n\ 
    71 movq      %%mm0, %%mm2  #                     y7 y6 y5 y4 y3 y2 y1 y0     \n\ 
    72 punpcklbw %%mm1, %%mm2  #                     u1 y3 v1 y2 u0 y1 v0 y0     \n\ 
    73 movq      %%mm2, (%0)   # Store low YUYV                                  \n\ 
    74 punpckhbw %%mm1, %%mm0  #                     u3 y7 v3 y6 u2 y5 v2 y4     \n\ 
     70punpcklbw %%mm1, %%mm2  #                     u3 v3 u2 v2 u1 v1 u0 v0     \n\ 
     71movq      %%mm0, %%mm1  #                     y7 y6 y5 y4 y3 y2 y1 y0     \n\ 
     72punpcklbw %%mm2, %%mm1  #                     u1 y3 v1 y2 u0 y1 v0 y0     \n\ 
     73movq      %%mm1, (%0)   # Store low YUYV                                  \n\ 
     74punpckhbw %%mm2, %%mm0  #                     u3 y7 v3 y6 u2 y5 v2 y4     \n\ 
    7575movq      %%mm0, 8(%0)  # Store high YUYV                                 \n\ 
    7676movq      %%mm3, %%mm4  #                     Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0     \n\ 
    77 punpcklbw %%mm1, %%mm4  #                     u1 Y3 v1 Y2 u0 Y1 v0 Y0     \n\ 
     77punpcklbw %%mm2, %%mm4  #                     u1 Y3 v1 Y2 u0 Y1 v0 Y0     \n\ 
    7878movq      %%mm4, (%1)   # Store low YUYV                                  \n\ 
    79 punpckhbw %%mm1, %%mm3  #                     u3 Y7 v3 Y6 u2 Y5 v2 Y4     \n\ 
     79punpckhbw %%mm2, %%mm3  #                     u3 Y7 v3 Y6 u2 Y5 v2 Y4     \n\ 
    8080movq      %%mm3, 8(%1)  # Store high YUYV                                 \n\ 
    8181" 
    8282 
    8383#define MMX_YUV420_UYVY "                                                 \n\ 
    84 movd       (%4), %%mm1  # Load 4 Cb           00 00 00 00 u3 u2 u1 u0     \n\ 
    85 movd       (%5), %%mm2  # Load 4 Cr           00 00 00 00 v3 v2 v1 v0     \n\ 
    86 movq       (%2), %%mm0  # Load 8 Y            y7 y6 y5 y4 y3 y2 y1 y0     \n\ 
    87 movq       (%3), %%mm3  # Load 8 Y            Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0     \n\ 
    8884punpcklbw %%mm2, %%mm1  #                     v3 u3 v2 u2 v1 u1 v0 u0     \n\ 
    8985movq      %%mm1, %%mm2  #                     v3 u3 v2 u2 v1 u1 v0 u0     \n\ 
     
    10298/* FIXME: this code does not work ! Chroma seems to be wrong. */ 
    10399#define MMX_YUV420_Y211 "                                                 \n\ 
    104 movq       (%2), %%mm0  # Load 8 Y            y7 y6 y5 y4 y3 y2 y1 y0     \n\ 
    105 movq       (%3), %%mm1  # Load 8 Y            Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0     \n\ 
    106100movd       (%4), %%mm2  # Load 4 Cb           00 00 00 00 u3 u2 u1 u0     \n\ 
    107101movd       (%5), %%mm3  # Load 4 Cr           00 00 00 00 v3 v2 v1 v0     \n\ 
     
    201195    do {                                \ 
    202196    __asm__ __volatile__(               \ 
     197        ".p2align 3 \n\t                \ 
     198movq        (%0), %%xmm1  # Load 8 Cb         u7 u6 u5 u4 u3 u2 u1 u0     \n\ 
     199movq        (%1), %%xmm2  # Load 8 Cr         v7 06 v5 v4 v3 v2 v1 v0     \n\ 
     200" \ 
     201        :                               \ 
     202        : "r" (p_u),  "r" (p_v) );      \ 
     203    __asm__ __volatile__(               \ 
    203204        ".p2align 3 \n\t"               \ 
    204205        SSE2_INSTRUCTIONS               \ 
    205206        :                               \ 
    206207        : "r" (p_line1), "r" (p_line2), \ 
    207           "r" (p_y1),  "r" (p_y2),      \ 
    208           "r" (p_u), "r" (p_v) );       \ 
     208          "r" (p_y1),  "r" (p_y2) );    \ 
    209209        p_line1 += 32; p_line2 += 32;   \ 
    210210        p_y1 += 16; p_y2 += 16;         \ 
     
    215215 
    216216#define SSE2_YUV420_YUYV_ALIGNED "                                        \n\ 
    217 movq        (%4), %%xmm1  # Load 8 Cb         u7 u6 u5 u4 u3 u2 u1 u0     \n\ 
    218 movq        (%5), %%xmm2  # Load 8 Cr         v7 06 v5 v4 v3 v2 v1 v0     \n\ 
    219217movdqa      (%2), %%xmm0  # Load 16 Y         y15 y14 y13 .. y2 y1 y0     \n\ 
    220218movdqa      (%3), %%xmm3  # Load 16 Y         Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0     \n\ 
     
    233231 
    234232#define SSE2_YUV420_YUYV_UNALIGNED "                                      \n\ 
    235 movq        (%4), %%xmm1  # Load 8 Cb         00 00 00 00 u3 u2 u1 u0     \n\ 
    236 movq        (%5), %%xmm2  # Load 8 Cr         00 00 00 00 v3 v2 v1 v0     \n\ 
    237233movdqu      (%2), %%xmm0  # Load 16 Y         y7 y6 y5 y4 y3 y2 y1 y0     \n\ 
    238234movdqu      (%3), %%xmm3  # Load 16 Y         Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0     \n\ 
     
    253249 
    254250#define SSE2_YUV420_YVYU_ALIGNED "                                        \n\ 
    255 movq        (%4), %%xmm2  # Load 8 Cb           00 00 00 00 u3 u2 u1 u0   \n\ 
    256 movq        (%5), %%xmm1  # Load 8 Cr           00 00 00 00 v3 v2 v1 v0   \n\ 
    257251movdqa      (%2), %%xmm0  # Load 16 Y           y7 y6 y5 y4 y3 y2 y1 y0   \n\ 
    258252movdqa      (%3), %%xmm3  # Load 16 Y           Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0   \n\ 
    259 punpcklbw %%xmm2, %%xmm1  #                     u3 v3 u2 v2 u1 v1 u0 v0   \n\ 
    260 movdqa    %%xmm0, %%xmm2  #                     y7 y6 y5 y4 y3 y2 y1 y0   \n\ 
    261 punpcklbw %%xmm1, %%xmm2  #                     u1 y3 v1 y2 u0 y1 v0 y0   \n\ 
    262 movntdq   %%xmm2, (%0)    # Store low YUYV                                \n\ 
    263 punpckhbw %%xmm1, %%xmm0  #                     u3 y7 v3 y6 u2 y5 v2 y4   \n\ 
     253punpcklbw %%xmm1, %%xmm2  #                     u3 v3 u2 v2 u1 v1 u0 v0   \n\ 
     254movdqa    %%xmm0, %%xmm1  #                     y7 y6 y5 y4 y3 y2 y1 y0   \n\ 
     255punpcklbw %%xmm2, %%xmm1  #                     u1 y3 v1 y2 u0 y1 v0 y0   \n\ 
     256movntdq   %%xmm1, (%0)    # Store low YUYV                                \n\ 
     257punpckhbw %%xmm2, %%xmm0  #                     u3 y7 v3 y6 u2 y5 v2 y4   \n\ 
    264258movntdq   %%xmm0, 16(%0)  # Store high YUYV                               \n\ 
    265259movdqa    %%xmm3, %%xmm4  #                     Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0   \n\ 
    266 punpcklbw %%xmm1, %%xmm4  #                     u1 Y3 v1 Y2 u0 Y1 v0 Y0   \n\ 
     260punpcklbw %%xmm2, %%xmm4  #                     u1 Y3 v1 Y2 u0 Y1 v0 Y0   \n\ 
    267261movntdq   %%xmm4, (%1)    # Store low YUYV                                \n\ 
    268 punpckhbw %%xmm1, %%xmm3  #                     u3 Y7 v3 Y6 u2 Y5 v2 Y4   \n\ 
     262punpckhbw %%xmm2, %%xmm3  #                     u3 Y7 v3 Y6 u2 Y5 v2 Y4   \n\ 
    269263movntdq   %%xmm3, 16(%1)  # Store high YUYV                               \n\ 
    270264" 
    271265 
    272266#define SSE2_YUV420_YVYU_UNALIGNED "                                      \n\ 
    273 movq        (%4), %%xmm2  # Load 8 Cb           00 00 00 00 u3 u2 u1 u0   \n\ 
    274 movq        (%5), %%xmm1  # Load 8 Cr           00 00 00 00 v3 v2 v1 v0   \n\ 
    275267movdqu      (%2), %%xmm0  # Load 16 Y           y7 y6 y5 y4 y3 y2 y1 y0   \n\ 
    276268movdqu      (%3), %%xmm3  # Load 16 Y           Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0   \n\ 
    277269prefetchnta (%0)          # Tell CPU not to cache output YVYU data        \n\ 
    278270prefetchnta (%1)          # Tell CPU not to cache output YVYU data        \n\ 
    279 punpcklbw %%xmm2, %%xmm1  #                     u3 v3 u2 v2 u1 v1 u0 v0   \n\ 
    280 movdqu    %%xmm0, %%xmm2  #                     y7 y6 y5 y4 y3 y2 y1 y0   \n\ 
    281 punpcklbw %%xmm1, %%xmm2  #                     u1 y3 v1 y2 u0 y1 v0 y0   \n\ 
    282 movdqu    %%xmm2, (%0)    # Store low YUYV                                \n\ 
    283 punpckhbw %%xmm1, %%xmm0  #                     u3 y7 v3 y6 u2 y5 v2 y4   \n\ 
     271punpcklbw %%xmm1, %%xmm2  #                     u3 v3 u2 v2 u1 v1 u0 v0   \n\ 
     272movdqu    %%xmm0, %%xmm1  #                     y7 y6 y5 y4 y3 y2 y1 y0   \n\ 
     273punpcklbw %%xmm2, %%xmm1  #                     u1 y3 v1 y2 u0 y1 v0 y0   \n\ 
     274movdqu    %%xmm1, (%0)    # Store low YUYV                                \n\ 
     275punpckhbw %%xmm2, %%xmm0  #                     u3 y7 v3 y6 u2 y5 v2 y4   \n\ 
    284276movdqu    %%xmm0, 16(%0)  # Store high YUYV                               \n\ 
    285277movdqu    %%xmm3, %%xmm4  #                     Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0   \n\ 
    286 punpcklbw %%xmm1, %%xmm4  #                     u1 Y3 v1 Y2 u0 Y1 v0 Y0   \n\ 
     278punpcklbw %%xmm2, %%xmm4  #                     u1 Y3 v1 Y2 u0 Y1 v0 Y0   \n\ 
    287279movdqu    %%xmm4, (%1)    # Store low YUYV                                \n\ 
    288 punpckhbw %%xmm1, %%xmm3  #                     u3 Y7 v3 Y6 u2 Y5 v2 Y4   \n\ 
     280punpckhbw %%xmm2, %%xmm3  #                     u3 Y7 v3 Y6 u2 Y5 v2 Y4   \n\ 
    289281movdqu    %%xmm3, 16(%1)  # Store high YUYV                               \n\ 
    290282" 
    291283 
    292284#define SSE2_YUV420_UYVY_ALIGNED "                                        \n\ 
    293 movq        (%4), %%xmm1  # Load 8 Cb           00 00 00 00 u3 u2 u1 u0   \n\ 
    294 movq        (%5), %%xmm2  # Load 8 Cr           00 00 00 00 v3 v2 v1 v0   \n\ 
    295285movdqa      (%2), %%xmm0  # Load 16 Y           y7 y6 y5 y4 y3 y2 y1 y0   \n\ 
    296286movdqa      (%3), %%xmm3  # Load 16 Y           Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0   \n\ 
     
    310300 
    311301#define SSE2_YUV420_UYVY_UNALIGNED "                                      \n\ 
    312 movq        (%4), %%xmm1  # Load 8 Cb           00 00 00 00 u3 u2 u1 u0   \n\ 
    313 movq        (%5), %%xmm2  # Load 8 Cr           00 00 00 00 v3 v2 v1 v0   \n\ 
    314302movdqu      (%2), %%xmm0  # Load 16 Y           y7 y6 y5 y4 y3 y2 y1 y0   \n\ 
    315303movdqu      (%3), %%xmm3  # Load 16 Y           Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0   \n\