LCOV - code coverage report
Current view: top level - gfx/ycbcr - yuv_row_posix.cpp (source / functions) Hit Total Coverage
Test: output.info Lines: 0 11 0.0 %
Date: 2017-07-14 16:53:18 Functions: 0 3 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : // Copyright (c) 2010 The Chromium Authors. All rights reserved.
       2             : // Use of this source code is governed by a BSD-style license that can be
       3             : // found in the LICENSE file.
       4             : 
       5             : #include "yuv_row.h"
       6             : #include "mozilla/SSE.h"
       7             : 
       8             : #define DCHECK(a)
       9             : 
      10             : extern "C" {
      11             : 
      12             : #if defined(ARCH_CPU_X86_64)
      13             : 
      14             : // We don't need CPUID guards here, since x86-64 implies SSE2.
      15             : 
      16             : // AMD64 ABI uses register paremters.
      17           0 : void FastConvertYUVToRGB32Row(const uint8* y_buf,  // rdi
      18             :                               const uint8* u_buf,  // rsi
      19             :                               const uint8* v_buf,  // rdx
      20             :                               uint8* rgb_buf,      // rcx
      21             :                               int width) {         // r8
      22             :   asm(
      23             :   "jmp    1f\n"
      24             : "0:"
      25             :   "movzb  (%1),%%r10\n"
      26             :   "add    $0x1,%1\n"
      27             :   "movzb  (%2),%%r11\n"
      28             :   "add    $0x1,%2\n"
      29             :   "movq   2048(%5,%%r10,8),%%xmm0\n"
      30             :   "movzb  (%0),%%r10\n"
      31             :   "movq   4096(%5,%%r11,8),%%xmm1\n"
      32             :   "movzb  0x1(%0),%%r11\n"
      33             :   "paddsw %%xmm1,%%xmm0\n"
      34             :   "movq   (%5,%%r10,8),%%xmm2\n"
      35             :   "add    $0x2,%0\n"
      36             :   "movq   (%5,%%r11,8),%%xmm3\n"
      37             :   "paddsw %%xmm0,%%xmm2\n"
      38             :   "paddsw %%xmm0,%%xmm3\n"
      39             :   "shufps $0x44,%%xmm3,%%xmm2\n"
      40             :   "psraw  $0x6,%%xmm2\n"
      41             :   "packuswb %%xmm2,%%xmm2\n"
      42             :   "movq   %%xmm2,0x0(%3)\n"
      43             :   "add    $0x8,%3\n"
      44             : "1:"
      45             :   "sub    $0x2,%4\n"
      46             :   "jns    0b\n"
      47             : 
      48             : "2:"
      49             :   "add    $0x1,%4\n"
      50             :   "js     3f\n"
      51             : 
      52             :   "movzb  (%1),%%r10\n"
      53             :   "movq   2048(%5,%%r10,8),%%xmm0\n"
      54             :   "movzb  (%2),%%r10\n"
      55             :   "movq   4096(%5,%%r10,8),%%xmm1\n"
      56             :   "paddsw %%xmm1,%%xmm0\n"
      57             :   "movzb  (%0),%%r10\n"
      58             :   "movq   (%5,%%r10,8),%%xmm1\n"
      59             :   "paddsw %%xmm0,%%xmm1\n"
      60             :   "psraw  $0x6,%%xmm1\n"
      61             :   "packuswb %%xmm1,%%xmm1\n"
      62             :   "movd   %%xmm1,0x0(%3)\n"
      63             : "3:"
      64             :   :
      65             :   : "r"(y_buf),  // %0
      66             :     "r"(u_buf),  // %1
      67             :     "r"(v_buf),  // %2
      68             :     "r"(rgb_buf),  // %3
      69             :     "r"(width),  // %4
      70             :     "r" (kCoefficientsRgbY)  // %5
      71             :   : "memory", "r10", "r11", "xmm0", "xmm1", "xmm2", "xmm3"
      72           0 : );
      73           0 : }
      74             : 
      75           0 : void ScaleYUVToRGB32Row(const uint8* y_buf,  // rdi
      76             :                         const uint8* u_buf,  // rsi
      77             :                         const uint8* v_buf,  // rdx
      78             :                         uint8* rgb_buf,      // rcx
      79             :                         int width,           // r8
      80             :                         int source_dx) {     // r9
      81             :   asm(
      82             :   "xor    %%r11,%%r11\n"
      83             :   "sub    $0x2,%4\n"
      84             :   "js     1f\n"
      85             : 
      86             : "0:"
      87             :   "mov    %%r11,%%r10\n"
      88             :   "sar    $0x11,%%r10\n"
      89             :   "movzb  (%1,%%r10,1),%%rax\n"
      90             :   "movq   2048(%5,%%rax,8),%%xmm0\n"
      91             :   "movzb  (%2,%%r10,1),%%rax\n"
      92             :   "movq   4096(%5,%%rax,8),%%xmm1\n"
      93             :   "lea    (%%r11,%6),%%r10\n"
      94             :   "sar    $0x10,%%r11\n"
      95             :   "movzb  (%0,%%r11,1),%%rax\n"
      96             :   "paddsw %%xmm1,%%xmm0\n"
      97             :   "movq   (%5,%%rax,8),%%xmm1\n"
      98             :   "lea    (%%r10,%6),%%r11\n"
      99             :   "sar    $0x10,%%r10\n"
     100             :   "movzb  (%0,%%r10,1),%%rax\n"
     101             :   "movq   (%5,%%rax,8),%%xmm2\n"
     102             :   "paddsw %%xmm0,%%xmm1\n"
     103             :   "paddsw %%xmm0,%%xmm2\n"
     104             :   "shufps $0x44,%%xmm2,%%xmm1\n"
     105             :   "psraw  $0x6,%%xmm1\n"
     106             :   "packuswb %%xmm1,%%xmm1\n"
     107             :   "movq   %%xmm1,0x0(%3)\n"
     108             :   "add    $0x8,%3\n"
     109             :   "sub    $0x2,%4\n"
     110             :   "jns    0b\n"
     111             : 
     112             : "1:"
     113             :   "add    $0x1,%4\n"
     114             :   "js     2f\n"
     115             : 
     116             :   "mov    %%r11,%%r10\n"
     117             :   "sar    $0x11,%%r10\n"
     118             :   "movzb  (%1,%%r10,1),%%rax\n"
     119             :   "movq   2048(%5,%%rax,8),%%xmm0\n"
     120             :   "movzb  (%2,%%r10,1),%%rax\n"
     121             :   "movq   4096(%5,%%rax,8),%%xmm1\n"
     122             :   "paddsw %%xmm1,%%xmm0\n"
     123             :   "sar    $0x10,%%r11\n"
     124             :   "movzb  (%0,%%r11,1),%%rax\n"
     125             :   "movq   (%5,%%rax,8),%%xmm1\n"
     126             :   "paddsw %%xmm0,%%xmm1\n"
     127             :   "psraw  $0x6,%%xmm1\n"
     128             :   "packuswb %%xmm1,%%xmm1\n"
     129             :   "movd   %%xmm1,0x0(%3)\n"
     130             : 
     131             : "2:"
     132             :   :
     133             :   : "r"(y_buf),  // %0
     134             :     "r"(u_buf),  // %1
     135             :     "r"(v_buf),  // %2
     136             :     "r"(rgb_buf),  // %3
     137             :     "r"(width),  // %4
     138             :     "r" (kCoefficientsRgbY),  // %5
     139           0 :     "r"(static_cast<long>(source_dx))  // %6
     140             :   : "memory", "r10", "r11", "rax", "xmm0", "xmm1", "xmm2"
     141           0 : );
     142           0 : }
     143             : 
     144           0 : void LinearScaleYUVToRGB32Row(const uint8* y_buf,
     145             :                               const uint8* u_buf,
     146             :                               const uint8* v_buf,
     147             :                               uint8* rgb_buf,
     148             :                               int width,
     149             :                               int source_dx) {
     150             :   asm(
     151             :   "xor    %%r11,%%r11\n"   // x = 0
     152             :   "sub    $0x2,%4\n"
     153             :   "js     2f\n"
     154             :   "cmp    $0x20000,%6\n"   // if source_dx >= 2.0
     155             :   "jl     0f\n"
     156             :   "mov    $0x8000,%%r11\n" // x = 0.5 for 1/2 or less
     157             : "0:"
     158             : 
     159             : "1:"
     160             :   "mov    %%r11,%%r10\n"
     161             :   "sar    $0x11,%%r10\n"
     162             : 
     163             :   "movzb  (%1, %%r10, 1), %%r13 \n"
     164             :   "movzb  1(%1, %%r10, 1), %%r14 \n"
     165             :   "mov    %%r11, %%rax \n"
     166             :   "and    $0x1fffe, %%rax \n"
     167             :   "imul   %%rax, %%r14 \n"
     168             :   "xor    $0x1fffe, %%rax \n"
     169             :   "imul   %%rax, %%r13 \n"
     170             :   "add    %%r14, %%r13 \n"
     171             :   "shr    $17, %%r13 \n"
     172             :   "movq   2048(%5,%%r13,8), %%xmm0\n"
     173             : 
     174             :   "movzb  (%2, %%r10, 1), %%r13 \n"
     175             :   "movzb  1(%2, %%r10, 1), %%r14 \n"
     176             :   "mov    %%r11, %%rax \n"
     177             :   "and    $0x1fffe, %%rax \n"
     178             :   "imul   %%rax, %%r14 \n"
     179             :   "xor    $0x1fffe, %%rax \n"
     180             :   "imul   %%rax, %%r13 \n"
     181             :   "add    %%r14, %%r13 \n"
     182             :   "shr    $17, %%r13 \n"
     183             :   "movq   4096(%5,%%r13,8), %%xmm1\n"
     184             : 
     185             :   "mov    %%r11, %%rax \n"
     186             :   "lea    (%%r11,%6),%%r10\n"
     187             :   "sar    $0x10,%%r11\n"
     188             :   "paddsw %%xmm1,%%xmm0\n"
     189             : 
     190             :   "movzb  (%0, %%r11, 1), %%r13 \n"
     191             :   "movzb  1(%0, %%r11, 1), %%r14 \n"
     192             :   "and    $0xffff, %%rax \n"
     193             :   "imul   %%rax, %%r14 \n"
     194             :   "xor    $0xffff, %%rax \n"
     195             :   "imul   %%rax, %%r13 \n"
     196             :   "add    %%r14, %%r13 \n"
     197             :   "shr    $16, %%r13 \n"
     198             :   "movq   (%5,%%r13,8),%%xmm1\n"
     199             : 
     200             :   "mov    %%r10, %%rax \n"
     201             :   "lea    (%%r10,%6),%%r11\n"
     202             :   "sar    $0x10,%%r10\n"
     203             : 
     204             :   "movzb  (%0,%%r10,1), %%r13 \n"
     205             :   "movzb  1(%0,%%r10,1), %%r14 \n"
     206             :   "and    $0xffff, %%rax \n"
     207             :   "imul   %%rax, %%r14 \n"
     208             :   "xor    $0xffff, %%rax \n"
     209             :   "imul   %%rax, %%r13 \n"
     210             :   "add    %%r14, %%r13 \n"
     211             :   "shr    $16, %%r13 \n"
     212             :   "movq   (%5,%%r13,8),%%xmm2\n"
     213             : 
     214             :   "paddsw %%xmm0,%%xmm1\n"
     215             :   "paddsw %%xmm0,%%xmm2\n"
     216             :   "shufps $0x44,%%xmm2,%%xmm1\n"
     217             :   "psraw  $0x6,%%xmm1\n"
     218             :   "packuswb %%xmm1,%%xmm1\n"
     219             :   "movq   %%xmm1,0x0(%3)\n"
     220             :   "add    $0x8,%3\n"
     221             :   "sub    $0x2,%4\n"
     222             :   "jns    1b\n"
     223             : 
     224             : "2:"
     225             :   "add    $0x1,%4\n"
     226             :   "js     3f\n"
     227             : 
     228             :   "mov    %%r11,%%r10\n"
     229             :   "sar    $0x11,%%r10\n"
     230             : 
     231             :   "movzb  (%1,%%r10,1), %%r13 \n"
     232             :   "movq   2048(%5,%%r13,8),%%xmm0\n"
     233             : 
     234             :   "movzb  (%2,%%r10,1), %%r13 \n"
     235             :   "movq   4096(%5,%%r13,8),%%xmm1\n"
     236             : 
     237             :   "paddsw %%xmm1,%%xmm0\n"
     238             :   "sar    $0x10,%%r11\n"
     239             : 
     240             :   "movzb  (%0,%%r11,1), %%r13 \n"
     241             :   "movq   (%5,%%r13,8),%%xmm1\n"
     242             : 
     243             :   "paddsw %%xmm0,%%xmm1\n"
     244             :   "psraw  $0x6,%%xmm1\n"
     245             :   "packuswb %%xmm1,%%xmm1\n"
     246             :   "movd   %%xmm1,0x0(%3)\n"
     247             : 
     248             : "3:"
     249             :   :
     250             :   : "r"(y_buf),  // %0
     251             :     "r"(u_buf),  // %1
     252             :     "r"(v_buf),  // %2
     253             :     "r"(rgb_buf),  // %3
     254             :     "r"(width),  // %4
     255             :     "r" (kCoefficientsRgbY),  // %5
     256           0 :     "r"(static_cast<long>(source_dx))  // %6
     257             :   : "memory", "r10", "r11", "r13", "r14", "rax", "xmm0", "xmm1", "xmm2"
     258           0 : );
     259           0 : }
     260             : 
     261             : #elif defined(MOZILLA_MAY_SUPPORT_SSE) && defined(ARCH_CPU_X86_32) && !defined(__PIC__)
     262             : 
     263             : // PIC version is slower because less registers are available, so
     264             : // non-PIC is used on platforms where it is possible.
     265             : void FastConvertYUVToRGB32Row_SSE(const uint8* y_buf,
     266             :                                   const uint8* u_buf,
     267             :                                   const uint8* v_buf,
     268             :                                   uint8* rgb_buf,
     269             :                                   int width);
     270             :   asm(
     271             :   ".text\n"
     272             :   ".global FastConvertYUVToRGB32Row_SSE\n"
     273             :   ".type FastConvertYUVToRGB32Row_SSE, @function\n"
     274             : "FastConvertYUVToRGB32Row_SSE:\n"
     275             :   "pusha\n"
     276             :   "mov    0x24(%esp),%edx\n"
     277             :   "mov    0x28(%esp),%edi\n"
     278             :   "mov    0x2c(%esp),%esi\n"
     279             :   "mov    0x30(%esp),%ebp\n"
     280             :   "mov    0x34(%esp),%ecx\n"
     281             :   "jmp    1f\n"
     282             : 
     283             : "0:"
     284             :   "movzbl (%edi),%eax\n"
     285             :   "add    $0x1,%edi\n"
     286             :   "movzbl (%esi),%ebx\n"
     287             :   "add    $0x1,%esi\n"
     288             :   "movq   kCoefficientsRgbY+2048(,%eax,8),%mm0\n"
     289             :   "movzbl (%edx),%eax\n"
     290             :   "paddsw kCoefficientsRgbY+4096(,%ebx,8),%mm0\n"
     291             :   "movzbl 0x1(%edx),%ebx\n"
     292             :   "movq   kCoefficientsRgbY(,%eax,8),%mm1\n"
     293             :   "add    $0x2,%edx\n"
     294             :   "movq   kCoefficientsRgbY(,%ebx,8),%mm2\n"
     295             :   "paddsw %mm0,%mm1\n"
     296             :   "paddsw %mm0,%mm2\n"
     297             :   "psraw  $0x6,%mm1\n"
     298             :   "psraw  $0x6,%mm2\n"
     299             :   "packuswb %mm2,%mm1\n"
     300             :   "movntq %mm1,0x0(%ebp)\n"
     301             :   "add    $0x8,%ebp\n"
     302             : "1:"
     303             :   "sub    $0x2,%ecx\n"
     304             :   "jns    0b\n"
     305             : 
     306             :   "and    $0x1,%ecx\n"
     307             :   "je     2f\n"
     308             : 
     309             :   "movzbl (%edi),%eax\n"
     310             :   "movq   kCoefficientsRgbY+2048(,%eax,8),%mm0\n"
     311             :   "movzbl (%esi),%eax\n"
     312             :   "paddsw kCoefficientsRgbY+4096(,%eax,8),%mm0\n"
     313             :   "movzbl (%edx),%eax\n"
     314             :   "movq   kCoefficientsRgbY(,%eax,8),%mm1\n"
     315             :   "paddsw %mm0,%mm1\n"
     316             :   "psraw  $0x6,%mm1\n"
     317             :   "packuswb %mm1,%mm1\n"
     318             :   "movd   %mm1,0x0(%ebp)\n"
     319             : "2:"
     320             :   "popa\n"
     321             :   "ret\n"
     322             : #if !defined(XP_MACOSX)
     323             :   ".previous\n"
     324             : #endif
     325             : );
     326             : 
     327             : void FastConvertYUVToRGB32Row(const uint8* y_buf,
     328             :                               const uint8* u_buf,
     329             :                               const uint8* v_buf,
     330             :                               uint8* rgb_buf,
     331             :                               int width)
     332             : {
     333             :   if (mozilla::supports_sse()) {
     334             :     FastConvertYUVToRGB32Row_SSE(y_buf, u_buf, v_buf, rgb_buf, width);
     335             :     return;
     336             :   }
     337             : 
     338             :   FastConvertYUVToRGB32Row_C(y_buf, u_buf, v_buf, rgb_buf, width, 1);
     339             : }
     340             : 
     341             : 
     342             : void ScaleYUVToRGB32Row_SSE(const uint8* y_buf,
     343             :                             const uint8* u_buf,
     344             :                             const uint8* v_buf,
     345             :                             uint8* rgb_buf,
     346             :                             int width,
     347             :                             int source_dx);
     348             :   asm(
     349             :   ".text\n"
     350             :   ".global ScaleYUVToRGB32Row_SSE\n"
     351             :   ".type ScaleYUVToRGB32Row_SSE, @function\n"
     352             : "ScaleYUVToRGB32Row_SSE:\n"
     353             :   "pusha\n"
     354             :   "mov    0x24(%esp),%edx\n"
     355             :   "mov    0x28(%esp),%edi\n"
     356             :   "mov    0x2c(%esp),%esi\n"
     357             :   "mov    0x30(%esp),%ebp\n"
     358             :   "mov    0x34(%esp),%ecx\n"
     359             :   "xor    %ebx,%ebx\n"
     360             :   "jmp    1f\n"
     361             : 
     362             : "0:"
     363             :   "mov    %ebx,%eax\n"
     364             :   "sar    $0x11,%eax\n"
     365             :   "movzbl (%edi,%eax,1),%eax\n"
     366             :   "movq   kCoefficientsRgbY+2048(,%eax,8),%mm0\n"
     367             :   "mov    %ebx,%eax\n"
     368             :   "sar    $0x11,%eax\n"
     369             :   "movzbl (%esi,%eax,1),%eax\n"
     370             :   "paddsw kCoefficientsRgbY+4096(,%eax,8),%mm0\n"
     371             :   "mov    %ebx,%eax\n"
     372             :   "add    0x38(%esp),%ebx\n"
     373             :   "sar    $0x10,%eax\n"
     374             :   "movzbl (%edx,%eax,1),%eax\n"
     375             :   "movq   kCoefficientsRgbY(,%eax,8),%mm1\n"
     376             :   "mov    %ebx,%eax\n"
     377             :   "add    0x38(%esp),%ebx\n"
     378             :   "sar    $0x10,%eax\n"
     379             :   "movzbl (%edx,%eax,1),%eax\n"
     380             :   "movq   kCoefficientsRgbY(,%eax,8),%mm2\n"
     381             :   "paddsw %mm0,%mm1\n"
     382             :   "paddsw %mm0,%mm2\n"
     383             :   "psraw  $0x6,%mm1\n"
     384             :   "psraw  $0x6,%mm2\n"
     385             :   "packuswb %mm2,%mm1\n"
     386             :   "movntq %mm1,0x0(%ebp)\n"
     387             :   "add    $0x8,%ebp\n"
     388             : "1:"
     389             :   "sub    $0x2,%ecx\n"
     390             :   "jns    0b\n"
     391             : 
     392             :   "and    $0x1,%ecx\n"
     393             :   "je     2f\n"
     394             : 
     395             :   "mov    %ebx,%eax\n"
     396             :   "sar    $0x11,%eax\n"
     397             :   "movzbl (%edi,%eax,1),%eax\n"
     398             :   "movq   kCoefficientsRgbY+2048(,%eax,8),%mm0\n"
     399             :   "mov    %ebx,%eax\n"
     400             :   "sar    $0x11,%eax\n"
     401             :   "movzbl (%esi,%eax,1),%eax\n"
     402             :   "paddsw kCoefficientsRgbY+4096(,%eax,8),%mm0\n"
     403             :   "mov    %ebx,%eax\n"
     404             :   "sar    $0x10,%eax\n"
     405             :   "movzbl (%edx,%eax,1),%eax\n"
     406             :   "movq   kCoefficientsRgbY(,%eax,8),%mm1\n"
     407             :   "paddsw %mm0,%mm1\n"
     408             :   "psraw  $0x6,%mm1\n"
     409             :   "packuswb %mm1,%mm1\n"
     410             :   "movd   %mm1,0x0(%ebp)\n"
     411             : 
     412             : "2:"
     413             :   "popa\n"
     414             :   "ret\n"
     415             : #if !defined(XP_MACOSX)
     416             :   ".previous\n"
     417             : #endif
     418             : );
     419             : 
     420             : void ScaleYUVToRGB32Row(const uint8* y_buf,
     421             :                         const uint8* u_buf,
     422             :                         const uint8* v_buf,
     423             :                         uint8* rgb_buf,
     424             :                         int width,
     425             :                         int source_dx)
     426             : {
     427             :   if (mozilla::supports_sse()) {
     428             :     ScaleYUVToRGB32Row_SSE(y_buf, u_buf, v_buf, rgb_buf,
     429             :                            width, source_dx);
     430             :     return;
     431             :   }
     432             : 
     433             :   ScaleYUVToRGB32Row_C(y_buf, u_buf, v_buf, rgb_buf,
     434             :                        width, source_dx);
     435             : }
     436             : 
     437             : void LinearScaleYUVToRGB32Row_SSE(const uint8* y_buf,
     438             :                                   const uint8* u_buf,
     439             :                                   const uint8* v_buf,
     440             :                                   uint8* rgb_buf,
     441             :                                   int width,
     442             :                                   int source_dx);
     443             :   asm(
     444             :   ".text\n"
     445             :   ".global LinearScaleYUVToRGB32Row_SSE\n"
     446             :   ".type LinearScaleYUVToRGB32Row_SSE, @function\n"
     447             : "LinearScaleYUVToRGB32Row_SSE:\n"
     448             :   "pusha\n"
     449             :   "mov    0x24(%esp),%edx\n"
     450             :   "mov    0x28(%esp),%edi\n"
     451             :   "mov    0x30(%esp),%ebp\n"
     452             : 
     453             :   // source_width = width * source_dx + ebx
     454             :   "mov    0x34(%esp), %ecx\n"
     455             :   "imull  0x38(%esp), %ecx\n"
     456             :   "mov    %ecx, 0x34(%esp)\n"
     457             : 
     458             :   "mov    0x38(%esp), %ecx\n"
     459             :   "xor    %ebx,%ebx\n"     // x = 0
     460             :   "cmp    $0x20000,%ecx\n" // if source_dx >= 2.0
     461             :   "jl     1f\n"
     462             :   "mov    $0x8000,%ebx\n"  // x = 0.5 for 1/2 or less
     463             :   "jmp    1f\n"
     464             : 
     465             : "0:"
     466             :   "mov    %ebx,%eax\n"
     467             :   "sar    $0x11,%eax\n"
     468             : 
     469             :   "movzbl (%edi,%eax,1),%ecx\n"
     470             :   "movzbl 1(%edi,%eax,1),%esi\n"
     471             :   "mov    %ebx,%eax\n"
     472             :   "andl   $0x1fffe, %eax \n"
     473             :   "imul   %eax, %esi \n"
     474             :   "xorl   $0x1fffe, %eax \n"
     475             :   "imul   %eax, %ecx \n"
     476             :   "addl   %esi, %ecx \n"
     477             :   "shrl   $17, %ecx \n"
     478             :   "movq   kCoefficientsRgbY+2048(,%ecx,8),%mm0\n"
     479             : 
     480             :   "mov    0x2c(%esp),%esi\n"
     481             :   "mov    %ebx,%eax\n"
     482             :   "sar    $0x11,%eax\n"
     483             : 
     484             :   "movzbl (%esi,%eax,1),%ecx\n"
     485             :   "movzbl 1(%esi,%eax,1),%esi\n"
     486             :   "mov    %ebx,%eax\n"
     487             :   "andl   $0x1fffe, %eax \n"
     488             :   "imul   %eax, %esi \n"
     489             :   "xorl   $0x1fffe, %eax \n"
     490             :   "imul   %eax, %ecx \n"
     491             :   "addl   %esi, %ecx \n"
     492             :   "shrl   $17, %ecx \n"
     493             :   "paddsw kCoefficientsRgbY+4096(,%ecx,8),%mm0\n"
     494             : 
     495             :   "mov    %ebx,%eax\n"
     496             :   "sar    $0x10,%eax\n"
     497             :   "movzbl (%edx,%eax,1),%ecx\n"
     498             :   "movzbl 1(%edx,%eax,1),%esi\n"
     499             :   "mov    %ebx,%eax\n"
     500             :   "add    0x38(%esp),%ebx\n"
     501             :   "andl   $0xffff, %eax \n"
     502             :   "imul   %eax, %esi \n"
     503             :   "xorl   $0xffff, %eax \n"
     504             :   "imul   %eax, %ecx \n"
     505             :   "addl   %esi, %ecx \n"
     506             :   "shrl   $16, %ecx \n"
     507             :   "movq   kCoefficientsRgbY(,%ecx,8),%mm1\n"
     508             : 
     509             :   "cmp    0x34(%esp), %ebx\n"
     510             :   "jge    2f\n"
     511             : 
     512             :   "mov    %ebx,%eax\n"
     513             :   "sar    $0x10,%eax\n"
     514             :   "movzbl (%edx,%eax,1),%ecx\n"
     515             :   "movzbl 1(%edx,%eax,1),%esi\n"
     516             :   "mov    %ebx,%eax\n"
     517             :   "add    0x38(%esp),%ebx\n"
     518             :   "andl   $0xffff, %eax \n"
     519             :   "imul   %eax, %esi \n"
     520             :   "xorl   $0xffff, %eax \n"
     521             :   "imul   %eax, %ecx \n"
     522             :   "addl   %esi, %ecx \n"
     523             :   "shrl   $16, %ecx \n"
     524             :   "movq   kCoefficientsRgbY(,%ecx,8),%mm2\n"
     525             : 
     526             :   "paddsw %mm0,%mm1\n"
     527             :   "paddsw %mm0,%mm2\n"
     528             :   "psraw  $0x6,%mm1\n"
     529             :   "psraw  $0x6,%mm2\n"
     530             :   "packuswb %mm2,%mm1\n"
     531             :   "movntq %mm1,0x0(%ebp)\n"
     532             :   "add    $0x8,%ebp\n"
     533             : 
     534             : "1:"
     535             :   "cmp    0x34(%esp), %ebx\n"
     536             :   "jl     0b\n"
     537             :   "popa\n"
     538             :   "ret\n"
     539             : 
     540             : "2:"
     541             :   "paddsw %mm0, %mm1\n"
     542             :   "psraw $6, %mm1\n"
     543             :   "packuswb %mm1, %mm1\n"
     544             :   "movd %mm1, (%ebp)\n"
     545             :   "popa\n"
     546             :   "ret\n"
     547             : #if !defined(XP_MACOSX)
     548             :   ".previous\n"
     549             : #endif
     550             : );
     551             : 
     552             : void LinearScaleYUVToRGB32Row(const uint8* y_buf,
     553             :                               const uint8* u_buf,
     554             :                               const uint8* v_buf,
     555             :                               uint8* rgb_buf,
     556             :                               int width,
     557             :                               int source_dx)
     558             : {
     559             :   if (mozilla::supports_sse()) {
     560             :     LinearScaleYUVToRGB32Row_SSE(y_buf, u_buf, v_buf, rgb_buf,
     561             :                                  width, source_dx);
     562             :     return;
     563             :   }
     564             : 
     565             :   LinearScaleYUVToRGB32Row_C(y_buf, u_buf, v_buf, rgb_buf,
     566             :                              width, source_dx);
     567             : }
     568             : 
     569             : #elif defined(MOZILLA_MAY_SUPPORT_SSE) && defined(ARCH_CPU_X86_32) && defined(__PIC__)
     570             : 
     571             : void PICConvertYUVToRGB32Row_SSE(const uint8* y_buf,
     572             :                                  const uint8* u_buf,
     573             :                                  const uint8* v_buf,
     574             :                                  uint8* rgb_buf,
     575             :                                  int width,
     576             :                                  const int16 *kCoefficientsRgbY);
     577             : 
     578             :   asm(
     579             :   ".text\n"
     580             : #if defined(XP_MACOSX)
     581             : "_PICConvertYUVToRGB32Row_SSE:\n"
     582             : #else
     583             : "PICConvertYUVToRGB32Row_SSE:\n"
     584             : #endif
     585             :   "pusha\n"
     586             :   "mov    0x24(%esp),%edx\n"
     587             :   "mov    0x28(%esp),%edi\n"
     588             :   "mov    0x2c(%esp),%esi\n"
     589             :   "mov    0x30(%esp),%ebp\n"
     590             :   "mov    0x38(%esp),%ecx\n"
     591             : 
     592             :   "jmp    1f\n"
     593             : 
     594             : "0:"
     595             :   "movzbl (%edi),%eax\n"
     596             :   "add    $0x1,%edi\n"
     597             :   "movzbl (%esi),%ebx\n"
     598             :   "add    $0x1,%esi\n"
     599             :   "movq   2048(%ecx,%eax,8),%mm0\n"
     600             :   "movzbl (%edx),%eax\n"
     601             :   "paddsw 4096(%ecx,%ebx,8),%mm0\n"
     602             :   "movzbl 0x1(%edx),%ebx\n"
     603             :   "movq   0(%ecx,%eax,8),%mm1\n"
     604             :   "add    $0x2,%edx\n"
     605             :   "movq   0(%ecx,%ebx,8),%mm2\n"
     606             :   "paddsw %mm0,%mm1\n"
     607             :   "paddsw %mm0,%mm2\n"
     608             :   "psraw  $0x6,%mm1\n"
     609             :   "psraw  $0x6,%mm2\n"
     610             :   "packuswb %mm2,%mm1\n"
     611             :   "movntq %mm1,0x0(%ebp)\n"
     612             :   "add    $0x8,%ebp\n"
     613             : "1:"
     614             :   "subl   $0x2,0x34(%esp)\n"
     615             :   "jns    0b\n"
     616             : 
     617             :   "andl   $0x1,0x34(%esp)\n"
     618             :   "je     2f\n"
     619             : 
     620             :   "movzbl (%edi),%eax\n"
     621             :   "movq   2048(%ecx,%eax,8),%mm0\n"
     622             :   "movzbl (%esi),%eax\n"
     623             :   "paddsw 4096(%ecx,%eax,8),%mm0\n"
     624             :   "movzbl (%edx),%eax\n"
     625             :   "movq   0(%ecx,%eax,8),%mm1\n"
     626             :   "paddsw %mm0,%mm1\n"
     627             :   "psraw  $0x6,%mm1\n"
     628             :   "packuswb %mm1,%mm1\n"
     629             :   "movd   %mm1,0x0(%ebp)\n"
     630             : "2:"
     631             :   "popa\n"
     632             :   "ret\n"
     633             : #if !defined(XP_MACOSX)
     634             :   ".previous\n"
     635             : #endif
     636             : );
     637             : 
     638             : void FastConvertYUVToRGB32Row(const uint8* y_buf,
     639             :                               const uint8* u_buf,
     640             :                               const uint8* v_buf,
     641             :                               uint8* rgb_buf,
     642             :                               int width)
     643             : {
     644             :   if (mozilla::supports_sse()) {
     645             :     PICConvertYUVToRGB32Row_SSE(y_buf, u_buf, v_buf, rgb_buf, width,
     646             :                                 &kCoefficientsRgbY[0][0]);
     647             :     return;
     648             :   }
     649             : 
     650             :   FastConvertYUVToRGB32Row_C(y_buf, u_buf, v_buf, rgb_buf, width, 1);
     651             : }
     652             : 
     653             : void PICScaleYUVToRGB32Row_SSE(const uint8* y_buf,
     654             :                                const uint8* u_buf,
     655             :                                const uint8* v_buf,
     656             :                                uint8* rgb_buf,
     657             :                                int width,
     658             :                                int source_dx,
     659             :                                const int16 *kCoefficientsRgbY);
     660             : 
     661             :   asm(
     662             :   ".text\n"
     663             : #if defined(XP_MACOSX)
     664             : "_PICScaleYUVToRGB32Row_SSE:\n"
     665             : #else
     666             : "PICScaleYUVToRGB32Row_SSE:\n"
     667             : #endif
     668             :   "pusha\n"
     669             :   "mov    0x24(%esp),%edx\n"
     670             :   "mov    0x28(%esp),%edi\n"
     671             :   "mov    0x2c(%esp),%esi\n"
     672             :   "mov    0x30(%esp),%ebp\n"
     673             :   "mov    0x3c(%esp),%ecx\n"
     674             :   "xor    %ebx,%ebx\n"
     675             :   "jmp    1f\n"
     676             : 
     677             : "0:"
     678             :   "mov    %ebx,%eax\n"
     679             :   "sar    $0x11,%eax\n"
     680             :   "movzbl (%edi,%eax,1),%eax\n"
     681             :   "movq   2048(%ecx,%eax,8),%mm0\n"
     682             :   "mov    %ebx,%eax\n"
     683             :   "sar    $0x11,%eax\n"
     684             :   "movzbl (%esi,%eax,1),%eax\n"
     685             :   "paddsw 4096(%ecx,%eax,8),%mm0\n"
     686             :   "mov    %ebx,%eax\n"
     687             :   "add    0x38(%esp),%ebx\n"
     688             :   "sar    $0x10,%eax\n"
     689             :   "movzbl (%edx,%eax,1),%eax\n"
     690             :   "movq   0(%ecx,%eax,8),%mm1\n"
     691             :   "mov    %ebx,%eax\n"
     692             :   "add    0x38(%esp),%ebx\n"
     693             :   "sar    $0x10,%eax\n"
     694             :   "movzbl (%edx,%eax,1),%eax\n"
     695             :   "movq   0(%ecx,%eax,8),%mm2\n"
     696             :   "paddsw %mm0,%mm1\n"
     697             :   "paddsw %mm0,%mm2\n"
     698             :   "psraw  $0x6,%mm1\n"
     699             :   "psraw  $0x6,%mm2\n"
     700             :   "packuswb %mm2,%mm1\n"
     701             :   "movntq %mm1,0x0(%ebp)\n"
     702             :   "add    $0x8,%ebp\n"
     703             : "1:"
     704             :   "subl   $0x2,0x34(%esp)\n"
     705             :   "jns    0b\n"
     706             : 
     707             :   "andl   $0x1,0x34(%esp)\n"
     708             :   "je     2f\n"
     709             : 
     710             :   "mov    %ebx,%eax\n"
     711             :   "sar    $0x11,%eax\n"
     712             :   "movzbl (%edi,%eax,1),%eax\n"
     713             :   "movq   2048(%ecx,%eax,8),%mm0\n"
     714             :   "mov    %ebx,%eax\n"
     715             :   "sar    $0x11,%eax\n"
     716             :   "movzbl (%esi,%eax,1),%eax\n"
     717             :   "paddsw 4096(%ecx,%eax,8),%mm0\n"
     718             :   "mov    %ebx,%eax\n"
     719             :   "sar    $0x10,%eax\n"
     720             :   "movzbl (%edx,%eax,1),%eax\n"
     721             :   "movq   0(%ecx,%eax,8),%mm1\n"
     722             :   "paddsw %mm0,%mm1\n"
     723             :   "psraw  $0x6,%mm1\n"
     724             :   "packuswb %mm1,%mm1\n"
     725             :   "movd   %mm1,0x0(%ebp)\n"
     726             : 
     727             : "2:"
     728             :   "popa\n"
     729             :   "ret\n"
     730             : #if !defined(XP_MACOSX)
     731             :   ".previous\n"
     732             : #endif
     733             : );
     734             : 
     735             : void ScaleYUVToRGB32Row(const uint8* y_buf,
     736             :                         const uint8* u_buf,
     737             :                         const uint8* v_buf,
     738             :                         uint8* rgb_buf,
     739             :                         int width,
     740             :                         int source_dx)
     741             : {
     742             :   if (mozilla::supports_sse()) {
     743             :     PICScaleYUVToRGB32Row_SSE(y_buf, u_buf, v_buf, rgb_buf, width, source_dx,
     744             :                               &kCoefficientsRgbY[0][0]);
     745             :     return;
     746             :   }
     747             : 
     748             :   ScaleYUVToRGB32Row_C(y_buf, u_buf, v_buf, rgb_buf, width, source_dx);
     749             : }
     750             : 
     751             : void PICLinearScaleYUVToRGB32Row_SSE(const uint8* y_buf,
     752             :                                      const uint8* u_buf,
     753             :                                      const uint8* v_buf,
     754             :                                      uint8* rgb_buf,
     755             :                                      int width,
     756             :                                      int source_dx,
     757             :                                      const int16 *kCoefficientsRgbY);
     758             : 
     759             :   asm(
     760             :   ".text\n"
     761             : #if defined(XP_MACOSX)
     762             : "_PICLinearScaleYUVToRGB32Row_SSE:\n"
     763             : #else
     764             : "PICLinearScaleYUVToRGB32Row_SSE:\n"
     765             : #endif
     766             :   "pusha\n"
     767             :   "mov    0x24(%esp),%edx\n"
     768             :   "mov    0x30(%esp),%ebp\n"
     769             :   "mov    0x34(%esp),%ecx\n"
     770             :   "mov    0x3c(%esp),%edi\n"
     771             :   "xor    %ebx,%ebx\n"
     772             : 
     773             :   // source_width = width * source_dx + ebx
     774             :   "mov    0x34(%esp), %ecx\n"
     775             :   "imull  0x38(%esp), %ecx\n"
     776             :   "mov    %ecx, 0x34(%esp)\n"
     777             : 
     778             :   "mov    0x38(%esp), %ecx\n"
     779             :   "xor    %ebx,%ebx\n"     // x = 0
     780             :   "cmp    $0x20000,%ecx\n" // if source_dx >= 2.0
     781             :   "jl     1f\n"
     782             :   "mov    $0x8000,%ebx\n"  // x = 0.5 for 1/2 or less
     783             :   "jmp    1f\n"
     784             : 
     785             : "0:"
     786             :   "mov    0x28(%esp),%esi\n"
     787             :   "mov    %ebx,%eax\n"
     788             :   "sar    $0x11,%eax\n"
     789             : 
     790             :   "movzbl (%esi,%eax,1),%ecx\n"
     791             :   "movzbl 1(%esi,%eax,1),%esi\n"
     792             :   "mov    %ebx,%eax\n"
     793             :   "andl   $0x1fffe, %eax \n"
     794             :   "imul   %eax, %esi \n"
     795             :   "xorl   $0x1fffe, %eax \n"
     796             :   "imul   %eax, %ecx \n"
     797             :   "addl   %esi, %ecx \n"
     798             :   "shrl   $17, %ecx \n"
     799             :   "movq   2048(%edi,%ecx,8),%mm0\n"
     800             : 
     801             :   "mov    0x2c(%esp),%esi\n"
     802             :   "mov    %ebx,%eax\n"
     803             :   "sar    $0x11,%eax\n"
     804             : 
     805             :   "movzbl (%esi,%eax,1),%ecx\n"
     806             :   "movzbl 1(%esi,%eax,1),%esi\n"
     807             :   "mov    %ebx,%eax\n"
     808             :   "andl   $0x1fffe, %eax \n"
     809             :   "imul   %eax, %esi \n"
     810             :   "xorl   $0x1fffe, %eax \n"
     811             :   "imul   %eax, %ecx \n"
     812             :   "addl   %esi, %ecx \n"
     813             :   "shrl   $17, %ecx \n"
     814             :   "paddsw 4096(%edi,%ecx,8),%mm0\n"
     815             : 
     816             :   "mov    %ebx,%eax\n"
     817             :   "sar    $0x10,%eax\n"
     818             :   "movzbl (%edx,%eax,1),%ecx\n"
     819             :   "movzbl 1(%edx,%eax,1),%esi\n"
     820             :   "mov    %ebx,%eax\n"
     821             :   "add    0x38(%esp),%ebx\n"
     822             :   "andl   $0xffff, %eax \n"
     823             :   "imul   %eax, %esi \n"
     824             :   "xorl   $0xffff, %eax \n"
     825             :   "imul   %eax, %ecx \n"
     826             :   "addl   %esi, %ecx \n"
     827             :   "shrl   $16, %ecx \n"
     828             :   "movq   (%edi,%ecx,8),%mm1\n"
     829             : 
     830             :   "cmp    0x34(%esp), %ebx\n"
     831             :   "jge    2f\n"
     832             : 
     833             :   "mov    %ebx,%eax\n"
     834             :   "sar    $0x10,%eax\n"
     835             :   "movzbl (%edx,%eax,1),%ecx\n"
     836             :   "movzbl 1(%edx,%eax,1),%esi\n"
     837             :   "mov    %ebx,%eax\n"
     838             :   "add    0x38(%esp),%ebx\n"
     839             :   "andl   $0xffff, %eax \n"
     840             :   "imul   %eax, %esi \n"
     841             :   "xorl   $0xffff, %eax \n"
     842             :   "imul   %eax, %ecx \n"
     843             :   "addl   %esi, %ecx \n"
     844             :   "shrl   $16, %ecx \n"
     845             :   "movq   (%edi,%ecx,8),%mm2\n"
     846             : 
     847             :   "paddsw %mm0,%mm1\n"
     848             :   "paddsw %mm0,%mm2\n"
     849             :   "psraw  $0x6,%mm1\n"
     850             :   "psraw  $0x6,%mm2\n"
     851             :   "packuswb %mm2,%mm1\n"
     852             :   "movntq %mm1,0x0(%ebp)\n"
     853             :   "add    $0x8,%ebp\n"
     854             : 
     855             : "1:"
     856             :   "cmp    %ebx, 0x34(%esp)\n"
     857             :   "jg     0b\n"
     858             :   "popa\n"
     859             :   "ret\n"
     860             : 
     861             : "2:"
     862             :   "paddsw %mm0, %mm1\n"
     863             :   "psraw $6, %mm1\n"
     864             :   "packuswb %mm1, %mm1\n"
     865             :   "movd %mm1, (%ebp)\n"
     866             :   "popa\n"
     867             :   "ret\n"
     868             : #if !defined(XP_MACOSX)
     869             :   ".previous\n"
     870             : #endif
     871             : );
     872             : 
     873             : 
     874             : void LinearScaleYUVToRGB32Row(const uint8* y_buf,
     875             :                               const uint8* u_buf,
     876             :                               const uint8* v_buf,
     877             :                               uint8* rgb_buf,
     878             :                               int width,
     879             :                               int source_dx)
     880             : {
     881             :   if (mozilla::supports_sse()) {
     882             :     PICLinearScaleYUVToRGB32Row_SSE(y_buf, u_buf, v_buf, rgb_buf, width,
     883             :                                     source_dx, &kCoefficientsRgbY[0][0]);
     884             :     return;
     885             :   }
     886             : 
     887             :   LinearScaleYUVToRGB32Row_C(y_buf, u_buf, v_buf, rgb_buf, width, source_dx);
     888             : }
     889             : #else
     890             : void FastConvertYUVToRGB32Row(const uint8* y_buf,
     891             :                               const uint8* u_buf,
     892             :                               const uint8* v_buf,
     893             :                               uint8* rgb_buf,
     894             :                               int width) {
     895             :   FastConvertYUVToRGB32Row_C(y_buf, u_buf, v_buf, rgb_buf, width, 1);
     896             : }
     897             : 
     898             : void ScaleYUVToRGB32Row(const uint8* y_buf,
     899             :                         const uint8* u_buf,
     900             :                         const uint8* v_buf,
     901             :                         uint8* rgb_buf,
     902             :                         int width,
     903             :                         int source_dx) {
     904             :   ScaleYUVToRGB32Row_C(y_buf, u_buf, v_buf, rgb_buf, width, source_dx);
     905             : }
     906             : 
     907             : void LinearScaleYUVToRGB32Row(const uint8* y_buf,
     908             :                               const uint8* u_buf,
     909             :                               const uint8* v_buf,
     910             :                               uint8* rgb_buf,
     911             :                               int width,
     912             :                               int source_dx) {
     913             :   LinearScaleYUVToRGB32Row_C(y_buf, u_buf, v_buf, rgb_buf, width, source_dx);
     914             : }
     915             : #endif
     916             : 
     917             : }

Generated by: LCOV version 1.13