Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / media / base / simd / convert_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   PROLOGUE  6, 7, 3, Y, U, V, ARGB, WIDTH, TABLE, TEMP
13
14   jmp       .convertend
15
16 .convertloop:
17   movzx     TEMPd, BYTE [Uq]
18   movq      mm0, [TABLEq + 2048 + 8 * TEMPq]
19   add       Uq, 1
20
21   movzx     TEMPd, BYTE [Vq]
22   paddsw    mm0, [TABLEq + 4096 + 8 * TEMPq]
23   add       Vq, 1
24
25   movzx     TEMPd, BYTE [Yq]
26   movq      mm1, [TABLEq + 8 * TEMPq]
27
28   movzx     TEMPd, BYTE [Yq + 1]
29   movq      mm2, [TABLEq + 8 * TEMPq]
30   add       Yq, 2
31
32   ; Add UV components to Y component.
33   paddsw    mm1, mm0
34   paddsw    mm2, mm0
35
36   ; Down shift and then pack.
37   psraw     mm1, 6
38   psraw     mm2, 6
39   packuswb  mm1, mm2
40   MOVQ      [ARGBq], mm1
41   add       ARGBq, 8
42
43 .convertend:
44   sub       WIDTHq, 2
45   jns       .convertloop
46
47   ; If number of pixels is odd then compute it.
48   and       WIDTHq, 1
49   jz        .convertdone
50
51   movzx     TEMPd, BYTE [Uq]
52   movq      mm0, [TABLEq + 2048 + 8 * TEMPq]
53   movzx     TEMPd, BYTE [Vq]
54   paddsw    mm0, [TABLEq + 4096 + 8 * TEMPq]
55   movzx     TEMPd, BYTE [Yq]
56   movq      mm1, [TABLEq + 8 * TEMPq]
57   paddsw    mm1, mm0
58   psraw     mm1, 6
59   packuswb  mm1, mm1
60   movd      [ARGBq], mm1
61
62 .convertdone:
63   RET