~ubuntu-branches/ubuntu/saucy/gst-libav1.0/saucy-proposed

« back to all changes in this revision

Viewing changes to gst-libs/ext/libav/libavcodec/x86/h264_qpel_10bit.asm

  • Committer: Package Import Robot
  • Author(s): Sebastian Dröge
  • Date: 2013-07-30 09:00:15 UTC
  • mfrom: (1.1.16) (7.1.7 experimental)
  • Revision ID: package-import@ubuntu.com-20130730090015-sc1ou2yssu7q5w4e
Tags: 1.1.3-1
* New upstream development snapshot:
  + debian/control:
    - Build depend on GStreamer and gst-plugins-base >= 1.1.3.

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 32
29
28
 
98
97
 
99
98
%macro MC 1
100
99
%define OP_MOV mova
101
 
INIT_MMX
102
 
%1 mmxext, put, 4
103
 
INIT_XMM
104
 
%1 sse2  , put, 8
 
100
INIT_MMX mmxext
 
101
%1 put, 4
 
102
INIT_XMM sse2
 
103
%1 put, 8
105
104
 
106
105
%define OP_MOV AVG_MOV
107
 
INIT_MMX
108
 
%1 mmxext, avg, 4
109
 
INIT_XMM
110
 
%1 sse2  , avg, 8
111
 
%endmacro
112
 
 
113
 
%macro MCAxA 8
114
 
%ifdef ARCH_X86_64
115
 
%ifnidn %1,mmxext
116
 
MCAxA_OP %1,%2,%3,%4,%5,%6,%7,%8
117
 
%endif
118
 
%else
119
 
MCAxA_OP %1,%2,%3,%4,%5,%6,%7,%8
120
 
%endif
121
 
%endmacro
122
 
 
123
 
%macro MCAxA_OP 8
124
 
cglobal %2_h264_qpel%5_%3_10_%1, %6,%7,%8
125
 
%ifdef ARCH_X86_32
126
 
    call stub_%2_h264_qpel%4_%3_10_%1
127
 
    mov  r0, r0m
128
 
    mov  r1, r1m
129
 
    add  r0, %4*2
130
 
    add  r1, %4*2
131
 
    call stub_%2_h264_qpel%4_%3_10_%1
132
 
    mov  r0, r0m
133
 
    mov  r1, r1m
134
 
    lea  r0, [r0+r2*%4]
135
 
    lea  r1, [r1+r2*%4]
136
 
    call stub_%2_h264_qpel%4_%3_10_%1
137
 
    mov  r0, r0m
138
 
    mov  r1, r1m
139
 
    lea  r0, [r0+r2*%4+%4*2]
140
 
    lea  r1, [r1+r2*%4+%4*2]
141
 
    call stub_%2_h264_qpel%4_%3_10_%1
 
106
INIT_MMX mmxext
 
107
%1 avg, 4
 
108
INIT_XMM sse2
 
109
%1 avg, 8
 
110
%endmacro
 
111
 
 
112
%macro MCAxA_OP 7
 
113
%if ARCH_X86_32
 
114
cglobal %1_h264_qpel%4_%2_10, %5,%6,%7
 
115
    call stub_%1_h264_qpel%3_%2_10 %+ SUFFIX
 
116
    mov  r0, r0m
 
117
    mov  r1, r1m
 
118
    add  r0, %3*2
 
119
    add  r1, %3*2
 
120
    call stub_%1_h264_qpel%3_%2_10 %+ SUFFIX
 
121
    mov  r0, r0m
 
122
    mov  r1, r1m
 
123
    lea  r0, [r0+r2*%3]
 
124
    lea  r1, [r1+r2*%3]
 
125
    call stub_%1_h264_qpel%3_%2_10 %+ SUFFIX
 
126
    mov  r0, r0m
 
127
    mov  r1, r1m
 
128
    lea  r0, [r0+r2*%3+%3*2]
 
129
    lea  r1, [r1+r2*%3+%3*2]
 
130
    call stub_%1_h264_qpel%3_%2_10 %+ SUFFIX
142
131
    RET
143
132
%else ; ARCH_X86_64
144
 
    mov r10, r0
145
 
    mov r11, r1
146
 
    call stub_%2_h264_qpel%4_%3_10_%1
147
 
    lea  r0, [r10+%4*2]
148
 
    lea  r1, [r11+%4*2]
149
 
    call stub_%2_h264_qpel%4_%3_10_%1
150
 
    lea  r0, [r10+r2*%4]
151
 
    lea  r1, [r11+r2*%4]
152
 
    call stub_%2_h264_qpel%4_%3_10_%1
153
 
    lea  r0, [r10+r2*%4+%4*2]
154
 
    lea  r1, [r11+r2*%4+%4*2]
155
 
%ifndef UNIX64 ; fall through to function
156
 
    call stub_%2_h264_qpel%4_%3_10_%1
 
133
cglobal %1_h264_qpel%4_%2_10, %5,%6 + 2,%7
 
134
    mov r%6, r0
 
135
%assign p1 %6+1
 
136
    mov r %+ p1, r1
 
137
    call stub_%1_h264_qpel%3_%2_10 %+ SUFFIX
 
138
    lea  r0, [r%6+%3*2]
 
139
    lea  r1, [r %+ p1+%3*2]
 
140
    call stub_%1_h264_qpel%3_%2_10 %+ SUFFIX
 
141
    lea  r0, [r%6+r2*%3]
 
142
    lea  r1, [r %+ p1+r2*%3]
 
143
    call stub_%1_h264_qpel%3_%2_10 %+ SUFFIX
 
144
    lea  r0, [r%6+r2*%3+%3*2]
 
145
    lea  r1, [r %+ p1+r2*%3+%3*2]
 
146
%if UNIX64 == 0 ; fall through to function
 
147
    call stub_%1_h264_qpel%3_%2_10 %+ SUFFIX
157
148
    RET
158
149
%endif
159
150
%endif
160
151
%endmacro
161
152
 
162
153
;cpu, put/avg, mc, 4/8, ...
163
 
%macro cglobal_mc 7
164
 
%assign i %4*2
165
 
MCAxA %1, %2, %3, %4, i, %5,%6,%7
 
154
%macro cglobal_mc 6
 
155
%assign i %3*2
 
156
%if ARCH_X86_32 || cpuflag(sse2)
 
157
MCAxA_OP %1, %2, %3, i, %4,%5,%6
 
158
%endif
166
159
 
167
 
cglobal %2_h264_qpel%4_%3_10_%1, %5,%6,%7
168
 
%ifndef UNIX64 ; no prologue or epilogue for UNIX64
169
 
    call stub_%2_h264_qpel%4_%3_10_%1
 
160
cglobal %1_h264_qpel%3_%2_10, %4,%5,%6
 
161
%if UNIX64 == 0 ; no prologue or epilogue for UNIX64
 
162
    call stub_%1_h264_qpel%3_%2_10 %+ SUFFIX
170
163
    RET
171
164
%endif
172
165
 
173
 
stub_%2_h264_qpel%4_%3_10_%1:
 
166
stub_%1_h264_qpel%3_%2_10 %+ SUFFIX:
174
167
%endmacro
175
168
 
176
169
;-----------------------------------------------------------------------------
188
181
%endmacro
189
182
 
190
183
%macro MC00 1
191
 
INIT_MMX
192
 
cglobal_mc mmxext, %1, mc00, 4, 3,4,0
 
184
INIT_MMX mmxext
 
185
cglobal_mc %1, mc00, 4, 3,4,0
193
186
    lea           r3, [r2*3]
194
187
    COPY4
195
188
    ret
196
189
 
197
 
INIT_XMM
198
 
cglobal %1_h264_qpel8_mc00_10_sse2, 3,4
 
190
INIT_XMM sse2
 
191
cglobal %1_h264_qpel8_mc00_10, 3,4
199
192
    lea  r3, [r2*3]
200
193
    COPY4
201
194
    lea  r0, [r0+r2*4]
203
196
    COPY4
204
197
    RET
205
198
 
206
 
cglobal %1_h264_qpel16_mc00_10_sse2, 3,4
 
199
cglobal %1_h264_qpel16_mc00_10, 3,4
207
200
    mov r3d, 8
208
201
.loop:
209
202
    movu           m0, [r1      ]
232
225
;-----------------------------------------------------------------------------
233
226
%macro MC_CACHE 1
234
227
%define OP_MOV mova
235
 
%define PALIGNR PALIGNR_MMX
236
 
INIT_MMX
237
 
%1 mmxext       , put, 4
238
 
INIT_XMM
239
 
%1 sse2_cache64 , put, 8
240
 
%define PALIGNR PALIGNR_SSSE3
241
 
%1 ssse3_cache64, put, 8
242
 
%1 sse2         , put, 8, 0
 
228
INIT_MMX mmxext
 
229
%1 put, 4
 
230
INIT_XMM sse2, cache64
 
231
%1 put, 8
 
232
INIT_XMM ssse3, cache64
 
233
%1 put, 8
 
234
INIT_XMM sse2
 
235
%1 put, 8
243
236
 
244
237
%define OP_MOV AVG_MOV
245
 
%define PALIGNR PALIGNR_MMX
246
 
INIT_MMX
247
 
%1 mmxext       , avg, 4
248
 
INIT_XMM
249
 
%1 sse2_cache64 , avg, 8
250
 
%define PALIGNR PALIGNR_SSSE3
251
 
%1 ssse3_cache64, avg, 8
252
 
%1 sse2         , avg, 8, 0
 
238
INIT_MMX mmxext
 
239
%1 avg, 4
 
240
INIT_XMM sse2, cache64
 
241
%1 avg, 8
 
242
INIT_XMM ssse3, cache64
 
243
%1 avg, 8
 
244
INIT_XMM sse2
 
245
%1 avg, 8
253
246
%endmacro
254
247
 
255
 
%macro MC20 3-4
256
 
cglobal_mc %1, %2, mc20, %3, 3,4,9
257
 
    mov     r3d, %3
 
248
%macro MC20 2
 
249
cglobal_mc %1, mc20, %2, 3,4,9
 
250
    mov     r3d, %2
258
251
    mova     m1, [pw_pixel_max]
259
252
%if num_mmregs > 8
260
253
    mova     m8, [pw_16]
262
255
%else
263
256
    %define p16 [pw_16]
264
257
%endif
265
 
.nextrow
 
258
.nextrow:
266
259
%if %0 == 4
267
260
    movu     m2, [r1-4]
268
261
    movu     m3, [r1-2]
314
307
;-----------------------------------------------------------------------------
315
308
; void h264_qpel_mc30(uint8_t *dst, uint8_t *src, int stride)
316
309
;-----------------------------------------------------------------------------
317
 
%macro MC30 3-4
318
 
cglobal_mc %1, %2, mc30, %3, 3,5,9
 
310
%macro MC30 2
 
311
cglobal_mc %1, mc30, %2, 3,5,9
319
312
    lea r4, [r1+2]
320
 
    jmp stub_%2_h264_qpel%3_mc10_10_%1.body
 
313
    jmp stub_%1_h264_qpel%2_mc10_10 %+ SUFFIX %+ .body
321
314
%endmacro
322
315
 
323
316
MC_CACHE MC30
325
318
;-----------------------------------------------------------------------------
326
319
; void h264_qpel_mc10(uint8_t *dst, uint8_t *src, int stride)
327
320
;-----------------------------------------------------------------------------
328
 
%macro MC10 3-4
329
 
cglobal_mc %1, %2, mc10, %3, 3,5,9
 
321
%macro MC10 2
 
322
cglobal_mc %1, mc10, %2, 3,5,9
330
323
    mov      r4, r1
331
 
.body
332
 
    mov     r3d, %3
 
324
.body:
 
325
    mov     r3d, %2
333
326
    mova     m1, [pw_pixel_max]
334
327
%if num_mmregs > 8
335
328
    mova     m8, [pw_16]
337
330
%else
338
331
    %define p16 [pw_16]
339
332
%endif
340
 
.nextrow
 
333
.nextrow:
341
334
%if %0 == 4
342
335
    movu     m2, [r1-4]
343
336
    movu     m3, [r1-2]
392
385
;-----------------------------------------------------------------------------
393
386
; void h264_qpel_mc02(uint8_t *dst, uint8_t *src, int stride)
394
387
;-----------------------------------------------------------------------------
395
 
%macro V_FILT 11
396
 
v_filt%9_%10_10_%11:
 
388
%macro V_FILT 10
 
389
v_filt%9_%10_10
397
390
    add    r4, r2
398
391
.no_addr4:
399
392
    FILT_V m0, m1, m2, m3, m4, m5, m6, m7
402
395
    ret
403
396
%endmacro
404
397
 
405
 
INIT_MMX
 
398
INIT_MMX mmxext
406
399
RESET_MM_PERMUTATION
407
400
%assign i 0
408
401
%rep 4
409
 
V_FILT m0, m1, m2, m3, m4, m5, m6, m7, 4, i, mmxext
 
402
V_FILT m0, m1, m2, m3, m4, m5, m6, m7, 4, i
410
403
SWAP 0,1,2,3,4,5
411
404
%assign i i+1
412
405
%endrep
413
406
 
414
 
INIT_XMM
 
407
INIT_XMM sse2
415
408
RESET_MM_PERMUTATION
416
409
%assign i 0
417
410
%rep 6
418
 
V_FILT m0, m1, m2, m3, m4, m5, m6, m7, 8, i, sse2
 
411
V_FILT m0, m1, m2, m3, m4, m5, m6, m7, 8, i
419
412
SWAP 0,1,2,3,4,5
420
413
%assign i i+1
421
414
%endrep
422
415
 
423
 
%macro MC02 3
424
 
cglobal_mc %1, %2, mc02, %3, 3,4,8
 
416
%macro MC02 2
 
417
cglobal_mc %1, mc02, %2, 3,4,8
425
418
    PRELOAD_V
426
419
 
427
420
    sub      r0, r2
428
421
%assign j 0
429
 
%rep %3
 
422
%rep %2
430
423
    %assign i (j % 6)
431
 
    call v_filt%3_ %+ i %+ _10_%1.no_addr4
 
424
    call v_filt%2_ %+ i %+ _10.no_addr4
432
425
    OP_MOV [r0], m0
433
426
    SWAP 0,1,2,3,4,5
434
427
    %assign j j+1
441
434
;-----------------------------------------------------------------------------
442
435
; void h264_qpel_mc01(uint8_t *dst, uint8_t *src, int stride)
443
436
;-----------------------------------------------------------------------------
444
 
%macro MC01 3
445
 
cglobal_mc %1, %2, mc01, %3, 3,5,8
 
437
%macro MC01 2
 
438
cglobal_mc %1, mc01, %2, 3,5,8
446
439
    mov      r4, r1
447
 
.body
 
440
.body:
448
441
    PRELOAD_V
449
442
 
450
443
    sub      r4, r2
451
444
    sub      r0, r2
452
445
%assign j 0
453
 
%rep %3
 
446
%rep %2
454
447
    %assign i (j % 6)
455
 
    call v_filt%3_ %+ i %+ _10_%1
 
448
    call v_filt%2_ %+ i %+ _10
456
449
    movu     m7, [r4]
457
450
    pavgw    m0, m7
458
451
    OP_MOV [r0], m0
467
460
;-----------------------------------------------------------------------------
468
461
; void h264_qpel_mc03(uint8_t *dst, uint8_t *src, int stride)
469
462
;-----------------------------------------------------------------------------
470
 
%macro MC03 3
471
 
cglobal_mc %1, %2, mc03, %3, 3,5,8
 
463
%macro MC03 2
 
464
cglobal_mc %1, mc03, %2, 3,5,8
472
465
    lea r4, [r1+r2]
473
 
    jmp stub_%2_h264_qpel%3_mc01_10_%1.body
 
466
    jmp stub_%1_h264_qpel%2_mc01_10 %+ SUFFIX %+ .body
474
467
%endmacro
475
468
 
476
469
MC MC03
478
471
;-----------------------------------------------------------------------------
479
472
; void h264_qpel_mc11(uint8_t *dst, uint8_t *src, int stride)
480
473
;-----------------------------------------------------------------------------
481
 
%macro H_FILT_AVG 3-4
482
 
h_filt%2_%3_10_%1:
 
474
%macro H_FILT_AVG 2-3
 
475
h_filt%1_%2_10:
483
476
;FILT_H with fewer registers and averaged with the FILT_V result
484
477
;m6,m7 are tmp registers, m0 is the FILT_V result, the rest are to be used next in the next iteration
485
478
;unfortunately I need three registers, so m5 will have to be re-read from memory
506
499
    ret
507
500
%endmacro
508
501
 
509
 
INIT_MMX
 
502
INIT_MMX mmxext
510
503
RESET_MM_PERMUTATION
511
504
%assign i 0
512
505
%rep 3
513
 
H_FILT_AVG mmxext, 4, i
 
506
H_FILT_AVG 4, i
514
507
SWAP 0,1,2,3,4,5
515
508
%assign i i+1
516
509
%endrep
517
 
H_FILT_AVG mmxext, 4, i, 0
 
510
H_FILT_AVG 4, i, 0
518
511
 
519
 
INIT_XMM
 
512
INIT_XMM sse2
520
513
RESET_MM_PERMUTATION
521
514
%assign i 0
522
515
%rep 6
523
516
%if i==1
524
 
H_FILT_AVG sse2,   8, i, 0
 
517
H_FILT_AVG 8, i, 0
525
518
%else
526
 
H_FILT_AVG sse2,   8, i
 
519
H_FILT_AVG 8, i
527
520
%endif
528
521
SWAP 0,1,2,3,4,5
529
522
%assign i i+1
530
523
%endrep
531
524
 
532
 
%macro MC11 3
 
525
%macro MC11 2
533
526
; this REALLY needs x86_64
534
 
cglobal_mc %1, %2, mc11, %3, 3,6,8
 
527
cglobal_mc %1, mc11, %2, 3,6,8
535
528
    mov      r4, r1
536
 
.body
 
529
.body:
537
530
    PRELOAD_V
538
531
 
539
532
    sub      r0, r2
541
534
    mov      r5, r2
542
535
    neg      r5
543
536
%assign j 0
544
 
%rep %3
 
537
%rep %2
545
538
    %assign i (j % 6)
546
 
    call v_filt%3_ %+ i %+ _10_%1
547
 
    call h_filt%3_ %+ i %+ _10_%1
548
 
%if %3==8 && i==1
 
539
    call v_filt%2_ %+ i %+ _10
 
540
    call h_filt%2_ %+ i %+ _10
 
541
%if %2==8 && i==1
549
542
    movu     m5, [r1+r5]
550
543
%endif
551
544
    OP_MOV [r0], m0
560
553
;-----------------------------------------------------------------------------
561
554
; void h264_qpel_mc31(uint8_t *dst, uint8_t *src, int stride)
562
555
;-----------------------------------------------------------------------------
563
 
%macro MC31 3
564
 
cglobal_mc %1, %2, mc31, %3, 3,6,8
 
556
%macro MC31 2
 
557
cglobal_mc %1, mc31, %2, 3,6,8
565
558
    mov r4, r1
566
559
    add r1, 2
567
 
    jmp stub_%2_h264_qpel%3_mc11_10_%1.body
 
560
    jmp stub_%1_h264_qpel%2_mc11_10 %+ SUFFIX %+ .body
568
561
%endmacro
569
562
 
570
563
MC MC31
572
565
;-----------------------------------------------------------------------------
573
566
; void h264_qpel_mc13(uint8_t *dst, uint8_t *src, int stride)
574
567
;-----------------------------------------------------------------------------
575
 
%macro MC13 3
576
 
cglobal_mc %1, %2, mc13, %3, 3,7,12
 
568
%macro MC13 2
 
569
cglobal_mc %1, mc13, %2, 3,7,12
577
570
    lea r4, [r1+r2]
578
 
    jmp stub_%2_h264_qpel%3_mc11_10_%1.body
 
571
    jmp stub_%1_h264_qpel%2_mc11_10 %+ SUFFIX %+ .body
579
572
%endmacro
580
573
 
581
574
MC MC13
583
576
;-----------------------------------------------------------------------------
584
577
; void h264_qpel_mc33(uint8_t *dst, uint8_t *src, int stride)
585
578
;-----------------------------------------------------------------------------
586
 
%macro MC33 3
587
 
cglobal_mc %1, %2, mc33, %3, 3,6,8
 
579
%macro MC33 2
 
580
cglobal_mc %1, mc33, %2, 3,6,8
588
581
    lea r4, [r1+r2]
589
582
    add r1, 2
590
 
    jmp stub_%2_h264_qpel%3_mc11_10_%1.body
 
583
    jmp stub_%1_h264_qpel%2_mc11_10 %+ SUFFIX %+ .body
591
584
%endmacro
592
585
 
593
586
MC MC33
614
607
    FILT_H2  %1, %7, %8
615
608
%endmacro
616
609
 
617
 
%macro HV 2
618
 
%ifidn %1,sse2
 
610
%macro HV 1
 
611
%if mmsize==16
619
612
%define PAD 12
620
613
%define COUNT 2
621
614
%else
622
615
%define PAD 4
623
616
%define COUNT 3
624
617
%endif
625
 
put_hv%2_10_%1:
 
618
put_hv%1_10:
626
619
    neg      r2           ; This actually saves instructions
627
620
    lea      r1, [r1+r2*2-mmsize+PAD]
628
621
    lea      r4, [rsp+PAD+gprsize]
639
632
    movu     m4, [r1]
640
633
    sub      r1, r2
641
634
%assign i 0
642
 
%rep %2-1
 
635
%rep %1-1
643
636
    FILT_VNRD m0, m1, m2, m3, m4, m5, m6, m7
644
637
    psubw    m0, [pad20]
645
638
    movu     [r4+i*mmsize*3], m0
652
645
    movu     [r4+i*mmsize*3], m0
653
646
    add      r4, mmsize
654
647
    lea      r1, [r1+r2*8+mmsize]
655
 
%if %2==8
 
648
%if %1==8
656
649
    lea      r1, [r1+r2*4]
657
650
%endif
658
651
    dec      r3d
661
654
    ret
662
655
%endmacro
663
656
 
664
 
INIT_MMX
665
 
HV mmxext, 4
666
 
INIT_XMM
667
 
HV sse2  , 8
 
657
INIT_MMX mmxext
 
658
HV 4
 
659
INIT_XMM sse2
 
660
HV 8
668
661
 
669
 
%macro H_LOOP 2
 
662
%macro H_LOOP 1
670
663
%if num_mmregs > 8
671
664
    %define s1 m8
672
665
    %define s2 m9
678
671
    %define s3 [tap3]
679
672
    %define d1 [depad]
680
673
%endif
681
 
h%2_loop_op_%1:
 
674
h%1_loop_op:
682
675
    movu       m1, [r1+mmsize-4]
683
676
    movu       m2, [r1+mmsize-2]
684
677
    mova       m3, [r1+mmsize+0]
725
718
    ret
726
719
%endmacro
727
720
 
728
 
INIT_MMX
729
 
H_LOOP mmxext, 4
730
 
INIT_XMM
731
 
H_LOOP sse2  , 8
 
721
INIT_MMX mmxext
 
722
H_LOOP 4
 
723
INIT_XMM sse2
 
724
H_LOOP 8
732
725
 
733
 
%macro MC22 3
734
 
cglobal_mc %1, %2, mc22, %3, 3,7,12
 
726
%macro MC22 2
 
727
cglobal_mc %1, mc22, %2, 3,7,12
735
728
%define PAD mmsize*8*4*2      ; SIZE*16*4*sizeof(pixel)
736
729
    mov      r6, rsp          ; backup stack pointer
737
730
    and     rsp, ~(mmsize-1)  ; align stack
738
731
    sub     rsp, PAD
739
732
 
740
 
    call put_hv%3_10_%1
 
733
    call put_hv%2_10
741
734
 
742
 
    mov       r3d, %3
 
735
    mov       r3d, %2
743
736
    mova       m7, [pw_pixel_max]
744
737
%if num_mmregs > 8
745
738
    pxor       m0, m0
750
743
%endif
751
744
    mov        r1, rsp
752
745
.h_loop:
753
 
    call h%3_loop_op_%1
 
746
    call h%2_loop_op
754
747
 
755
748
    OP_MOV   [r0], m1
756
749
    add        r0, r2
766
759
;-----------------------------------------------------------------------------
767
760
; void h264_qpel_mc12(uint8_t *dst, uint8_t *src, int stride)
768
761
;-----------------------------------------------------------------------------
769
 
%macro MC12 3
770
 
cglobal_mc %1, %2, mc12, %3, 3,7,12
 
762
%macro MC12 2
 
763
cglobal_mc %1, mc12, %2, 3,7,12
771
764
%define PAD mmsize*8*4*2        ; SIZE*16*4*sizeof(pixel)
772
765
    mov        r6, rsp          ; backup stack pointer
773
766
    and       rsp, ~(mmsize-1)  ; align stack
774
767
    sub       rsp, PAD
775
768
 
776
 
    call put_hv%3_10_%1
 
769
    call put_hv%2_10
777
770
 
778
771
    xor       r4d, r4d
779
 
.body
780
 
    mov       r3d, %3
 
772
.body:
 
773
    mov       r3d, %2
781
774
    pxor       m0, m0
782
775
    mova       m7, [pw_pixel_max]
783
776
%if num_mmregs > 8
788
781
%endif
789
782
    mov        r1, rsp
790
783
.h_loop:
791
 
    call h%3_loop_op_%1
 
784
    call h%2_loop_op
792
785
 
793
786
    movu       m3, [r1+r4-2*mmsize] ; movu needed for mc32, etc
794
787
    paddw      m3, [depad2]
811
804
;-----------------------------------------------------------------------------
812
805
; void h264_qpel_mc32(uint8_t *dst, uint8_t *src, int stride)
813
806
;-----------------------------------------------------------------------------
814
 
%macro MC32 3
815
 
cglobal_mc %1, %2, mc32, %3, 3,7,12
 
807
%macro MC32 2
 
808
cglobal_mc %1, mc32, %2, 3,7,12
816
809
%define PAD mmsize*8*3*2  ; SIZE*16*4*sizeof(pixel)
817
810
    mov  r6, rsp          ; backup stack pointer
818
811
    and rsp, ~(mmsize-1)  ; align stack
819
812
    sub rsp, PAD
820
813
 
821
 
    call put_hv%3_10_%1
 
814
    call put_hv%2_10
822
815
 
823
816
    mov r4d, 2            ; sizeof(pixel)
824
 
    jmp stub_%2_h264_qpel%3_mc12_10_%1.body
 
817
    jmp stub_%1_h264_qpel%2_mc12_10 %+ SUFFIX %+ .body
825
818
%endmacro
826
819
 
827
820
MC MC32
829
822
;-----------------------------------------------------------------------------
830
823
; void h264_qpel_mc21(uint8_t *dst, uint8_t *src, int stride)
831
824
;-----------------------------------------------------------------------------
832
 
%macro H_NRD 2
833
 
put_h%2_10_%1:
 
825
%macro H_NRD 1
 
826
put_h%1_10:
834
827
    add       rsp, gprsize
835
 
    mov       r3d, %2
 
828
    mov       r3d, %1
836
829
    xor       r4d, r4d
837
830
    mova       m6, [pad20]
838
 
.nextrow
 
831
.nextrow:
839
832
    movu       m2, [r5-4]
840
833
    movu       m3, [r5-2]
841
834
    movu       m4, [r5+0]
854
847
    ret
855
848
%endmacro
856
849
 
857
 
INIT_MMX
858
 
H_NRD mmxext, 4
859
 
INIT_XMM
860
 
H_NRD sse2  , 8
 
850
INIT_MMX mmxext
 
851
H_NRD 4
 
852
INIT_XMM sse2
 
853
H_NRD 8
861
854
 
862
 
%macro MC21 3
863
 
cglobal_mc %1, %2, mc21, %3, 3,7,12
 
855
%macro MC21 2
 
856
cglobal_mc %1, mc21, %2, 3,7,12
864
857
    mov   r5, r1
865
 
.body
 
858
.body:
866
859
%define PAD mmsize*8*3*2   ; SIZE*16*4*sizeof(pixel)
867
860
    mov   r6, rsp          ; backup stack pointer
868
861
    and  rsp, ~(mmsize-1)  ; align stack
869
862
 
870
863
    sub  rsp, PAD
871
 
    call put_h%3_10_%1
 
864
    call put_h%2_10
872
865
 
873
866
    sub  rsp, PAD
874
 
    call put_hv%3_10_%1
 
867
    call put_hv%2_10
875
868
 
876
869
    mov r4d, PAD-mmsize    ; H buffer
877
 
    jmp stub_%2_h264_qpel%3_mc12_10_%1.body
 
870
    jmp stub_%1_h264_qpel%2_mc12_10 %+ SUFFIX %+ .body
878
871
%endmacro
879
872
 
880
873
MC MC21
882
875
;-----------------------------------------------------------------------------
883
876
; void h264_qpel_mc23(uint8_t *dst, uint8_t *src, int stride)
884
877
;-----------------------------------------------------------------------------
885
 
%macro MC23 3
886
 
cglobal_mc %1, %2, mc23, %3, 3,7,12
 
878
%macro MC23 2
 
879
cglobal_mc %1, mc23, %2, 3,7,12
887
880
    lea   r5, [r1+r2]
888
 
    jmp stub_%2_h264_qpel%3_mc21_10_%1.body
 
881
    jmp stub_%1_h264_qpel%2_mc21_10 %+ SUFFIX %+ .body
889
882
%endmacro
890
883
 
891
884
MC MC23