These are really just wrappers for idct4_add16intra functions, which are in turn mostly wrappers for idct4_add and idct4_dc_add functions. For benchmarks refer to the later two sets.
Showing the changes to libavcodec (2 of 2 files). Show all
Unified · Split
| @@ -54,7 +54,13 @@ void ff_h264_idct_add16intra_##depth##_rvv(uint8_t *d, const int *soffset, \ · 53 unmodified lines | |||
| 54 | const uint8_t nnzc[5 * 8]); \ | 54 | const uint8_t nnzc[5 * 8]); \ |
| 55 | void ff_h264_idct8_add4_##depth##_rvv(uint8_t *d, const int *soffset, \ | 55 | void ff_h264_idct8_add4_##depth##_rvv(uint8_t *d, const int *soffset, \ |
| 56 | int16_t *s, int stride, \ | 56 | int16_t *s, int stride, \ |
| 57 | const uint8_t nnzc[5 * 8]); | 57 | const uint8_t nnzc[5 * 8]); \ |
| 58 | void ff_h264_idct4_add8_##depth##_rvv(uint8_t **d, const int *soffset, \ | ||
| 59 | int16_t *s, int stride, \ | ||
| 60 | const uint8_t nnzc[5 * 8]); \ | ||
| 61 | void ff_h264_idct4_add8_422_##depth##_rvv(uint8_t **d, const int *soffset, \ | ||
| 62 | int16_t *s, int stride, \ | ||
| 63 | const uint8_t nnzc[5 * 8]); | ||
| 58 | 64 | ||
| 59 | IDCT_DEPTH(8) | 65 | IDCT_DEPTH(8) |
| 60 | IDCT_DEPTH(9) | 66 | IDCT_DEPTH(9) |
| @@ -104,6 +110,10 @@ av_cold void ff_h264dsp_init_riscv(H264DSPContext *dsp, const int bit_depth, · 43 unmodified lines | |||
| 104 | dsp->h264_idct_add16intra = ff_h264_idct_add16intra_8_rvv; | 110 | dsp->h264_idct_add16intra = ff_h264_idct_add16intra_8_rvv; |
| 105 | # if __riscv_xlen == 64 | 111 | # if __riscv_xlen == 64 |
| 106 | dsp->h264_idct8_add4 = ff_h264_idct8_add4_8_rvv; | 112 | dsp->h264_idct8_add4 = ff_h264_idct8_add4_8_rvv; |
| 113 | if (chroma_format_idc <= 1) | ||
| 114 | dsp->h264_idct_add8 = ff_h264_idct4_add8_8_rvv; | ||
| 115 | else | ||
| 116 | dsp->h264_idct_add8 = ff_h264_idct4_add8_422_8_rvv; | ||
| 107 | # endif | 117 | # endif |
| 108 | } | 118 | } |
| 109 | if (flags & AV_CPU_FLAG_RVV_I64) { | 119 | if (flags & AV_CPU_FLAG_RVV_I64) { |
| @@ -123,10 +133,16 @@ av_cold void ff_h264dsp_init_riscv(H264DSPContext *dsp, const int bit_depth, · 13 unmodified lines | |||
| 123 | if (zvl128b && (flags & AV_CPU_FLAG_RVB)) { \ | 133 | if (zvl128b && (flags & AV_CPU_FLAG_RVB)) { \ |
| 124 | dsp->h264_idct_dc_add = ff_h264_idct4_dc_add_##depth##_rvv; \ | 134 | dsp->h264_idct_dc_add = ff_h264_idct4_dc_add_##depth##_rvv; \ |
| 125 | dsp->h264_idct8_dc_add = ff_h264_idct8_dc_add_##depth##_rvv; \ | 135 | dsp->h264_idct8_dc_add = ff_h264_idct8_dc_add_##depth##_rvv; \ |
| 136 | dsp->h264_idct_add16 = ff_h264_idct_add16_##depth##_rvv; \ | ||
| 137 | dsp->h264_idct_add16intra = \ | ||
| 138 | ff_h264_idct_add16intra_##depth##_rvv; \ | ||
| 126 | if (__riscv_xlen == 64) { \ | 139 | if (__riscv_xlen == 64) { \ |
| 127 | dsp->h264_idct_add16 = ff_h264_idct_add16_##depth##_rvv; \ | 140 | if (chroma_format_idc <= 1) \ |
| 128 | dsp->h264_idct_add16intra = \ | 141 | dsp->h264_idct_add8 = \ |
| 129 | ff_h264_idct_add16intra_##depth##_rvv; \ | 142 | ff_h264_idct4_add8_##depth##_rvv; \ |
| 143 | else \ | ||
| 144 | dsp->h264_idct_add8 = \ | ||
| 145 | ff_h264_idct4_add8_422_##depth##_rvv; \ | ||
| 130 | } \ | 146 | } \ |
| 131 | } \ | 147 | } \ |
| 132 | if (__riscv_xlen == 64 && (flags & AV_CPU_FLAG_RVB)) \ | 148 | if (__riscv_xlen == 64 && (flags & AV_CPU_FLAG_RVB)) \ |
| @@ -57,7 +57,7 @@ endfunc · 56 unmodified lines | |||
| 57 | func ff_h264_idct_add_8_rvv, zve32x | 57 | func ff_h264_idct_add_8_rvv, zve32x |
| 58 | lpad 0 | 58 | lpad 0 |
| 59 | csrwi vxrm, 0 | 59 | csrwi vxrm, 0 |
| 60 | .Lidct_add4_8_rvv: | 60 | .Lidct4_add_8_rvv: |
| 61 | vsetivli zero, 4, e16, mf2, ta, ma | 61 | vsetivli zero, 4, e16, mf2, ta, ma |
| 62 | addi t1, a1, 1 * 4 * 2 | 62 | addi t1, a1, 1 * 4 * 2 |
| 63 | vle16.v v0, (a1) | 63 | vle16.v v0, (a1) |
| @@ -111,7 +111,7 @@ endfunc · 47 unmodified lines | |||
| 111 | 111 | ||
| 112 | func ff_h264_idct_add_16_rvv, zve32x | 112 | func ff_h264_idct_add_16_rvv, zve32x |
| 113 | csrwi vxrm, 0 | 113 | csrwi vxrm, 0 |
| 114 | .Lidct_add4_16_rvv: | 114 | .Lidct4_add_16_rvv: |
| 115 | vsetivli zero, 4, e32, m1, ta, ma | 115 | vsetivli zero, 4, e32, m1, ta, ma |
| 116 | addi t1, a1, 1 * 4 * 4 | 116 | addi t1, a1, 1 * 4 * 4 |
| 117 | vle32.v v0, (a1) | 117 | vle32.v v0, (a1) |
| @@ -543,19 +543,26 @@ endfunc · 425 unmodified lines | |||
| 543 | .endr | 543 | .endr |
| 544 | 544 | ||
| 545 | const ff_h264_scan8 | 545 | const ff_h264_scan8 |
| 546 | .byte 014, 015, 024, 025, 016, 017, 026, 027 | 546 | .byte 014, 015, 024, 025, 016, 017, 026, 027 |
| 547 | .byte 034, 035, 044, 045, 036, 037, 046, 047 | 547 | .byte 034, 035, 044, 045, 036, 037, 046, 047 |
| 548 | .byte 064, 065, 074, 075, 066, 067, 076, 077 | ||
| 549 | .byte 0104, 0105, 0114, 0115, 0106, 0107, 0116, 0117 | ||
| 550 | .byte 0134, 0135, 0144, 0145, 0136, 0137, 0146, 0147 | ||
| 551 | .byte 0154, 0155, 0164, 0165, 0156, 0157, 0166, 0167 | ||
| 548 | endconst | 552 | endconst |
| 549 | 553 | ||
| 550 | .macro idct4_adds type, depth | 554 | .macro idct4_add16 type, depth |
| 551 | func ff_h264_idct_add\type\()_\depth\()_rvv, zve32x, b | 555 | func ff_h264_idct_add\type\()_\depth\()_rvv, zve32x, b |
| 552 | .if \depth == 8 | 556 | .if \depth == 8 |
| 553 | lpad 0 | 557 | lpad 0 |
| 554 | .endif | 558 | .endif |
| 555 | csrwi vxrm, 0 | 559 | csrwi vxrm, 0 |
| 556 | lla t0, ff_h264_scan8 | 560 | lla t0, ff_h264_scan8 |
| 557 | li t1, 32 * (\depth / 8) | ||
| 558 | vsetivli zero, 16, e8, m1, ta, ma | 561 | vsetivli zero, 16, e8, m1, ta, ma |
| 562 | .ifc \type, 16intra | ||
| 563 | .Lidct4_add4_\depth\()_rvv: | ||
| 564 | .endif | ||
| 565 | li t1, 32 * (\depth / 8) | ||
| 559 | vle8.v v8, (t0) | 566 | vle8.v v8, (t0) |
| 560 | .if \depth == 8 | 567 | .if \depth == 8 |
| 561 | vlse16.v v16, (a2), t1 | 568 | vlse16.v v16, (a2), t1 |
| @@ -587,7 +594,7 @@ func ff_h264_idct_add\type\()_\depth\()_rvv, zve32x, b · 25 unmodified lines | |||
| 587 | mv t5, a1 | 594 | mv t5, a1 |
| 588 | mv a1, a2 | 595 | mv a1, a2 |
| 589 | mv a2, a3 | 596 | mv a2, a3 |
| 590 | li a3, 16 | 597 | csrr a3, vl |
| 591 | mv a7, ra | 598 | mv a7, ra |
| 592 | 1: | 599 | 1: |
| 593 | andi t0, a4, 1 | 600 | andi t0, a4, 1 |
| @@ -603,7 +610,7 @@ func ff_h264_idct_add\type\()_\depth\()_rvv, zve32x, b · 9 unmodified lines | |||
| 603 | .else | 610 | .else |
| 604 | beqz t0, 2f # if (nnzc[scan8[i]]) | 611 | beqz t0, 2f # if (nnzc[scan8[i]]) |
| 605 | .endif | 612 | .endif |
| 606 | jal .Lidct_add4_\depth\()_rvv | 613 | jal .Lidct4_add_\depth\()_rvv |
| 607 | j 3f | 614 | j 3f |
| 608 | 2: | 615 | 2: |
| 609 | .ifnc \type, 16 | 616 | .ifnc \type, 16 |
| @@ -621,9 +628,67 @@ func ff_h264_idct_add\type\()_\depth\()_rvv, zve32x, b · 11 unmodified lines | |||
| 621 | endfunc | 628 | endfunc |
| 622 | .endm | 629 | .endm |
| 623 | 630 | ||
| 631 | .macro idct4_add8 type, depth | ||
| 632 | func ff_h264_idct4_add\type\()_\depth\()_rvv, zve32x | ||
| 633 | .if \depth == 8 | ||
| 634 | lpad 0 | ||
| 635 | .endif | ||
| 636 | csrwi vxrm, 0 | ||
| 637 | addi sp, sp, -32 | ||
| 638 | addi a2, a2, 16 * 16 * 2 * (\depth / 8) # &block[16 * 16] | ||
| 639 | lla t0, ff_h264_scan8 + 16 | ||
| 640 | sd s0, 0(sp) | ||
| 641 | sd ra, 8(sp) | ||
| 642 | mv s0, sp | ||
| 643 | sd a0, 16(sp) | ||
| 644 | sd a4, 24(sp) | ||
| 645 | ld a0, 0(a0) # dest[0] | ||
| 646 | addi a1, a1, 16 * 4 # &block_offset[16] | ||
| 647 | vsetivli zero, 4, e8, mf4, ta, ma | ||
| 648 | jal .Lidct4_add4_\depth\()_rvv | ||
| 649 | |||
| 650 | ld a4, 24(sp) # nnzc | ||
| 651 | ld a0, 16(sp) | ||
| 652 | mv a3, a2 # stride | ||
| 653 | addi a2, a1, (16 - 4) * 16 * 2 * (\depth / 8) # &block[32 * 16] | ||
| 654 | addi a1, t5, (16 - 4) * 4 # &block_offset[32] | ||
| 655 | ld a0, 8(a0) # dest[1] | ||
| 656 | lla t0, ff_h264_scan8 + 32 | ||
| 657 | .ifc \type, 8_422 | ||
| 658 | vsetivli zero, 4, e8, mf4, ta, ma | ||
| 659 | jal .Lidct4_add4_\depth\()_rvv | ||
| 660 | |||
| 661 | ld a4, 24(sp) # nnzc | ||
| 662 | ld a0, 16(sp) | ||
| 663 | mv a3, a2 # stride | ||
| 664 | addi a2, a1, (-12- 4) * 16 * 2 * (\depth / 8) # &block[20 * 16] | ||
| 665 | addi a1, t5, (-8 - 4) * 4 # &block_offset[24] | ||
| 666 | ld a0, 0(a0) # dest[0] | ||
| 667 | lla t0, ff_h264_scan8 + 24 | ||
| 668 | vsetivli zero, 4, e8, mf4, ta, ma | ||
| 669 | jal .Lidct4_add4_\depth\()_rvv | ||
| 670 | |||
| 671 | ld a4, 24(sp) # nnzc | ||
| 672 | ld a0, 16(sp) | ||
| 673 | mv a3, a2 # stride | ||
| 674 | addi a2, a1, (16 - 4) * 16 * 2 * (\depth / 8) # &block[36 * 16] | ||
| 675 | addi a1, t5, (16 - 4) * 4 # &block_offset[40] | ||
| 676 | ld a0, 8(a0) # dest[1] | ||
| 677 | lla t0, ff_h264_scan8 + 40 | ||
| 678 | .endif | ||
| 679 | ld ra, 8(sp) | ||
| 680 | ld s0, 0(sp) | ||
| 681 | addi sp, sp, 32 | ||
| 682 | vsetivli zero, 4, e8, mf4, ta, ma | ||
| 683 | j .Lidct4_add4_\depth\()_rvv | ||
| 684 | endfunc | ||
| 685 | .endm | ||
| 686 | |||
| 624 | .irp depth, 8, 16 | 687 | .irp depth, 8, 16 |
| 625 | idct4_adds 16, \depth | 688 | idct4_add16 16, \depth |
| 626 | idct4_adds 16intra, \depth | 689 | idct4_add16 16intra, \depth |
| 690 | idct4_add8 8, \depth | ||
| 691 | idct4_add8 8_422, \depth | ||
| 627 | 692 | ||
| 628 | #if (__riscv_xlen == 64) | 693 | #if (__riscv_xlen == 64) |
| 629 | func ff_h264_idct8_add4_\depth\()_rvv, zve32x, b | 694 | func ff_h264_idct8_add4_\depth\()_rvv, zve32x, b |
| @@ -724,5 +789,17 @@ func ff_h264_idct8_add4_\depth\()_rvv, zve32x · 94 unmodified lines | |||
| 724 | li a5, (1 << \depth) - 1 | 789 | li a5, (1 << \depth) - 1 |
| 725 | j ff_h264_idct8_add4_16_rvv | 790 | j ff_h264_idct8_add4_16_rvv |
| 726 | endfunc | 791 | endfunc |
| 792 | |||
| 793 | func ff_h264_idct4_add8_\depth\()_rvv, zve32x | ||
| 794 | lpad 0 | ||
| 795 | li a5, (1 << \depth) - 1 | ||
| 796 | j ff_h264_idct4_add8_16_rvv | ||
| 797 | endfunc | ||
| 798 | |||
| 799 | func ff_h264_idct4_add8_422_\depth\()_rvv, zve32x | ||
| 800 | lpad 0 | ||
| 801 | li a5, (1 << \depth) - 1 | ||
| 802 | j ff_h264_idct4_add8_422_16_rvv | ||
| 803 | endfunc | ||
| 727 | #endif | 804 | #endif |
| 728 | .endr | 805 | .endr |