1 ;******************************************************************************
2 ;* SIMD-optimized HuffYUV functions
3 ;* Copyright (c) 2008 Loren Merritt
4 ;* Copyright (c) 2014 Christophe Gisquet
6 ;* This file is part of FFmpeg.
8 ;* FFmpeg is free software; you can redistribute it and/or
9 ;* modify it under the terms of the GNU Lesser General Public
10 ;* License as published by the Free Software Foundation; either
11 ;* version 2.1 of the License, or (at your option) any later version.
13 ;* FFmpeg is distributed in the hope that it will be useful,
14 ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
15 ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 ;* Lesser General Public License for more details.
18 ;* You should have received a copy of the GNU Lesser General Public
19 ;* License along with FFmpeg; if not, write to the Free Software
20 ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 ;******************************************************************************
23 %include "libavutil/x86/x86util.asm"
27 pb_zzzzzzzz77777777: times 8 db -1
29 pb_zzzz3333zzzzbbbb: db -1,-1,-1,-1,3,3,3,3,-1,-1,-1,-1,11,11,11,11
30 pb_zz11zz55zz99zzdd: db -1,-1,1,1,-1,-1,5,5,-1,-1,9,9,-1,-1,13,13
34 ; void ff_add_hfyu_median_pred_mmxext(uint8_t *dst, const uint8_t *top,
35 ; const uint8_t *diff, int w,
36 ; int *left, int *left_top)
38 cglobal add_hfyu_median_pred, 6,6,8, dst, top, diff, w, left, left_top
69 pmaxub m3, m5 ; median
70 paddb m3, m2 ; +residual
90 movzx r2d, byte [dstq-1]
92 movzx r2d, byte [topq-1]
105 %macro ADD_HFYU_LEFT_LOOP 2 ; %1 = dst_is_aligned, %2 = src_is_aligned
135 movhps [dstq+wq+8], m0
147 ; int ff_add_hfyu_left_pred(uint8_t *dst, const uint8_t *src, int w, int left)
149 cglobal add_hfyu_left_pred, 3,3,7, dst, src, w, left
152 mova m4, [pb_zzzz3333zzzzbbbb]
153 mova m3, [pb_zz11zz55zz99zzdd]
156 ADD_HFYU_LEFT_LOOP 1, 1
159 cglobal add_hfyu_left_pred, 3,3,7, dst, src, w, left
161 mova m6, [pb_zzzzzzzz77777777]
162 mova m4, [pb_zzzz3333zzzzbbbb]
163 mova m3, [pb_zz11zz55zz99zzdd]
170 ADD_HFYU_LEFT_LOOP 1, 1
172 ADD_HFYU_LEFT_LOOP 0, 1
174 ADD_HFYU_LEFT_LOOP 0, 0
177 cglobal add_bytes, 3,4,2, dst, src, w, size
185 mova m0, [srcq + sizeq]
186 mova m1, [srcq + sizeq + mmsize]
187 paddb m0, [dstq + sizeq]
188 paddb m1, [dstq + sizeq + mmsize]
189 mova [dstq + sizeq], m0
190 mova [dstq + sizeq + mmsize], m1
200 mov sizeb, [srcq + wq]
201 add [dstq + wq], sizeb
215 ; void add_hfyu_left_pred_bgr32(uint8_t *dst, const uint8_t *src,
216 ; intptr_t w, uint8_t *left)
218 cglobal add_hfyu_left_pred_bgr32, 4,4,3, dst, src, w, left
221 lea dstq, [dstq + wq]
222 lea srcq, [srcq + wq]