~siretart/libav/trusty-security

« back to all changes in this revision

Viewing changes to libavcodec/x86/h264_idct.asm

  • Committer: Package Import Robot
  • Author(s): Reinhard Tartler
  • Date: 2013-10-22 23:24:08 UTC
  • mfrom: (1.3.36 sid)
  • Revision ID: package-import@ubuntu.com-20131022232408-b8tvvn4pyzri9mi3
Tags: 6:9.10-1ubuntu1
* Build all -extra flavors from this source package, as libav got demoted
  from main to universe, cf LP: #1243235
* Simplify debian/rules to follow exactly the code that debian executes
* New upstream (LP: #1180288) fixes lots of security issues (LP: #1242802)
* Merge from unstable, remaining changes:
  - build-depend on libtiff5-dev rather than libtiff4-dev,
    avoids FTBFS caused by imlib
  - follow the regular debian codepaths

Show diffs side-by-side

added added

removed removed

Lines of Context:
26
26
;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
27
27
;*****************************************************************************
28
28
 
29
 
%include "x86inc.asm"
30
 
%include "x86util.asm"
 
29
%include "libavutil/x86/x86util.asm"
31
30
 
32
31
SECTION_RODATA
33
32
 
45
44
           db  4+13*8, 5+13*8, 4+14*8, 5+14*8
46
45
           db  6+13*8, 7+13*8, 6+14*8, 7+14*8
47
46
%ifdef PIC
48
 
%define scan8 r11
 
47
%define npicregs 1
 
48
%define scan8 picregq
49
49
%else
 
50
%define npicregs 0
50
51
%define scan8 scan8_mem
51
52
%endif
52
53
 
75
76
    STORE_DIFFx2 m2, m3, m4, m5, m7, 6, %1, %3
76
77
%endmacro
77
78
 
78
 
INIT_MMX
 
79
INIT_MMX mmx
79
80
; ff_h264_idct_add_mmx(uint8_t *dst, int16_t *block, int stride)
80
 
cglobal h264_idct_add_8_mmx, 3, 3, 0
 
81
cglobal h264_idct_add_8, 3, 3, 0
81
82
    IDCT4_ADD    r0, r1, r2
82
83
    RET
83
84
 
179
180
    STORE_DIFFx2 m1, m2, m5, m6, m7, 6, %1, %3
180
181
%endmacro
181
182
 
182
 
INIT_MMX
 
183
INIT_MMX mmx
183
184
; ff_h264_idct8_add_mmx(uint8_t *dst, int16_t *block, int stride)
184
 
cglobal h264_idct8_add_8_mmx, 3, 4, 0
 
185
cglobal h264_idct8_add_8, 3, 4, 0
185
186
    %assign pad 128+4-(stack_offset&7)
186
187
    SUB         rsp, pad
187
188
 
198
199
; %1=uint8_t *dst, %2=int16_t *block, %3=int stride
199
200
%macro IDCT8_ADD_SSE 4
200
201
    IDCT8_1D_FULL %2
201
 
%ifdef ARCH_X86_64
 
202
%if ARCH_X86_64
202
203
    TRANSPOSE8x8W 0, 1, 2, 3, 4, 5, 6, 7, 8
203
204
%else
204
205
    TRANSPOSE8x8W 0, 1, 2, 3, 4, 5, 6, 7, [%2], [%2+16]
205
206
%endif
206
207
    paddw        m0, [pw_32]
207
208
 
208
 
%ifndef ARCH_X86_64
 
209
%if ARCH_X86_64 == 0
209
210
    mova    [%2   ], m0
210
211
    mova    [%2+16], m4
211
212
    IDCT8_1D   [%2], [%2+ 16]
225
226
    STORE_DIFF   m1, m6, m7, [%1+%3  ]
226
227
    STORE_DIFF   m2, m6, m7, [%1+%3*2]
227
228
    STORE_DIFF   m3, m6, m7, [%1+%4  ]
228
 
%ifndef ARCH_X86_64
 
229
%if ARCH_X86_64 == 0
229
230
    mova         m0, [%2   ]
230
231
    mova         m1, [%2+16]
231
232
%else
239
240
    STORE_DIFF   m1, m6, m7, [%1+%4  ]
240
241
%endmacro
241
242
 
242
 
INIT_XMM
 
243
INIT_XMM sse2
243
244
; ff_h264_idct8_add_sse2(uint8_t *dst, int16_t *block, int stride)
244
 
cglobal h264_idct8_add_8_sse2, 3, 4, 10
 
245
cglobal h264_idct8_add_8, 3, 4, 10
245
246
    IDCT8_ADD_SSE r0, r1, r2, r3
246
247
    RET
247
248
 
248
 
%macro DC_ADD_MMX2_INIT 2-3
 
249
%macro DC_ADD_MMXEXT_INIT 2-3
249
250
%if %0 == 2
250
251
    movsx        %1, word [%1]
251
252
    add          %1, 32
265
266
    packuswb     m1, m1
266
267
%endmacro
267
268
 
268
 
%macro DC_ADD_MMX2_OP 4
 
269
%macro DC_ADD_MMXEXT_OP 4
269
270
    %1           m2, [%2     ]
270
271
    %1           m3, [%2+%3  ]
271
272
    %1           m4, [%2+%3*2]
284
285
    %1    [%2+%4  ], m5
285
286
%endmacro
286
287
 
287
 
INIT_MMX
288
 
; ff_h264_idct_dc_add_mmx2(uint8_t *dst, int16_t *block, int stride)
289
 
cglobal h264_idct_dc_add_8_mmx2, 3, 3, 0
290
 
    DC_ADD_MMX2_INIT r1, r2
291
 
    DC_ADD_MMX2_OP movh, r0, r2, r1
 
288
INIT_MMX mmxext
 
289
; ff_h264_idct_dc_add_mmxext(uint8_t *dst, int16_t *block, int stride)
 
290
cglobal h264_idct_dc_add_8, 3, 3, 0
 
291
    DC_ADD_MMXEXT_INIT r1, r2
 
292
    DC_ADD_MMXEXT_OP movh, r0, r2, r1
292
293
    RET
293
294
 
294
 
; ff_h264_idct8_dc_add_mmx2(uint8_t *dst, int16_t *block, int stride)
295
 
cglobal h264_idct8_dc_add_8_mmx2, 3, 3, 0
296
 
    DC_ADD_MMX2_INIT r1, r2
297
 
    DC_ADD_MMX2_OP mova, r0, r2, r1
 
295
; ff_h264_idct8_dc_add_mmxext(uint8_t *dst, int16_t *block, int stride)
 
296
cglobal h264_idct8_dc_add_8, 3, 3, 0
 
297
    DC_ADD_MMXEXT_INIT r1, r2
 
298
    DC_ADD_MMXEXT_OP mova, r0, r2, r1
298
299
    lea          r0, [r0+r2*4]
299
 
    DC_ADD_MMX2_OP mova, r0, r2, r1
 
300
    DC_ADD_MMXEXT_OP mova, r0, r2, r1
300
301
    RET
301
302
 
 
303
INIT_MMX mmx
302
304
; ff_h264_idct_add16_mmx(uint8_t *dst, const int *block_offset,
303
305
;             DCTELEM *block, int stride, const uint8_t nnzc[6*8])
304
 
cglobal h264_idct_add16_8_mmx, 5, 7, 0
 
306
cglobal h264_idct_add16_8, 5, 7 + npicregs, 0, dst, block_offset, block, stride, nnzc, cntr, coeff, picreg
305
307
    xor          r5, r5
306
308
%ifdef PIC
307
 
    lea         r11, [scan8_mem]
 
309
    lea     picregq, [scan8_mem]
308
310
%endif
309
 
.nextblock
 
311
.nextblock:
310
312
    movzx        r6, byte [scan8+r5]
311
313
    movzx        r6, byte [r4+r6]
312
314
    test         r6, r6
314
316
    mov         r6d, dword [r1+r5*4]
315
317
    lea          r6, [r0+r6]
316
318
    IDCT4_ADD    r6, r2, r3
317
 
.skipblock
 
319
.skipblock:
318
320
    inc          r5
319
321
    add          r2, 32
320
322
    cmp          r5, 16
323
325
 
324
326
; ff_h264_idct8_add4_mmx(uint8_t *dst, const int *block_offset,
325
327
;                        DCTELEM *block, int stride, const uint8_t nnzc[6*8])
326
 
cglobal h264_idct8_add4_8_mmx, 5, 7, 0
 
328
cglobal h264_idct8_add4_8, 5, 7 + npicregs, 0, dst, block_offset, block, stride, nnzc, cntr, coeff, picreg
327
329
    %assign pad 128+4-(stack_offset&7)
328
330
    SUB         rsp, pad
329
331
 
330
332
    xor          r5, r5
331
333
%ifdef PIC
332
 
    lea         r11, [scan8_mem]
 
334
    lea     picregq, [scan8_mem]
333
335
%endif
334
 
.nextblock
 
336
.nextblock:
335
337
    movzx        r6, byte [scan8+r5]
336
338
    movzx        r6, byte [r4+r6]
337
339
    test         r6, r6
345
347
    mov         r6d, dword [r1+r5*4]
346
348
    lea          r6, [r0+r6+4]
347
349
    IDCT8_ADD_MMX_END   r6  , rsp+8, r3
348
 
.skipblock
 
350
.skipblock:
349
351
    add          r5, 4
350
352
    add          r2, 128
351
353
    cmp          r5, 16
353
355
    ADD         rsp, pad
354
356
    RET
355
357
 
356
 
; ff_h264_idct_add16_mmx2(uint8_t *dst, const int *block_offset,
357
 
;                         DCTELEM *block, int stride, const uint8_t nnzc[6*8])
358
 
cglobal h264_idct_add16_8_mmx2, 5, 7, 0
 
358
INIT_MMX mmxext
 
359
; ff_h264_idct_add16_mmxext(uint8_t *dst, const int *block_offset,
 
360
;                           DCTELEM *block, int stride, const uint8_t nnzc[6*8])
 
361
cglobal h264_idct_add16_8, 5, 8 + npicregs, 0, dst1, block_offset, block, stride, nnzc, cntr, coeff, dst2, picreg
359
362
    xor          r5, r5
360
363
%ifdef PIC
361
 
    lea         r11, [scan8_mem]
 
364
    lea     picregq, [scan8_mem]
362
365
%endif
363
 
.nextblock
 
366
.nextblock:
364
367
    movzx        r6, byte [scan8+r5]
365
368
    movzx        r6, byte [r4+r6]
366
369
    test         r6, r6
370
373
    movsx        r6, word [r2]
371
374
    test         r6, r6
372
375
    jz .no_dc
373
 
    DC_ADD_MMX2_INIT r2, r3, r6
374
 
%ifdef ARCH_X86_64
375
 
%define dst_reg  r10
376
 
%define dst_regd r10d
377
 
%else
378
 
%define dst_reg  r1
379
 
%define dst_regd r1d
 
376
    DC_ADD_MMXEXT_INIT r2, r3, r6
 
377
%if ARCH_X86_64 == 0
 
378
%define dst2q r1
 
379
%define dst2d r1d
380
380
%endif
381
 
    mov    dst_regd, dword [r1+r5*4]
382
 
    lea     dst_reg, [r0+dst_reg]
383
 
    DC_ADD_MMX2_OP movh, dst_reg, r3, r6
384
 
%ifndef ARCH_X86_64
 
381
    mov       dst2d, dword [r1+r5*4]
 
382
    lea       dst2q, [r0+dst2q]
 
383
    DC_ADD_MMXEXT_OP movh, dst2q, r3, r6
 
384
%if ARCH_X86_64 == 0
385
385
    mov          r1, r1m
386
386
%endif
387
387
    inc          r5
389
389
    cmp          r5, 16
390
390
    jl .nextblock
391
391
    REP_RET
392
 
.no_dc
 
392
.no_dc:
393
393
    mov         r6d, dword [r1+r5*4]
394
394
    add          r6, r0
395
395
    IDCT4_ADD    r6, r2, r3
396
 
.skipblock
 
396
.skipblock:
397
397
    inc          r5
398
398
    add          r2, 32
399
399
    cmp          r5, 16
400
400
    jl .nextblock
401
401
    REP_RET
402
402
 
 
403
INIT_MMX mmx
403
404
; ff_h264_idct_add16intra_mmx(uint8_t *dst, const int *block_offset,
404
405
;                             DCTELEM *block, int stride, const uint8_t nnzc[6*8])
405
 
cglobal h264_idct_add16intra_8_mmx, 5, 7, 0
 
406
cglobal h264_idct_add16intra_8, 5, 7 + npicregs, 0, dst, block_offset, block, stride, nnzc, cntr, coeff, picreg
406
407
    xor          r5, r5
407
408
%ifdef PIC
408
 
    lea         r11, [scan8_mem]
 
409
    lea     picregq, [scan8_mem]
409
410
%endif
410
 
.nextblock
 
411
.nextblock:
411
412
    movzx        r6, byte [scan8+r5]
412
413
    movzx        r6, byte [r4+r6]
413
414
    or          r6w, word [r2]
416
417
    mov         r6d, dword [r1+r5*4]
417
418
    add          r6, r0
418
419
    IDCT4_ADD    r6, r2, r3
419
 
.skipblock
 
420
.skipblock:
420
421
    inc          r5
421
422
    add          r2, 32
422
423
    cmp          r5, 16
423
424
    jl .nextblock
424
425
    REP_RET
425
426
 
426
 
; ff_h264_idct_add16intra_mmx2(uint8_t *dst, const int *block_offset,
427
 
;                              DCTELEM *block, int stride, const uint8_t nnzc[6*8])
428
 
cglobal h264_idct_add16intra_8_mmx2, 5, 7, 0
 
427
INIT_MMX mmxext
 
428
; ff_h264_idct_add16intra_mmxext(uint8_t *dst, const int *block_offset,
 
429
;                                DCTELEM *block, int stride,
 
430
;                                const uint8_t nnzc[6*8])
 
431
cglobal h264_idct_add16intra_8, 5, 8 + npicregs, 0, dst1, block_offset, block, stride, nnzc, cntr, coeff, dst2, picreg
429
432
    xor          r5, r5
430
433
%ifdef PIC
431
 
    lea         r11, [scan8_mem]
 
434
    lea     picregq, [scan8_mem]
432
435
%endif
433
 
.nextblock
 
436
.nextblock:
434
437
    movzx        r6, byte [scan8+r5]
435
438
    movzx        r6, byte [r4+r6]
436
439
    test         r6, r6
443
446
    cmp          r5, 16
444
447
    jl .nextblock
445
448
    REP_RET
446
 
.try_dc
 
449
.try_dc:
447
450
    movsx        r6, word [r2]
448
451
    test         r6, r6
449
452
    jz .skipblock
450
 
    DC_ADD_MMX2_INIT r2, r3, r6
451
 
%ifdef ARCH_X86_64
452
 
%define dst_reg  r10
453
 
%define dst_regd r10d
454
 
%else
455
 
%define dst_reg  r1
456
 
%define dst_regd r1d
 
453
    DC_ADD_MMXEXT_INIT r2, r3, r6
 
454
%if ARCH_X86_64 == 0
 
455
%define dst2q r1
 
456
%define dst2d r1d
457
457
%endif
458
 
    mov    dst_regd, dword [r1+r5*4]
459
 
    add     dst_reg, r0
460
 
    DC_ADD_MMX2_OP movh, dst_reg, r3, r6
461
 
%ifndef ARCH_X86_64
 
458
    mov       dst2d, dword [r1+r5*4]
 
459
    add       dst2q, r0
 
460
    DC_ADD_MMXEXT_OP movh, dst2q, r3, r6
 
461
%if ARCH_X86_64 == 0
462
462
    mov          r1, r1m
463
463
%endif
464
 
.skipblock
 
464
.skipblock:
465
465
    inc          r5
466
466
    add          r2, 32
467
467
    cmp          r5, 16
468
468
    jl .nextblock
469
469
    REP_RET
470
470
 
471
 
; ff_h264_idct8_add4_mmx2(uint8_t *dst, const int *block_offset,
472
 
;                         DCTELEM *block, int stride, const uint8_t nnzc[6*8])
473
 
cglobal h264_idct8_add4_8_mmx2, 5, 7, 0
 
471
; ff_h264_idct8_add4_mmxext(uint8_t *dst, const int *block_offset,
 
472
;                           DCTELEM *block, int stride,
 
473
;                           const uint8_t nnzc[6*8])
 
474
cglobal h264_idct8_add4_8, 5, 8 + npicregs, 0, dst1, block_offset, block, stride, nnzc, cntr, coeff, dst2, picreg
474
475
    %assign pad 128+4-(stack_offset&7)
475
476
    SUB         rsp, pad
476
477
 
477
478
    xor          r5, r5
478
479
%ifdef PIC
479
 
    lea         r11, [scan8_mem]
 
480
    lea     picregq, [scan8_mem]
480
481
%endif
481
 
.nextblock
 
482
.nextblock:
482
483
    movzx        r6, byte [scan8+r5]
483
484
    movzx        r6, byte [r4+r6]
484
485
    test         r6, r6
488
489
    movsx        r6, word [r2]
489
490
    test         r6, r6
490
491
    jz .no_dc
491
 
    DC_ADD_MMX2_INIT r2, r3, r6
492
 
%ifdef ARCH_X86_64
493
 
%define dst_reg  r10
494
 
%define dst_regd r10d
495
 
%else
496
 
%define dst_reg  r1
497
 
%define dst_regd r1d
 
492
    DC_ADD_MMXEXT_INIT r2, r3, r6
 
493
%if ARCH_X86_64 == 0
 
494
%define dst2q r1
 
495
%define dst2d r1d
498
496
%endif
499
 
    mov    dst_regd, dword [r1+r5*4]
500
 
    lea     dst_reg, [r0+dst_reg]
501
 
    DC_ADD_MMX2_OP mova, dst_reg, r3, r6
502
 
    lea     dst_reg, [dst_reg+r3*4]
503
 
    DC_ADD_MMX2_OP mova, dst_reg, r3, r6
504
 
%ifndef ARCH_X86_64
 
497
    mov       dst2d, dword [r1+r5*4]
 
498
    lea       dst2q, [r0+dst2q]
 
499
    DC_ADD_MMXEXT_OP mova, dst2q, r3, r6
 
500
    lea       dst2q, [dst2q+r3*4]
 
501
    DC_ADD_MMXEXT_OP mova, dst2q, r3, r6
 
502
%if ARCH_X86_64 == 0
505
503
    mov          r1, r1m
506
504
%endif
507
505
    add          r5, 4
511
509
 
512
510
    ADD         rsp, pad
513
511
    RET
514
 
.no_dc
 
512
.no_dc:
515
513
    mov         r6d, dword [r1+r5*4]
516
514
    add          r6, r0
517
515
    add   word [r2], 32
521
519
    mov         r6d, dword [r1+r5*4]
522
520
    lea          r6, [r0+r6+4]
523
521
    IDCT8_ADD_MMX_END   r6  , rsp+8, r3
524
 
.skipblock
 
522
.skipblock:
525
523
    add          r5, 4
526
524
    add          r2, 128
527
525
    cmp          r5, 16
530
528
    ADD         rsp, pad
531
529
    RET
532
530
 
533
 
INIT_XMM
 
531
INIT_XMM sse2
534
532
; ff_h264_idct8_add4_sse2(uint8_t *dst, const int *block_offset,
535
533
;                         DCTELEM *block, int stride, const uint8_t nnzc[6*8])
536
 
cglobal h264_idct8_add4_8_sse2, 5, 7, 10
 
534
cglobal h264_idct8_add4_8, 5, 8 + npicregs, 10, dst1, block_offset, block, stride, nnzc, cntr, coeff, dst2, picreg
537
535
    xor          r5, r5
538
536
%ifdef PIC
539
 
    lea         r11, [scan8_mem]
 
537
    lea     picregq, [scan8_mem]
540
538
%endif
541
 
.nextblock
 
539
.nextblock:
542
540
    movzx        r6, byte [scan8+r5]
543
541
    movzx        r6, byte [r4+r6]
544
542
    test         r6, r6
548
546
    movsx        r6, word [r2]
549
547
    test         r6, r6
550
548
    jz .no_dc
551
 
INIT_MMX
552
 
    DC_ADD_MMX2_INIT r2, r3, r6
553
 
%ifdef ARCH_X86_64
554
 
%define dst_reg  r10
555
 
%define dst_regd r10d
556
 
%else
557
 
%define dst_reg  r1
558
 
%define dst_regd r1d
 
549
INIT_MMX cpuname
 
550
    DC_ADD_MMXEXT_INIT r2, r3, r6
 
551
%if ARCH_X86_64 == 0
 
552
%define dst2q r1
 
553
%define dst2d r1d
559
554
%endif
560
 
    mov    dst_regd, dword [r1+r5*4]
561
 
    add     dst_reg, r0
562
 
    DC_ADD_MMX2_OP mova, dst_reg, r3, r6
563
 
    lea     dst_reg, [dst_reg+r3*4]
564
 
    DC_ADD_MMX2_OP mova, dst_reg, r3, r6
565
 
%ifndef ARCH_X86_64
 
555
    mov       dst2d, dword [r1+r5*4]
 
556
    add       dst2q, r0
 
557
    DC_ADD_MMXEXT_OP mova, dst2q, r3, r6
 
558
    lea       dst2q, [dst2q+r3*4]
 
559
    DC_ADD_MMXEXT_OP mova, dst2q, r3, r6
 
560
%if ARCH_X86_64 == 0
566
561
    mov          r1, r1m
567
562
%endif
568
563
    add          r5, 4
570
565
    cmp          r5, 16
571
566
    jl .nextblock
572
567
    REP_RET
573
 
.no_dc
574
 
INIT_XMM
575
 
    mov    dst_regd, dword [r1+r5*4]
576
 
    add     dst_reg, r0
577
 
    IDCT8_ADD_SSE dst_reg, r2, r3, r6
578
 
%ifndef ARCH_X86_64
 
568
.no_dc:
 
569
INIT_XMM cpuname
 
570
    mov       dst2d, dword [r1+r5*4]
 
571
    add       dst2q, r0
 
572
    IDCT8_ADD_SSE dst2q, r2, r3, r6
 
573
%if ARCH_X86_64 == 0
579
574
    mov          r1, r1m
580
575
%endif
581
 
.skipblock
 
576
.skipblock:
582
577
    add          r5, 4
583
578
    add          r2, 128
584
579
    cmp          r5, 16
585
580
    jl .nextblock
586
581
    REP_RET
587
582
 
588
 
INIT_MMX
 
583
INIT_MMX mmx
589
584
h264_idct_add8_mmx_plane:
590
 
.nextblock
 
585
.nextblock:
591
586
    movzx        r6, byte [scan8+r5]
592
587
    movzx        r6, byte [r4+r6]
593
588
    or          r6w, word [r2]
594
589
    test         r6, r6
595
590
    jz .skipblock
596
 
%ifdef ARCH_X86_64
 
591
%if ARCH_X86_64
597
592
    mov         r0d, dword [r1+r5*4]
598
 
    add          r0, [r10]
 
593
    add          r0, [dst2q]
599
594
%else
600
595
    mov          r0, r1m ; XXX r1m here is actually r0m of the calling func
601
596
    mov          r0, [r0]
602
597
    add          r0, dword [r1+r5*4]
603
598
%endif
604
599
    IDCT4_ADD    r0, r2, r3
605
 
.skipblock
 
600
.skipblock:
606
601
    inc          r5
607
602
    add          r2, 32
608
603
    test         r5, 3
611
606
 
612
607
; ff_h264_idct_add8_mmx(uint8_t **dest, const int *block_offset,
613
608
;                       DCTELEM *block, int stride, const uint8_t nnzc[6*8])
614
 
cglobal h264_idct_add8_8_mmx, 5, 7, 0
 
609
cglobal h264_idct_add8_8, 5, 8 + npicregs, 0, dst1, block_offset, block, stride, nnzc, cntr, coeff, dst2, picreg
615
610
    mov          r5, 16
616
611
    add          r2, 512
617
612
%ifdef PIC
618
 
    lea         r11, [scan8_mem]
 
613
    lea     picregq, [scan8_mem]
619
614
%endif
620
 
%ifdef ARCH_X86_64
621
 
    mov         r10, r0
 
615
%if ARCH_X86_64
 
616
    mov       dst2q, r0
622
617
%endif
623
618
    call         h264_idct_add8_mmx_plane
624
619
    mov          r5, 32
625
620
    add          r2, 384
626
 
%ifdef ARCH_X86_64
627
 
    add         r10, gprsize
 
621
%if ARCH_X86_64
 
622
    add       dst2q, gprsize
628
623
%else
629
624
    add        r0mp, gprsize
630
625
%endif
631
626
    call         h264_idct_add8_mmx_plane
632
627
    RET
633
628
 
634
 
h264_idct_add8_mmx2_plane
635
 
.nextblock
 
629
h264_idct_add8_mmxext_plane:
 
630
.nextblock:
636
631
    movzx        r6, byte [scan8+r5]
637
632
    movzx        r6, byte [r4+r6]
638
633
    test         r6, r6
639
634
    jz .try_dc
640
 
%ifdef ARCH_X86_64
 
635
%if ARCH_X86_64
641
636
    mov         r0d, dword [r1+r5*4]
642
 
    add          r0, [r10]
 
637
    add          r0, [dst2q]
643
638
%else
644
639
    mov          r0, r1m ; XXX r1m here is actually r0m of the calling func
645
640
    mov          r0, [r0]
651
646
    test         r5, 3
652
647
    jnz .nextblock
653
648
    rep ret
654
 
.try_dc
 
649
.try_dc:
655
650
    movsx        r6, word [r2]
656
651
    test         r6, r6
657
652
    jz .skipblock
658
 
    DC_ADD_MMX2_INIT r2, r3, r6
659
 
%ifdef ARCH_X86_64
 
653
    DC_ADD_MMXEXT_INIT r2, r3, r6
 
654
%if ARCH_X86_64
660
655
    mov         r0d, dword [r1+r5*4]
661
 
    add          r0, [r10]
 
656
    add          r0, [dst2q]
662
657
%else
663
658
    mov          r0, r1m ; XXX r1m here is actually r0m of the calling func
664
659
    mov          r0, [r0]
665
660
    add          r0, dword [r1+r5*4]
666
661
%endif
667
 
    DC_ADD_MMX2_OP movh, r0, r3, r6
668
 
.skipblock
 
662
    DC_ADD_MMXEXT_OP movh, r0, r3, r6
 
663
.skipblock:
669
664
    inc          r5
670
665
    add          r2, 32
671
666
    test         r5, 3
672
667
    jnz .nextblock
673
668
    rep ret
674
669
 
675
 
; ff_h264_idct_add8_mmx2(uint8_t **dest, const int *block_offset,
676
 
;                        DCTELEM *block, int stride, const uint8_t nnzc[6*8])
677
 
cglobal h264_idct_add8_8_mmx2, 5, 7, 0
 
670
INIT_MMX mmxext
 
671
; ff_h264_idct_add8_mmxext(uint8_t **dest, const int *block_offset,
 
672
;                          DCTELEM *block, int stride, const uint8_t nnzc[6*8])
 
673
cglobal h264_idct_add8_8, 5, 8 + npicregs, 0, dst1, block_offset, block, stride, nnzc, cntr, coeff, dst2, picreg
678
674
    mov          r5, 16
679
675
    add          r2, 512
680
 
%ifdef ARCH_X86_64
681
 
    mov         r10, r0
 
676
%if ARCH_X86_64
 
677
    mov       dst2q, r0
682
678
%endif
683
679
%ifdef PIC
684
 
    lea         r11, [scan8_mem]
 
680
    lea     picregq, [scan8_mem]
685
681
%endif
686
 
    call h264_idct_add8_mmx2_plane
 
682
    call h264_idct_add8_mmxext_plane
687
683
    mov          r5, 32
688
684
    add          r2, 384
689
 
%ifdef ARCH_X86_64
690
 
    add         r10, gprsize
 
685
%if ARCH_X86_64
 
686
    add       dst2q, gprsize
691
687
%else
692
688
    add        r0mp, gprsize
693
689
%endif
694
 
    call h264_idct_add8_mmx2_plane
 
690
    call h264_idct_add8_mmxext_plane
695
691
    RET
696
692
 
697
 
INIT_MMX
698
693
; r0 = uint8_t *dst, r2 = int16_t *block, r3 = int stride, r6=clobbered
699
 
h264_idct_dc_add8_mmx2:
 
694
h264_idct_dc_add8_mmxext:
700
695
    movd         m0, [r2   ]          ;  0 0 X D
701
696
    punpcklwd    m0, [r2+32]          ;  x X d D
702
697
    paddsw       m0, [pw_32]
708
703
    pshufw       m1, m0, 0xFA         ; -d-d-d-d-D-D-D-D
709
704
    punpcklwd    m0, m0               ;  d d d d D D D D
710
705
    lea          r6, [r3*3]
711
 
    DC_ADD_MMX2_OP movq, r0, r3, r6
 
706
    DC_ADD_MMXEXT_OP movq, r0, r3, r6
712
707
    ret
713
708
 
714
709
ALIGN 16
715
 
INIT_XMM
 
710
INIT_XMM sse2
716
711
; r0 = uint8_t *dst (clobbered), r2 = int16_t *block, r3 = int stride
717
 
x264_add8x4_idct_sse2:
 
712
h264_add8x4_idct_sse2:
718
713
    movq   m0, [r2+ 0]
719
714
    movq   m1, [r2+ 8]
720
715
    movq   m2, [r2+16]
738
733
    test        r0, r0
739
734
    jz .cycle%1end
740
735
    mov        r0d, dword [r1+%1*8]
741
 
%ifdef ARCH_X86_64
742
 
    add         r0, r10
 
736
%if ARCH_X86_64
 
737
    add         r0, r5
743
738
%else
744
739
    add         r0, r0m
745
740
%endif
746
 
    call        x264_add8x4_idct_sse2
747
 
.cycle%1end
 
741
    call        h264_add8x4_idct_sse2
 
742
.cycle%1end:
748
743
%if %1 < 7
749
744
    add         r2, 64
750
745
%endif
752
747
 
753
748
; ff_h264_idct_add16_sse2(uint8_t *dst, const int *block_offset,
754
749
;                         DCTELEM *block, int stride, const uint8_t nnzc[6*8])
755
 
cglobal h264_idct_add16_8_sse2, 5, 5, 8
756
 
%ifdef ARCH_X86_64
757
 
    mov        r10, r0
 
750
cglobal h264_idct_add16_8, 5, 5 + ARCH_X86_64, 8
 
751
%if ARCH_X86_64
 
752
    mov         r5, r0
758
753
%endif
759
754
    ; unrolling of the loop leads to an average performance gain of
760
755
    ; 20-25%
773
768
    test        r0, r0
774
769
    jz .try%1dc
775
770
    mov        r0d, dword [r1+%1*8]
776
 
%ifdef ARCH_X86_64
777
 
    add         r0, r10
 
771
%if ARCH_X86_64
 
772
    add         r0, r7
778
773
%else
779
774
    add         r0, r0m
780
775
%endif
781
 
    call        x264_add8x4_idct_sse2
 
776
    call        h264_add8x4_idct_sse2
782
777
    jmp .cycle%1end
783
 
.try%1dc
 
778
.try%1dc:
784
779
    movsx       r0, word [r2   ]
785
780
    or         r0w, word [r2+32]
786
781
    jz .cycle%1end
787
782
    mov        r0d, dword [r1+%1*8]
788
 
%ifdef ARCH_X86_64
789
 
    add         r0, r10
 
783
%if ARCH_X86_64
 
784
    add         r0, r7
790
785
%else
791
786
    add         r0, r0m
792
787
%endif
793
 
    call        h264_idct_dc_add8_mmx2
794
 
.cycle%1end
 
788
    call        h264_idct_dc_add8_mmxext
 
789
.cycle%1end:
795
790
%if %1 < 7
796
791
    add         r2, 64
797
792
%endif
799
794
 
800
795
; ff_h264_idct_add16intra_sse2(uint8_t *dst, const int *block_offset,
801
796
;                              DCTELEM *block, int stride, const uint8_t nnzc[6*8])
802
 
cglobal h264_idct_add16intra_8_sse2, 5, 7, 8
803
 
%ifdef ARCH_X86_64
804
 
    mov        r10, r0
 
797
cglobal h264_idct_add16intra_8, 5, 7 + ARCH_X86_64, 8
 
798
%if ARCH_X86_64
 
799
    mov         r7, r0
805
800
%endif
806
801
    add16intra_sse2_cycle 0, 0xc
807
802
    add16intra_sse2_cycle 1, 0x14
817
812
    movzx       r0, word [r4+%2]
818
813
    test        r0, r0
819
814
    jz .try%1dc
820
 
%ifdef ARCH_X86_64
 
815
%if ARCH_X86_64
821
816
    mov        r0d, dword [r1+(%1&1)*8+64*(1+(%1>>1))]
822
 
    add         r0, [r10]
 
817
    add         r0, [r7]
823
818
%else
824
819
    mov         r0, r0m
825
820
    mov         r0, [r0]
826
821
    add         r0, dword [r1+(%1&1)*8+64*(1+(%1>>1))]
827
822
%endif
828
 
    call        x264_add8x4_idct_sse2
 
823
    call        h264_add8x4_idct_sse2
829
824
    jmp .cycle%1end
830
 
.try%1dc
 
825
.try%1dc:
831
826
    movsx       r0, word [r2   ]
832
827
    or         r0w, word [r2+32]
833
828
    jz .cycle%1end
834
 
%ifdef ARCH_X86_64
 
829
%if ARCH_X86_64
835
830
    mov        r0d, dword [r1+(%1&1)*8+64*(1+(%1>>1))]
836
 
    add         r0, [r10]
 
831
    add         r0, [r7]
837
832
%else
838
833
    mov         r0, r0m
839
834
    mov         r0, [r0]
840
835
    add         r0, dword [r1+(%1&1)*8+64*(1+(%1>>1))]
841
836
%endif
842
 
    call        h264_idct_dc_add8_mmx2
843
 
.cycle%1end
 
837
    call        h264_idct_dc_add8_mmxext
 
838
.cycle%1end:
844
839
%if %1 == 1
845
840
    add         r2, 384+64
846
841
%elif %1 < 3
850
845
 
851
846
; ff_h264_idct_add8_sse2(uint8_t **dest, const int *block_offset,
852
847
;                        DCTELEM *block, int stride, const uint8_t nnzc[6*8])
853
 
cglobal h264_idct_add8_8_sse2, 5, 7, 8
 
848
cglobal h264_idct_add8_8, 5, 7 + ARCH_X86_64, 8
854
849
    add          r2, 512
855
 
%ifdef ARCH_X86_64
856
 
    mov         r10, r0
 
850
%if ARCH_X86_64
 
851
    mov          r7, r0
857
852
%endif
858
853
    add8_sse2_cycle 0, 0x34
859
854
    add8_sse2_cycle 1, 0x3c
860
 
%ifdef ARCH_X86_64
861
 
    add         r10, gprsize
 
855
%if ARCH_X86_64
 
856
    add          r7, gprsize
862
857
%else
863
858
    add        r0mp, gprsize
864
859
%endif
896
891
    packssdw    %2, m5
897
892
%endmacro
898
893
 
899
 
%macro STORE_WORDS_MMX 5
900
 
    movd  t0d, %1
901
 
    psrlq  %1, 32
902
 
    movd  t1d, %1
903
 
    mov [t2+%2*32], t0w
904
 
    mov [t2+%4*32], t1w
905
 
    shr   t0d, 16
906
 
    shr   t1d, 16
907
 
    mov [t2+%3*32], t0w
908
 
    mov [t2+%5*32], t1w
909
 
%endmacro
910
 
 
911
 
%macro DEQUANT_STORE_MMX 1
912
 
    DEQUANT_MMX m0, m1, %1
913
 
    STORE_WORDS_MMX m0,  0,  1,  4,  5
914
 
    STORE_WORDS_MMX m1,  2,  3,  6,  7
915
 
 
916
 
    DEQUANT_MMX m2, m3, %1
917
 
    STORE_WORDS_MMX m2,  8,  9, 12, 13
918
 
    STORE_WORDS_MMX m3, 10, 11, 14, 15
919
 
%endmacro
920
 
 
921
 
%macro STORE_WORDS_SSE 9
 
894
%macro STORE_WORDS 5-9
 
895
%if cpuflag(sse)
922
896
    movd  t0d, %1
923
897
    psrldq  %1, 4
924
898
    movd  t1d, %1
938
912
    shr   t1d, 16
939
913
    mov [t2+%7*32], t0w
940
914
    mov [t2+%9*32], t1w
 
915
%else
 
916
    movd  t0d, %1
 
917
    psrlq  %1, 32
 
918
    movd  t1d, %1
 
919
    mov [t2+%2*32], t0w
 
920
    mov [t2+%4*32], t1w
 
921
    shr   t0d, 16
 
922
    shr   t1d, 16
 
923
    mov [t2+%3*32], t0w
 
924
    mov [t2+%5*32], t1w
 
925
%endif
941
926
%endmacro
942
927
 
943
 
%macro DEQUANT_STORE_SSE2 1
 
928
%macro DEQUANT_STORE 1
 
929
%if cpuflag(sse2)
944
930
    movd      xmm4, t3d
945
931
    movq      xmm5, [pw_1]
946
932
    pshufd    xmm4, xmm4, 0
962
948
    psrad     xmm3, %1
963
949
    packssdw  xmm0, xmm1
964
950
    packssdw  xmm2, xmm3
965
 
    STORE_WORDS_SSE xmm0,  0,  1,  4,  5,  2,  3,  6,  7
966
 
    STORE_WORDS_SSE xmm2,  8,  9, 12, 13, 10, 11, 14, 15
 
951
    STORE_WORDS xmm0,  0,  1,  4,  5,  2,  3,  6,  7
 
952
    STORE_WORDS xmm2,  8,  9, 12, 13, 10, 11, 14, 15
 
953
%else
 
954
    DEQUANT_MMX m0, m1, %1
 
955
    STORE_WORDS m0,  0,  1,  4,  5
 
956
    STORE_WORDS m1,  2,  3,  6,  7
 
957
 
 
958
    DEQUANT_MMX m2, m3, %1
 
959
    STORE_WORDS m2,  8,  9, 12, 13
 
960
    STORE_WORDS m3, 10, 11, 14, 15
 
961
%endif
967
962
%endmacro
968
963
 
969
 
%macro IDCT_DC_DEQUANT 2
970
 
cglobal h264_luma_dc_dequant_idct_%1, 3,4,%2
 
964
%macro IDCT_DC_DEQUANT 1
 
965
cglobal h264_luma_dc_dequant_idct, 3, 4, %1
 
966
    ; manually spill XMM registers for Win64 because
 
967
    ; the code here is initialized with INIT_MMX
 
968
    WIN64_SPILL_XMM %1
971
969
    movq        m3, [r1+24]
972
970
    movq        m2, [r1+16]
973
971
    movq        m1, [r1+ 8]
977
975
    WALSH4_1D    0,1,2,3,4
978
976
 
979
977
; shift, tmp, output, qmul
980
 
%ifdef WIN64
 
978
%if WIN64
981
979
    DECLARE_REG_TMP 0,3,1,2
982
980
    ; we can't avoid this, because r0 is the shift register (ecx) on win64
983
981
    xchg        r0, t2
984
 
%elifdef ARCH_X86_64
 
982
%elif ARCH_X86_64
985
983
    DECLARE_REG_TMP 3,1,0,2
986
984
%else
987
985
    DECLARE_REG_TMP 1,3,0,2
990
988
    cmp        t3d, 32767
991
989
    jg .big_qmul
992
990
    add        t3d, 128 << 16
993
 
%ifidn %1,mmx
994
 
    DEQUANT_STORE_MMX 8
995
 
%else
996
 
    DEQUANT_STORE_SSE2 8
997
 
%endif
 
991
    DEQUANT_STORE 8
998
992
    RET
999
993
.big_qmul:
1000
994
    bsr        t0d, t3d
1005
999
    inc        t1d
1006
1000
    shr        t3d, t0b
1007
1001
    sub        t1d, t0d
1008
 
%ifidn %1,mmx
 
1002
%if cpuflag(sse2)
 
1003
    movd      xmm6, t1d
 
1004
    DEQUANT_STORE xmm6
 
1005
%else
1009
1006
    movd        m6, t1d
1010
 
    DEQUANT_STORE_MMX m6
1011
 
%else
1012
 
    movd      xmm6, t1d
1013
 
    DEQUANT_STORE_SSE2 xmm6
 
1007
    DEQUANT_STORE m6
1014
1008
%endif
1015
1009
    RET
1016
1010
%endmacro
1017
1011
 
1018
 
INIT_MMX
1019
 
IDCT_DC_DEQUANT mmx, 0
1020
 
IDCT_DC_DEQUANT sse2, 7
 
1012
INIT_MMX mmx
 
1013
IDCT_DC_DEQUANT 0
 
1014
INIT_MMX sse2
 
1015
IDCT_DC_DEQUANT 7