OLD | NEW |
| (Empty) |
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 ; Parameters are in the following order: | |
14 ; 1. Y plane | |
15 ; 2. U plane | |
16 ; 3. V plane | |
17 ; 4. ARGB frame | |
18 ; 5. Width | |
19 ; 6. Source dx | |
20 ; 7. Conversion lookup table | |
21 | |
22 PROLOGUE 7, 7, 3, Y, R0, R1, ARGB, R2, TEMP, R3 | |
23 | |
24 %if gprsize == 8 | |
25 %define WORD_SIZE QWORD | |
26 %else | |
27 %define WORD_SIZE DWORD | |
28 %endif | |
29 | |
30 ; Define register aliases. | |
31 %define Xq R1q ; Current X position | |
32 %define COMPLq R2q ; Component A value | |
33 %define COMPLd R2d ; Component A value | |
34 %define U_ARG_REGq R0q ; U plane address argument | |
35 %define V_ARG_REGq R1q ; V plane address argument | |
36 %define SOURCE_DX_ARG_REGq TEMPq ; Source dx argument | |
37 %define WIDTH_ARG_REGq R2q ; Width argument | |
38 | |
39 %define COMPRq R0q ; Component B value | |
40 %define COMPRd R0d ; Component B value | |
41 %define Uq R0q ; U plane address | |
42 %define Vq R0q ; V plane address | |
43 %define U_PLANE WORD_SIZE [rsp + 3 * gprsize] | |
44 %define TABLE R3q ; Address of the table | |
45 | |
46 ; Defines for stack variables. | |
47 %define V_PLANE WORD_SIZE [rsp + 2 * gprsize] | |
48 %define SOURCE_DX WORD_SIZE [rsp + gprsize] | |
49 %define SOURCE_WIDTH WORD_SIZE [rsp] | |
50 | |
51 ; Define stack usage. | |
52 PUSH U_ARG_REGq | |
53 PUSH V_ARG_REGq | |
54 PUSH SOURCE_DX_ARG_REGq | |
55 imul WIDTH_ARG_REGq, SOURCE_DX_ARG_REGq ; source_width = width * source_
dx | |
56 PUSH WIDTH_ARG_REGq | |
57 | |
58 %macro EPILOGUE 0 | |
59 ADD rsp, 4 * gprsize | |
60 %endmacro | |
61 | |
62 xor Xq, Xq ; x = 0 | |
63 cmp SOURCE_DX_ARG_REGq, 0x20000 | |
64 jl .lscaleend | |
65 mov Xq, 0x8000 ; x = 0.5 for 1/2 or less | |
66 jmp .lscaleend | |
67 | |
68 .lscaleloop: | |
69 mov Uq, U_PLANE | |
70 | |
71 ; Define macros for scaling YUV components since they are reused. | |
72 %macro SCALEUV 1 | |
73 mov TEMPq, Xq | |
74 sar TEMPq, 0x11 | |
75 movzx COMPLd, BYTE [%1 + TEMPq] | |
76 movzx COMPRd, BYTE [%1 + TEMPq + 1] | |
77 mov TEMPq, Xq | |
78 and TEMPq, 0x1fffe | |
79 imul COMPRq, TEMPq | |
80 xor TEMPq, 0x1fffe | |
81 imul COMPLq, TEMPq | |
82 add COMPLq, COMPRq | |
83 shr COMPLq, 17 | |
84 %endmacro | |
85 SCALEUV Uq ; Use the above macro to scale U | |
86 movq mm0, [TABLE + 2048 + 8 * COMPLq] | |
87 | |
88 mov Vq, V_PLANE ; Read V address from stack | |
89 SCALEUV Vq ; Use the above macro to scale V | |
90 paddsw mm0, [TABLE + 4096 + 8 * COMPLq] | |
91 | |
92 %macro SCALEY 0 | |
93 mov TEMPq, Xq | |
94 sar TEMPq, 0x10 | |
95 movzx COMPLd, BYTE [Yq + TEMPq] | |
96 movzx COMPRd, BYTE [Yq + TEMPq + 1] | |
97 mov TEMPq, Xq | |
98 add Xq, SOURCE_DX ; Add source_dx from stack | |
99 and TEMPq, 0xffff | |
100 imul COMPRq, TEMPq | |
101 xor TEMPq, 0xffff | |
102 imul COMPLq, TEMPq | |
103 add COMPLq, COMPRq | |
104 shr COMPLq, 16 | |
105 %endmacro | |
106 SCALEY ; Use the above macro to scale Y1 | |
107 movq mm1, [TABLE + 8 * COMPLq] | |
108 | |
109 cmp Xq, SOURCE_WIDTH ; Compare source_width from stack | |
110 jge .lscalelastpixel | |
111 | |
112 SCALEY ; Use the above macro to sacle Y2 | |
113 movq mm2, [TABLE + 8 * COMPLq] | |
114 | |
115 paddsw mm1, mm0 | |
116 paddsw mm2, mm0 | |
117 psraw mm1, 0x6 | |
118 psraw mm2, 0x6 | |
119 packuswb mm1, mm2 | |
120 MOVQ [ARGBq], mm1 | |
121 add ARGBq, 0x8 | |
122 | |
123 .lscaleend: | |
124 cmp Xq, SOURCE_WIDTH ; Compare source_width from stack | |
125 jl .lscaleloop | |
126 EPILOGUE | |
127 RET | |
128 | |
129 .lscalelastpixel: | |
130 paddsw mm1, mm0 | |
131 psraw mm1, 6 | |
132 packuswb mm1, mm1 | |
133 movd [ARGBq], mm1 | |
134 EPILOGUE | |
135 RET | |
OLD | NEW |