summaryrefslogtreecommitdiff
path: root/libavcodec/x86/cfhdencdsp.asm
blob: 4aaeb5697295dd1a03d9860c0ab9c6f8fe10d246 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
;******************************************************************************
;* x86-optimized functions for the CFHD encoder
;* Copyright (c) 2021 Paul B Mahol
;*
;* This file is part of FFmpeg.
;*
;* FFmpeg is free software; you can redistribute it and/or
;* modify it under the terms of the GNU Lesser General Public
;* License as published by the Free Software Foundation; either
;* version 2.1 of the License, or (at your option) any later version.
;*
;* FFmpeg is distributed in the hope that it will be useful,
;* but WITHOUT ANY WARRANTY; without even the implied warranty of
;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
;* Lesser General Public License for more details.
;*
;* You should have received a copy of the GNU Lesser General Public
;* License along with FFmpeg; if not, write to the Free Software
;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
;******************************************************************************

%include "libavutil/x86/x86util.asm"

SECTION_RODATA

pw_p1_n1:  dw  1, -1, 1, -1, 1, -1, 1, -1
pw_n1_p1:  dw  -1, 1, -1, 1, -1, 1, -1, 1
pw_p5_n11: dw  5, -11, 5, -11, 5, -11, 5, -11
pw_n5_p11: dw -5, 11, -5, 11, -5, 11, -5, 11
pw_p11_n5: dw 11, -5, 11, -5, 11, -5, 11, -5
pw_n11_p5: dw -11, 5, -11, 5, -11, 5, -11, 5
pd_4:  times 4 dd  4
pw_n4: times 8 dw -4
cextern pw_m1
cextern pw_1
cextern pw_4

SECTION .text

%if ARCH_X86_64
INIT_XMM sse2
cglobal cfhdenc_horiz_filter, 8, 10, 11, input, low, high, istride, lwidth, hwidth, width, y, x, temp
    shl  istrideq, 1
    shl   lwidthq, 1
    shl   hwidthq, 1
    mova       m7, [pd_4]
    mova       m8, [pw_1]
    mova       m9, [pw_m1]
    mova       m10,[pw_p1_n1]
    movsxdifnidn yq, yd
    movsxdifnidn widthq, widthd
    neg        yq
.looph:
    movsx          xq, word [inputq]

    movsx       tempq, word [inputq + 2]
    add         tempq, xq

    movd          xm0, tempd
    packssdw       m0, m0
    movd        tempd, m0
    mov   word [lowq], tempw

    movsx          xq, word [inputq]
    imul           xq, 5
    movsx       tempq, word [inputq + 2]
    imul        tempq, -11
    add         tempq, xq

    movsx          xq, word [inputq + 4]
    imul           xq, 4
    add         tempq, xq

    movsx          xq, word [inputq + 6]
    imul           xq, 4
    add         tempq, xq

    movsx          xq, word [inputq + 8]
    imul           xq, -1
    add         tempq, xq

    movsx          xq, word [inputq + 10]
    imul           xq, -1
    add         tempq, xq

    add         tempq, 4
    sar         tempq, 3

    movd          xm0, tempd
    packssdw       m0, m0
    movd        tempd, m0
    mov  word [highq], tempw

    mov            xq, 2

.loopw:
    movu           m0, [inputq + xq * 2]
    movu           m1, [inputq + xq * 2 + mmsize]

    pmaddwd        m0, m8
    pmaddwd        m1, m8

    packssdw       m0, m1
    movu    [lowq+xq], m0

    movu           m2, [inputq + xq * 2 - 4]
    movu           m3, [inputq + xq * 2 - 4 + mmsize]

    pmaddwd        m2, m9
    pmaddwd        m3, m9

    movu           m0, [inputq + xq * 2 + 4]
    movu           m1, [inputq + xq * 2 + 4 + mmsize]

    pmaddwd        m0, m8
    pmaddwd        m1, m8

    paddd          m0, m2
    paddd          m1, m3

    paddd          m0, m7
    paddd          m1, m7

    psrad          m0, 3
    psrad          m1, 3

    movu           m5, [inputq + xq * 2 + 0]
    movu           m6, [inputq + xq * 2 + mmsize]

    pmaddwd        m5, m10
    pmaddwd        m6, m10

    paddd          m0, m5
    paddd          m1, m6

    packssdw       m0, m1
    movu   [highq+xq], m0

    add            xq, mmsize
    cmp            xq, widthq
    jl .loopw

    add          lowq, widthq
    add         highq, widthq
    lea        inputq, [inputq + widthq * 2]

    movsx          xq, word [inputq - 4]
    movsx       tempq, word [inputq - 2]
    add         tempq, xq

    movd          xm0, tempd
    packssdw       m0, m0
    movd        tempd, m0
    mov word [lowq-2], tempw

    movsx       tempq, word [inputq - 4]
    imul        tempq, 11
    movsx          xq, word [inputq - 2]
    imul           xq, -5
    add         tempq, xq

    movsx          xq, word [inputq - 6]
    imul           xq, -4
    add         tempq, xq

    movsx          xq, word [inputq - 8]
    imul           xq, -4
    add         tempq, xq

    movsx          xq, word [inputq - 10]
    add         tempq, xq

    movsx          xq, word [inputq - 12]
    add         tempq, xq

    add         tempq, 4
    sar         tempq, 3

    movd          xm0, tempd
    packssdw       m0, m0
    movd        tempd, m0
    mov word [highq-2], tempw

    sub        inputq, widthq
    sub        inputq, widthq
    sub         highq, widthq
    sub          lowq, widthq

    add          lowq, lwidthq
    add         highq, hwidthq
    add        inputq, istrideq
    add            yq, 1
    jl .looph

    RET
%endif

%if ARCH_X86_64
INIT_XMM sse2
cglobal cfhdenc_vert_filter, 8, 11, 14, input, low, high, istride, lwidth, hwidth, width, height, x, y, pos
    shl  istrideq, 1

    shl    widthd, 1
    sub   heightd, 2

    xor        xq, xq

    mova       m7, [pd_4]
    mova       m8, [pw_1]
    mova       m9, [pw_m1]
    mova       m10,[pw_p1_n1]
    mova       m11,[pw_n1_p1]
    mova       m12,[pw_4]
    mova       m13,[pw_n4]
.loopw:
    mov        yq, 2

    mov      posq, xq
    movu       m0, [inputq + posq]
    add      posq, istrideq
    movu       m1, [inputq + posq]

    paddsw     m0, m1

    movu    [lowq + xq], m0

    mov      posq, xq

    movu       m0, [inputq + posq]
    add      posq, istrideq
    movu       m1, [inputq + posq]
    add      posq, istrideq
    movu       m2, [inputq + posq]
    add      posq, istrideq
    movu       m3, [inputq + posq]
    add      posq, istrideq
    movu       m4, [inputq + posq]
    add      posq, istrideq
    movu       m5, [inputq + posq]

    mova       m6, m0
    punpcklwd  m0, m1
    punpckhwd  m1, m6

    mova       m6, m2
    punpcklwd  m2, m3
    punpckhwd  m3, m6

    mova       m6, m4
    punpcklwd  m4, m5
    punpckhwd  m5, m6

    pmaddwd    m0, [pw_p5_n11]
    pmaddwd    m1, [pw_n11_p5]
    pmaddwd    m2, m12
    pmaddwd    m3, m12
    pmaddwd    m4, m9
    pmaddwd    m5, m9

    paddd      m0, m2
    paddd      m1, m3
    paddd      m0, m4
    paddd      m1, m5

    paddd      m0, m7
    paddd      m1, m7

    psrad      m0, 3
    psrad      m1, 3
    packssdw   m0, m1

    movu   [highq + xq], m0

.looph:

    mov      posq, istrideq
    imul     posq, yq
    add      posq, xq

    movu       m0, [inputq + posq]

    add      posq, istrideq
    movu       m1, [inputq + posq]

    paddsw     m0, m1

    mov      posq, lwidthq
    imul     posq, yq
    add      posq, xq

    movu    [lowq + posq], m0

    add        yq, -2

    mov      posq, istrideq
    imul     posq, yq
    add      posq, xq

    movu       m0, [inputq + posq]
    add      posq, istrideq
    movu       m1, [inputq + posq]
    add      posq, istrideq
    movu       m2, [inputq + posq]
    add      posq, istrideq
    movu       m3, [inputq + posq]
    add      posq, istrideq
    movu       m4, [inputq + posq]
    add      posq, istrideq
    movu       m5, [inputq + posq]

    add        yq, 2

    mova       m6, m0
    punpcklwd  m0, m1
    punpckhwd  m1, m6

    mova       m6, m2
    punpcklwd  m2, m3
    punpckhwd  m3, m6

    mova       m6, m4
    punpcklwd  m4, m5
    punpckhwd  m5, m6

    pmaddwd    m0, m9
    pmaddwd    m1, m9
    pmaddwd    m2, m10
    pmaddwd    m3, m11
    pmaddwd    m4, m8
    pmaddwd    m5, m8

    paddd      m0, m4
    paddd      m1, m5

    paddd      m0, m7
    paddd      m1, m7

    psrad      m0, 3
    psrad      m1, 3
    paddd      m0, m2
    paddd      m1, m3
    packssdw   m0, m1

    mov      posq, hwidthq
    imul     posq, yq
    add      posq, xq

    movu   [highq + posq], m0

    add        yq, 2
    cmp        yq, heightq
    jl .looph

    mov      posq, istrideq
    imul     posq, yq
    add      posq, xq

    movu       m0, [inputq + posq]
    add      posq, istrideq
    movu       m1, [inputq + posq]

    paddsw     m0, m1

    mov      posq, lwidthq
    imul     posq, yq
    add      posq, xq

    movu    [lowq + posq], m0

    sub        yq, 4

    mov      posq, istrideq
    imul     posq, yq
    add      posq, xq

    movu       m0, [inputq + posq]
    add      posq, istrideq
    movu       m1, [inputq + posq]
    add      posq, istrideq
    movu       m2, [inputq + posq]
    add      posq, istrideq
    movu       m3, [inputq + posq]
    add      posq, istrideq
    movu       m4, [inputq + posq]
    add      posq, istrideq
    movu       m5, [inputq + posq]

    add        yq, 4

    mova       m6, m0
    punpcklwd  m0, m1
    punpckhwd  m1, m6

    mova       m6, m2
    punpcklwd  m2, m3
    punpckhwd  m3, m6

    mova       m6, m4
    punpcklwd  m4, m5
    punpckhwd  m5, m6

    pmaddwd    m0, m8
    pmaddwd    m1, m8
    pmaddwd    m2, m13
    pmaddwd    m3, m13
    pmaddwd    m4, [pw_p11_n5]
    pmaddwd    m5, [pw_n5_p11]

    paddd      m4, m2
    paddd      m5, m3

    paddd      m4, m0
    paddd      m5, m1

    paddd      m4, m7
    paddd      m5, m7

    psrad      m4, 3
    psrad      m5, 3
    packssdw   m4, m5

    mov      posq, hwidthq
    imul     posq, yq
    add      posq, xq

    movu   [highq + posq], m4

    add        xq, mmsize
    cmp        xq, widthq
    jl .loopw
    RET
%endif