Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / media / base / simd / scale_yuv_to_rgb_mmx.inc
1 ; Copyright (c) 2011 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 "media/base/simd/media_export.asm"
6
7   EXPORT    SYMBOL
8   align     function_align
9
10 mangle(SYMBOL):
11   %assign   stack_offset 0
12
13   extern    mangle(kCoefficientsRgbY)
14
15 ; Parameters are in the following order:
16 ; 1. Y plane
17 ; 2. U plane
18 ; 3. V plane
19 ; 4. ARGB frame
20 ; 5. Width
21 ; 6. Source dx
22 ; 7. Lookup table address
23
24 PROLOGUE  7, 7, 3, Y, U, V, ARGB, R1, R2, TEMP
25
26 %ifdef ARCH_X86_64
27 %define     WORD_SIZE   QWORD
28 %else
29 %define     WORD_SIZE   DWORD
30 %endif
31
32   PUSH      R1q  ; Width
33   PUSH      R2q  ; Source dx
34
35 %define     SOURCE_DX   WORD_SIZE [rsp]
36
37   mov       R1q, TEMPq
38
39 %define     WIDTH       WORD_SIZE [rsp + gprsize]
40 %define     TABLE       R1q
41 %define     Xq          R2q
42
43   ; Set Xq index to 0.
44   xor       Xq, Xq
45   jmp       .scaleend
46
47 .scaleloop:
48   mov       TEMPq, Xq
49   sar       TEMPq, 17
50   movzx     TEMPd, BYTE [Uq + TEMPq]
51   movq      mm0, [TABLE + 2048 + 8 * TEMPq]
52   mov       TEMPq, Xq
53   sar       TEMPq, 17
54   movzx     TEMPd, BYTE [Vq + TEMPq]
55   paddsw    mm0, [TABLE + 4096 + 8 * TEMPq]
56   mov       TEMPq, Xq
57   add       Xq, SOURCE_DX
58   sar       TEMPq, 16
59   movzx     TEMPd, BYTE [Yq + TEMPq]
60   movq      mm1, [TABLE + 8 * TEMPq]
61   mov       TEMPq, Xq
62   add       Xq, SOURCE_DX
63   sar       TEMPq, 16
64   movzx     TEMPd, BYTE [Yq + TEMPq]
65   movq      mm2, [TABLE + 8 * TEMPq]
66   paddsw    mm1, mm0
67   paddsw    mm2, mm0
68   psraw     mm1, 6
69   psraw     mm2, 6
70   packuswb  mm1, mm2
71   MOVQ      QWORD [ARGBq], mm1
72   add       ARGBq, 8
73
74 .scaleend:
75   sub       WIDTH, 2
76   jns       .scaleloop
77
78   and       WIDTH, 1             ; odd number of pixels?
79   jz        .scaledone
80
81   mov       TEMPq, Xq
82   sar       TEMPq, 17
83   movzx     TEMPd, BYTE [Uq + TEMPq]
84   movq      mm0, [TABLE + 2048 + 8 * TEMPq]
85   mov       TEMPq, Xq
86   sar       TEMPq, 17
87   movzx     TEMPd, BYTE [Vq + TEMPq]
88   paddsw    mm0, [TABLE + 4096 + 8 * TEMPq]
89   mov       TEMPq, Xq
90   sar       TEMPq, 16
91   movzx     TEMPd, BYTE [Yq + TEMPq]
92   movq      mm1, [TABLE + 8 * TEMPq]
93   paddsw    mm1, mm0
94   psraw     mm1, 6
95   packuswb  mm1, mm1
96   movd      DWORD [ARGBq], mm1
97
98 .scaledone:
99   ADD       rsp, 2 * gprsize
100   RET