~siretart/libav/trusty

« back to all changes in this revision

Viewing changes to libavcodec/x86/h264_chromamc_10bit.asm

  • Committer: Reinhard Tartler
  • Date: 2013-10-23 03:04:17 UTC
  • mfrom: (1.3.36 sid)
  • Revision ID: siretart@tauware.de-20131023030417-1o6mpkl1l0raifjt
mergeĀ fromĀ debian

Show diffs side-by-side

added added

removed removed

Lines of Context:
22
22
;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23
23
;******************************************************************************
24
24
 
25
 
%include "x86inc.asm"
26
 
%include "x86util.asm"
 
25
%include "libavutil/x86/x86util.asm"
27
26
 
28
27
SECTION_RODATA
29
28
 
38
37
%macro MV0_PIXELS_MC8 0
39
38
    lea           r4, [r2*3   ]
40
39
    lea           r5, [r2*4   ]
41
 
.next4rows
 
40
.next4rows:
42
41
    movu          m0, [r1     ]
43
42
    movu          m1, [r1+r2  ]
44
43
    CHROMAMC_AVG  m0, [r0     ]
60
59
;-----------------------------------------------------------------------------
61
60
; void put/avg_h264_chroma_mc8(pixel *dst, pixel *src, int stride, int h, int mx, int my)
62
61
;-----------------------------------------------------------------------------
63
 
%macro CHROMA_MC8 2
 
62
%macro CHROMA_MC8 1
64
63
; put/avg_h264_chroma_mc8_*(uint8_t *dst /*align 8*/, uint8_t *src /*align 1*/,
65
64
;                              int stride, int h, int mx, int my)
66
 
cglobal %1_h264_chroma_mc8_10_%2, 6,7,8
 
65
cglobal %1_h264_chroma_mc8_10, 6,7,8
67
66
    movsxdifnidn  r2, r2d
68
67
    mov          r6d, r5d
69
68
    or           r6d, r4d
72
71
    MV0_PIXELS_MC8
73
72
    REP_RET
74
73
 
75
 
.at_least_one_non_zero
 
74
.at_least_one_non_zero:
76
75
    mov          r6d, 2
77
76
    test         r5d, r5d
78
77
    je .x_interpolation
79
78
    mov           r6, r2        ; dxy = x ? 1 : stride
80
79
    test         r4d, r4d
81
80
    jne .xy_interpolation
82
 
.x_interpolation
 
81
.x_interpolation:
83
82
    ; mx == 0 XOR my == 0 - 1 dimensional filter only
84
83
    or           r4d, r5d       ; x + y
85
84
    movd          m5, r4d
88
87
    SPLATW        m5, m5        ; mm5 = B = x
89
88
    psubw         m4, m5        ; mm4 = A = 8-x
90
89
 
91
 
.next1drow
 
90
.next1drow:
92
91
    movu          m0, [r1   ]   ; mm0 = src[0..7]
93
92
    movu          m2, [r1+r6]   ; mm2 = src[1..8]
94
93
 
107
106
    jne .next1drow
108
107
    REP_RET
109
108
 
110
 
.xy_interpolation ; general case, bilinear
 
109
.xy_interpolation: ; general case, bilinear
111
110
    movd          m4, r4m         ; x
112
111
    movd          m6, r5m         ; y
113
112
 
125
124
 
126
125
    movu          m0, [r1  ]      ; mm0 = src[0..7]
127
126
    movu          m1, [r1+2]      ; mm1 = src[1..8]
128
 
.next2drow
 
127
.next2drow:
129
128
    add           r1, r2
130
129
 
131
130
    pmullw        m2, m0, m4
173
172
    add           r0, r2
174
173
%endmacro
175
174
 
176
 
%macro CHROMA_MC4 2
177
 
cglobal %1_h264_chroma_mc4_10_%2, 6,6,7
 
175
%macro CHROMA_MC4 1
 
176
cglobal %1_h264_chroma_mc4_10, 6,6,7
178
177
    movsxdifnidn  r2, r2d
179
178
    movd          m2, r4m         ; x
180
179
    movd          m3, r5m         ; y
192
191
    pmullw        m6, m2
193
192
    paddw         m6, m0
194
193
 
195
 
.next2rows
 
194
.next2rows:
196
195
    MC4_OP m0, m6
197
196
    MC4_OP m6, m0
198
197
    sub   r3d, 2
203
202
;-----------------------------------------------------------------------------
204
203
; void put/avg_h264_chroma_mc2(pixel *dst, pixel *src, int stride, int h, int mx, int my)
205
204
;-----------------------------------------------------------------------------
206
 
%macro CHROMA_MC2 2
207
 
cglobal %1_h264_chroma_mc2_10_%2, 6,7
 
205
%macro CHROMA_MC2 1
 
206
cglobal %1_h264_chroma_mc2_10, 6,7
208
207
    movsxdifnidn  r2, r2d
209
208
    mov          r6d, r4d
210
209
    shl          r4d, 16
221
220
    pxor          m7, m7
222
221
    pshufw        m2, [r1], 0x94    ; mm0 = src[0,1,1,2]
223
222
 
224
 
.nextrow
 
223
.nextrow:
225
224
    add           r1, r2
226
225
    movq          m1, m2
227
226
    pmaddwd       m1, m5          ; mm1 = A * src[0,1] + B * src[1,2]
246
245
%if %0==3
247
246
    movq          %2, %3
248
247
%endif
249
 
    PAVG          %1, %2
 
248
    pavgw         %1, %2
250
249
%endmacro
251
250
 
252
251
%define CHROMAMC_AVG  NOTHING
253
 
INIT_XMM
254
 
CHROMA_MC8 put, sse2
255
 
%ifdef HAVE_AVX
256
 
INIT_AVX
257
 
CHROMA_MC8 put, avx
258
 
%endif
259
 
INIT_MMX
260
 
CHROMA_MC4 put, mmxext
261
 
CHROMA_MC2 put, mmxext
 
252
INIT_XMM sse2
 
253
CHROMA_MC8 put
 
254
INIT_XMM avx
 
255
CHROMA_MC8 put
 
256
INIT_MMX mmxext
 
257
CHROMA_MC4 put
 
258
CHROMA_MC2 put
262
259
 
263
260
%define CHROMAMC_AVG  AVG
264
 
%define PAVG          pavgw
265
 
INIT_XMM
266
 
CHROMA_MC8 avg, sse2
267
 
%ifdef HAVE_AVX
268
 
INIT_AVX
269
 
CHROMA_MC8 avg, avx
270
 
%endif
271
 
INIT_MMX
272
 
CHROMA_MC4 avg, mmxext
273
 
CHROMA_MC2 avg, mmxext
 
261
INIT_XMM sse2
 
262
CHROMA_MC8 avg
 
263
INIT_XMM avx
 
264
CHROMA_MC8 avg
 
265
INIT_MMX mmxext
 
266
CHROMA_MC4 avg
 
267
CHROMA_MC2 avg