As with 8-bit, this tends to be faster, but results are all over the place due to the variable distribution of non-zero coefficients.
Unified · Split
| @@ -41,26 +41,27 @@ void ff_h264_h_loop_filter_luma_8_rvv(uint8_t *pix, ptrdiff_t stride, · 40 unmodified lines | ||
| 41 | 41 | void ff_h264_h_loop_filter_luma_mbaff_8_rvv(uint8_t *pix, ptrdiff_t stride, |
| 42 | 42 | int alpha, int beta, int8_t *tc0); |
| 43 | 43 | |
| 44 | −void ff_h264_idct_add_8_rvv(uint8_t *dst, int16_t *block, int stride); | |
| 45 | −void ff_h264_idct8_add_8_rvv(uint8_t *dst, int16_t *block, int stride); | |
| 46 | −void ff_h264_idct_add16_8_rvv(uint8_t *dst, const int *blockoffset, | |
| 47 | − int16_t *block, int stride, | |
| 48 | − const uint8_t nnzc[5 * 8]); | |
| 49 | −void ff_h264_idct_add16intra_8_rvv(uint8_t *dst, const int *blockoffset, | |
| 50 | − int16_t *block, int stride, | |
| 51 | − const uint8_t nnzc[5 * 8]); | |
| 52 | −void ff_h264_idct8_add4_8_rvv(uint8_t *dst, const int *blockoffset, | |
| 53 | − int16_t *block, int stride, | |
| 54 | − const uint8_t nnzc[5 * 8]); | |
| 55 | − | |
| 56 | −void ff_h264_idct_add_9_rvv(uint8_t *dst, int16_t *block, int stride); | |
| 57 | −void ff_h264_idct8_add_9_rvv(uint8_t *dst, int16_t *block, int stride); | |
| 58 | −void ff_h264_idct_add_10_rvv(uint8_t *dst, int16_t *block, int stride); | |
| 59 | −void ff_h264_idct8_add_10_rvv(uint8_t *dst, int16_t *block, int stride); | |
| 60 | −void ff_h264_idct_add_12_rvv(uint8_t *dst, int16_t *block, int stride); | |
| 61 | −void ff_h264_idct8_add_12_rvv(uint8_t *dst, int16_t *block, int stride); | |
| 62 | −void ff_h264_idct_add_14_rvv(uint8_t *dst, int16_t *block, int stride); | |
| 63 | −void ff_h264_idct8_add_14_rvv(uint8_t *dst, int16_t *block, int stride); | |
| 44 | +#define IDCT_DEPTH(depth) \ | |
| 45 | +void ff_h264_idct_add_##depth##_rvv(uint8_t *d, int16_t *s, int stride); \ | |
| 46 | +void ff_h264_idct8_add_##depth##_rvv(uint8_t *d, int16_t *s, int stride); \ | |
| 47 | +void ff_h264_idct4_dc_add_##depth##_rvv(uint8_t *, int16_t *, int); \ | |
| 48 | +void ff_h264_idct8_dc_add_##depth##_rvv(uint8_t *, int16_t *, int); \ | |
| 49 | +void ff_h264_idct_add16_##depth##_rvv(uint8_t *d, const int *soffset, \ | |
| 50 | + int16_t *s, int stride, \ | |
| 51 | + const uint8_t nnzc[5 * 8]); \ | |
| 52 | +void ff_h264_idct_add16intra_##depth##_rvv(uint8_t *d, const int *soffset, \ | |
| 53 | + int16_t *s, int stride, \ | |
| 54 | + const uint8_t nnzc[5 * 8]); \ | |
| 55 | +void ff_h264_idct8_add4_##depth##_rvv(uint8_t *d, const int *soffset, \ | |
| 56 | + int16_t *s, int stride, \ | |
| 57 | + const uint8_t nnzc[5 * 8]); | |
| 58 | + | |
| 59 | +IDCT_DEPTH(8) | |
| 60 | +IDCT_DEPTH(9) | |
| 61 | +IDCT_DEPTH(10) | |
| 62 | +IDCT_DEPTH(12) | |
| 63 | +IDCT_DEPTH(14) | |
| 64 | +#undef IDCT_DEPTH | |
| 64 | 65 | |
| 65 | 66 | void ff_h264_add_pixels8_8_rvv(uint8_t *dst, int16_t *block, int stride); |
| 66 | 67 | void ff_h264_add_pixels4_8_rvv(uint8_t *dst, int16_t *block, int stride); |
| @@ -69,16 +70,6 @@ void ff_h264_add_pixels4_16_rvv(uint8_t *dst, int16_t *block, int stride); · 2 unmodified lines | ||
| 69 | 70 | |
| 70 | 71 | extern int ff_startcode_find_candidate_rvb(const uint8_t *, int); |
| 71 | 72 | extern int ff_startcode_find_candidate_rvv(const uint8_t *, int); |
| 72 | −void ff_h264_idct4_dc_add_8_rvv(uint8_t *, int16_t *, int); | |
| 73 | −void ff_h264_idct8_dc_add_8_rvv(uint8_t *, int16_t *, int); | |
| 74 | −void ff_h264_idct4_dc_add_9_rvv(uint8_t *, int16_t *, int); | |
| 75 | −void ff_h264_idct8_dc_add_9_rvv(uint8_t *, int16_t *, int); | |
| 76 | −void ff_h264_idct4_dc_add_10_rvv(uint8_t *, int16_t *, int); | |
| 77 | −void ff_h264_idct8_dc_add_10_rvv(uint8_t *, int16_t *, int); | |
| 78 | −void ff_h264_idct4_dc_add_12_rvv(uint8_t *, int16_t *, int); | |
| 79 | −void ff_h264_idct8_dc_add_12_rvv(uint8_t *, int16_t *, int); | |
| 80 | −void ff_h264_idct4_dc_add_14_rvv(uint8_t *, int16_t *, int); | |
| 81 | −void ff_h264_idct8_dc_add_14_rvv(uint8_t *, int16_t *, int); | |
| 82 | 73 | |
| 83 | 74 | av_cold void ff_h264dsp_init_riscv(H264DSPContext *dsp, const int bit_depth, |
| 84 | 75 | const int chroma_format_idc) |
| @@ -120,38 +111,31 @@ av_cold void ff_h264dsp_init_riscv(H264DSPContext *dsp, const int bit_depth, · 35 unmodified lines | ||
| 120 | 111 | } |
| 121 | 112 | dsp->h264_add_pixels4_clear = ff_h264_add_pixels4_8_rvv; |
| 122 | 113 | } |
| 123 | − if (bit_depth == 9) { | |
| 124 | − if (zvl128b) { | |
| 125 | − dsp->h264_idct_dc_add = ff_h264_idct4_dc_add_9_rvv; | |
| 126 | − dsp->h264_idct8_dc_add = ff_h264_idct8_dc_add_9_rvv; | |
| 127 | − dsp->h264_idct_add = ff_h264_idct_add_9_rvv; | |
| 128 | − } | |
| 129 | − dsp->h264_idct8_add = ff_h264_idct8_add_9_rvv; | |
| 130 | − } | |
| 131 | − if (bit_depth == 10) { | |
| 132 | − if (zvl128b) { | |
| 133 | − dsp->h264_idct_dc_add = ff_h264_idct4_dc_add_10_rvv; | |
| 134 | − dsp->h264_idct8_dc_add = ff_h264_idct8_dc_add_10_rvv; | |
| 135 | − dsp->h264_idct_add = ff_h264_idct_add_10_rvv; | |
| 136 | − } | |
| 137 | − dsp->h264_idct8_add = ff_h264_idct8_add_10_rvv; | |
| 138 | − } | |
| 139 | − if (bit_depth == 12) { | |
| 140 | − if (zvl128b) { | |
| 141 | − dsp->h264_idct_add = ff_h264_idct_add_12_rvv; | |
| 142 | − dsp->h264_idct_dc_add = ff_h264_idct4_dc_add_12_rvv; | |
| 143 | − dsp->h264_idct8_dc_add = ff_h264_idct8_dc_add_12_rvv; | |
| 144 | − } | |
| 145 | − dsp->h264_idct8_add = ff_h264_idct8_add_12_rvv; | |
| 146 | − } | |
| 147 | − if (bit_depth == 14) { | |
| 148 | − if (zvl128b) { | |
| 149 | − dsp->h264_idct_add = ff_h264_idct_add_14_rvv; | |
| 150 | − dsp->h264_idct_dc_add = ff_h264_idct4_dc_add_14_rvv; | |
| 151 | − dsp->h264_idct8_dc_add = ff_h264_idct8_dc_add_14_rvv; | |
| 152 | − } | |
| 153 | − dsp->h264_idct8_add = ff_h264_idct8_add_14_rvv; | |
| 114 | + | |
| 115 | +#define IDCT_DEPTH(depth) \ | |
| 116 | + if (bit_depth == depth) { \ | |
| 117 | + if (zvl128b) \ | |
| 118 | + dsp->h264_idct_add = ff_h264_idct_add_##depth##_rvv; \ | |
| 119 | + if (flags & AV_CPU_FLAG_RVB_ADDR) \ | |
| 120 | + dsp->h264_idct8_add = ff_h264_idct8_add_##depth##_rvv; \ | |
| 121 | + if (zvl128b && (flags & AV_CPU_FLAG_RVB_ADDR)) { \ | |
| 122 | + dsp->h264_idct_dc_add = ff_h264_idct4_dc_add_##depth##_rvv; \ | |
| 123 | + dsp->h264_idct8_dc_add = ff_h264_idct8_dc_add_##depth##_rvv; \ | |
| 124 | + } \ | |
| 125 | + if (__riscv_xlen == 64 && zvl128b) { \ | |
| 126 | + dsp->h264_idct_add16 = ff_h264_idct_add16_##depth##_rvv; \ | |
| 127 | + dsp->h264_idct_add16intra = \ | |
| 128 | + ff_h264_idct_add16intra_##depth##_rvv; \ | |
| 129 | + } \ | |
| 130 | + if (__riscv_xlen == 64 && (flags & AV_CPU_FLAG_RVB_ADDR)) \ | |
| 131 | + dsp->h264_idct8_add4 = ff_h264_idct8_add4_##depth##_rvv; \ | |
| 154 | 132 | } |
| 133 | + | |
| 134 | + IDCT_DEPTH(9) | |
| 135 | + IDCT_DEPTH(10) | |
| 136 | + IDCT_DEPTH(12) | |
| 137 | + IDCT_DEPTH(14) | |
| 138 | + | |
| 155 | 139 | if (bit_depth > 8 && zvl128b) { |
| 156 | 140 | dsp->h264_add_pixels8_clear = ff_h264_add_pixels8_16_rvv; |
| 157 | 141 | if (flags & AV_CPU_FLAG_RVV_I64) |
| @@ -107,6 +107,7 @@ endfunc · 106 unmodified lines | ||
| 107 | 107 | |
| 108 | 108 | func ff_h264_idct_add_16_rvv, zve32x |
| 109 | 109 | csrwi vxrm, 0 |
| 110 | +.Lidct_add4_16_rvv: | |
| 110 | 111 | vsetivli zero, 4, e32, m1, ta, ma |
| 111 | 112 | addi t1, a1, 1 * 4 * 4 |
| 112 | 113 | vle32.v v0, (a1) |
| @@ -147,7 +148,7 @@ func ff_h264_idct_add_16_rvv, zve32x · 34 unmodified lines | ||
| 147 | 148 | vmax.vx v\n, v\n, zero |
| 148 | 149 | .endr |
| 149 | 150 | .irp n,0,1,2,3 |
| 150 | − vmin.vx v\n, v\n, a3 | |
| 151 | + vmin.vx v\n, v\n, a5 | |
| 151 | 152 | .endr |
| 152 | 153 | vsetvli zero, zero, e16, mf2, ta, ma |
| 153 | 154 | vncvt.x.x.w v4, v0 |
| @@ -295,9 +296,10 @@ func ff_h264_idct8_add_8_rvv, zve32x · 141 unmodified lines | ||
| 295 | 296 | endfunc |
| 296 | 297 | |
| 297 | 298 | func ff_h264_idct8_add_16_rvv, zve32x |
| 298 | − li a4, 8 | |
| 299 | 299 | csrwi vxrm, 0 |
| 300 | − vsetivli a5, 8, e32, m1, ta, ma | |
| 300 | +.Lidct8_add_16_rvv: | |
| 301 | + li a4, 8 | |
| 302 | + vsetivli a3, 8, e32, m1, ta, ma | |
| 301 | 303 | 1: |
| 302 | 304 | addi t1, a1, 1 * 8 * 4 |
| 303 | 305 | vle32.v v0, (a1) |
| @@ -313,11 +315,11 @@ func ff_h264_idct8_add_16_rvv, zve32x · 9 unmodified lines | ||
| 313 | 315 | vle32.v v5, (t5) |
| 314 | 316 | addi a7, a1, 7 * 8 * 4 |
| 315 | 317 | vle32.v v6, (t6) |
| 316 | − sub a4, a4, a5 | |
| 318 | + sub a4, a4, a3 | |
| 317 | 319 | vle32.v v7, (a7) |
| 318 | 320 | jal t0, ff_h264_idct8_rvv |
| 319 | 321 | vse32.v v0, (a1) |
| 320 | − sh2add a1, a5, a1 | |
| 322 | + sh2add a1, a3, a1 | |
| 321 | 323 | vse32.v v1, (t1) |
| 322 | 324 | vse32.v v2, (t2) |
| 323 | 325 | vse32.v v3, (t3) |
| @@ -329,7 +331,7 @@ func ff_h264_idct8_add_16_rvv, zve32x · 5 unmodified lines | ||
| 329 | 331 | |
| 330 | 332 | addi a1, a1, -8 * 4 |
| 331 | 333 | li a4, 8 |
| 332 | − slli a6, a5, 3 + 2 | |
| 334 | + slli a6, a3, 3 + 2 | |
| 333 | 335 | 2: |
| 334 | 336 | vsetvli zero, zero, e32, m1, ta, ma |
| 335 | 337 | vlseg8e32.v v0, (a1) |
| @@ -348,7 +350,7 @@ func ff_h264_idct8_add_16_rvv, zve32x · 12 unmodified lines | ||
| 348 | 350 | vle16.v v21, (t5) |
| 349 | 351 | add a7, t6, a2 |
| 350 | 352 | vle16.v v22, (t6) |
| 351 | − sub a4, a4, a5 | |
| 353 | + sub a4, a4, a3 | |
| 352 | 354 | vle16.v v23, (a7) |
| 353 | 355 | .irp n,0,1,2,3,4,5,6,7 |
| 354 | 356 | vssra.vi v\n, v\n, 6 |
| @@ -368,7 +370,7 @@ func ff_h264_idct8_add_16_rvv, zve32x · 13 unmodified lines | ||
| 368 | 370 | vmax.vx v\n, v\n, zero |
| 369 | 371 | .endr |
| 370 | 372 | .irp n,0,1,2,3,4,5,6,7 |
| 371 | − vmin.vx v\n, v\n, a3 | |
| 373 | + vmin.vx v\n, v\n, a5 | |
| 372 | 374 | .endr |
| 373 | 375 | vsetvli zero, zero, e16, mf2, ta, ma |
| 374 | 376 | vncvt.x.x.w v16, v0 |
| @@ -380,7 +382,7 @@ func ff_h264_idct8_add_16_rvv, zve32x · 5 unmodified lines | ||
| 380 | 382 | vncvt.x.x.w v22, v6 |
| 381 | 383 | vncvt.x.x.w v23, v7 |
| 382 | 384 | vse16.v v16, (a0) |
| 383 | − sh1add a0, a5, a0 | |
| 385 | + sh1add a0, a3, a0 | |
| 384 | 386 | vse16.v v17, (t1) |
| 385 | 387 | vse16.v v18, (t2) |
| 386 | 388 | vse16.v v19, (t3) |
| @@ -400,12 +402,12 @@ endfunc · 13 unmodified lines | ||
| 400 | 402 | |
| 401 | 403 | .irp depth, 9, 10, 12, 14 |
| 402 | 404 | func ff_h264_idct_add_\depth\()_rvv, zve32x |
| 403 | − li a3, (1 << \depth) - 1 | |
| 405 | + li a5, (1 << \depth) - 1 | |
| 404 | 406 | j ff_h264_idct_add_16_rvv |
| 405 | 407 | endfunc |
| 406 | 408 | |
| 407 | 409 | func ff_h264_idct8_add_\depth\()_rvv, zve32x |
| 408 | − li a3, (1 << \depth) - 1 | |
| 410 | + li a5, (1 << \depth) - 1 | |
| 409 | 411 | j ff_h264_idct8_add_16_rvv |
| 410 | 412 | endfunc |
| 411 | 413 | .endr |
| @@ -416,13 +418,13 @@ const ff_h264_scan8 · 4 unmodified lines | ||
| 416 | 418 | endconst |
| 417 | 419 | |
| 418 | 420 | #if (__riscv_xlen == 64) |
| 419 | −.irp depth, 8 | |
| 421 | +.irp depth, 8, 16 | |
| 420 | 422 | func ff_h264_idct_add16_\depth\()_rvv, zve32x |
| 421 | 423 | csrwi vxrm, 0 |
| 422 | − addi sp, sp, -80 | |
| 424 | + addi sp, sp, -96 | |
| 423 | 425 | lla t0, ff_h264_scan8 |
| 424 | 426 | sd s0, (sp) |
| 425 | − li t1, 32 << (\depth > 8) | |
| 427 | + li t1, 32 * (\depth / 8) | |
| 426 | 428 | mv s0, sp |
| 427 | 429 | sd ra, 8(sp) |
| 428 | 430 | sd s1, 16(sp) |
| @@ -432,9 +434,19 @@ func ff_h264_idct_add16_\depth\()_rvv, zve32x · 3 unmodified lines | ||
| 432 | 434 | sd s5, 48(sp) |
| 433 | 435 | sd s6, 56(sp) |
| 434 | 436 | sd s7, 64(sp) |
| 437 | +.if \depth > 8 | |
| 438 | + sd s8, 72(sp) | |
| 439 | + sd s9, 80(sp) | |
| 440 | + mv s8, a5 | |
| 441 | + mv s9, a6 | |
| 442 | +.endif | |
| 435 | 443 | vsetivli zero, 16, e8, m1, ta, ma |
| 436 | 444 | vle8.v v8, (t0) |
| 445 | +.if \depth == 8 | |
| 437 | 446 | vlse16.v v16, (a2), t1 |
| 447 | +.else | |
| 448 | + vlse32.v v16, (a2), t1 | |
| 449 | +.endif | |
| 438 | 450 | vluxei8.v v12, (a4), v8 |
| 439 | 451 | .if \depth == 8 |
| 440 | 452 | vsetvli zero, zero, e16, m2, ta, ma |
| @@ -464,17 +476,28 @@ func ff_h264_idct_add16_\depth\()_rvv, zve32x · 23 unmodified lines | ||
| 464 | 476 | mv a1, s6 |
| 465 | 477 | mv a2, s7 |
| 466 | 478 | add a0, s4, t2 |
| 467 | − beqz t1, 2f # if (nnz == 1 && block[i * 16]) | |
| 468 | − call ff_h264_idct_dc_add_\depth\()_c | |
| 479 | +.if \depth > 8 | |
| 480 | + mv a5, s8 | |
| 481 | +.endif | |
| 482 | + bnez t1, 2f # if (nnz == 1 && block[i * 16]) | |
| 483 | + jal .Lidct_add4_\depth\()_rvv | |
| 469 | 484 | j 3f |
| 470 | 485 | 2: |
| 471 | − call .Lidct_add4_\depth\()_rvv | |
| 486 | +.if \depth == 8 | |
| 487 | + call ff_h264_idct_dc_add_\depth\()_c | |
| 488 | +.else | |
| 489 | + jalr s9 | |
| 490 | +.endif | |
| 472 | 491 | 3: |
| 473 | 492 | srli s3, s3, 1 |
| 474 | 493 | addi s5, s5, 4 |
| 475 | − addi s6, s6, 16 * 2 << (\depth > 8) | |
| 494 | + addi s6, s6, 16 * 2 * (\depth / 8) | |
| 476 | 495 | bnez s1, 1b |
| 477 | 496 | |
| 497 | +.if \depth > 8 | |
| 498 | + ld s9, 80(sp) | |
| 499 | + ld s8, 72(sp) | |
| 500 | +.endif | |
| 478 | 501 | ld s7, 64(sp) |
| 479 | 502 | ld s6, 56(sp) |
| 480 | 503 | ld s5, 48(sp) |
| @@ -484,16 +507,16 @@ func ff_h264_idct_add16_\depth\()_rvv, zve32x · 3 unmodified lines | ||
| 484 | 507 | ld s1, 16(sp) |
| 485 | 508 | ld ra, 8(sp) |
| 486 | 509 | ld s0, 0(sp) |
| 487 | − addi sp, sp, 80 | |
| 510 | + addi sp, sp, 96 | |
| 488 | 511 | ret |
| 489 | 512 | endfunc |
| 490 | 513 | |
| 491 | 514 | func ff_h264_idct_add16intra_\depth\()_rvv, zve32x |
| 492 | 515 | csrwi vxrm, 0 |
| 493 | − addi sp, sp, -80 | |
| 516 | + addi sp, sp, -96 | |
| 494 | 517 | lla t0, ff_h264_scan8 |
| 495 | 518 | sd s0, (sp) |
| 496 | − li t1, 32 << (\depth > 8) | |
| 519 | + li t1, 32 * (\depth / 8) | |
| 497 | 520 | mv s0, sp |
| 498 | 521 | sd ra, 8(sp) |
| 499 | 522 | sd s1, 16(sp) |
| @@ -503,9 +526,19 @@ func ff_h264_idct_add16intra_\depth\()_rvv, zve32x · 3 unmodified lines | ||
| 503 | 526 | sd s5, 48(sp) |
| 504 | 527 | sd s6, 56(sp) |
| 505 | 528 | sd s7, 64(sp) |
| 529 | +.if \depth > 8 | |
| 530 | + sd s8, 72(sp) | |
| 531 | + sd s9, 80(sp) | |
| 532 | + mv s8, a5 | |
| 533 | + mv s9, a6 | |
| 534 | +.endif | |
| 506 | 535 | vsetivli zero, 16, e8, m1, ta, ma |
| 507 | 536 | vle8.v v8, (t0) |
| 537 | +.if \depth == 8 | |
| 508 | 538 | vlse16.v v16, (a2), t1 |
| 539 | +.else | |
| 540 | + vlse32.v v16, (a2), t1 | |
| 541 | +.endif | |
| 509 | 542 | vluxei8.v v12, (a4), v8 |
| 510 | 543 | .if \depth == 8 |
| 511 | 544 | vsetvli zero, zero, e16, m2, ta, ma |
| @@ -532,18 +565,29 @@ func ff_h264_idct_add16intra_\depth\()_rvv, zve32x · 20 unmodified lines | ||
| 532 | 565 | mv a1, s6 |
| 533 | 566 | mv a2, s7 |
| 534 | 567 | add a0, s4, t2 |
| 568 | +.if \depth > 8 | |
| 569 | + mv a5, s8 | |
| 570 | +.endif | |
| 535 | 571 | beqz t0, 2f # if (nnzc[scan8[i]]) |
| 536 | − call .Lidct_add4_\depth\()_rvv | |
| 572 | + jal .Lidct_add4_\depth\()_rvv | |
| 537 | 573 | j 3f |
| 538 | 574 | 2: |
| 539 | 575 | beqz t1, 3f # if (block[i * 16]) |
| 576 | +.if \depth == 8 | |
| 540 | 577 | call ff_h264_idct_dc_add_\depth\()_c |
| 578 | +.else | |
| 579 | + jalr s9 | |
| 580 | +.endif | |
| 541 | 581 | 3: |
| 542 | 582 | srli s3, s3, 1 |
| 543 | 583 | addi s5, s5, 4 |
| 544 | − addi s6, s6, 16 * 2 << (\depth > 8) | |
| 584 | + addi s6, s6, 16 * 2 * (\depth / 8) | |
| 545 | 585 | bnez s1, 1b |
| 546 | 586 | |
| 587 | +.if \depth > 8 | |
| 588 | + ld s9, 80(sp) | |
| 589 | + ld s8, 72(sp) | |
| 590 | +.endif | |
| 547 | 591 | ld s7, 64(sp) |
| 548 | 592 | ld s6, 56(sp) |
| 549 | 593 | ld s5, 48(sp) |
| @@ -553,16 +597,16 @@ func ff_h264_idct_add16intra_\depth\()_rvv, zve32x · 3 unmodified lines | ||
| 553 | 597 | ld s1, 16(sp) |
| 554 | 598 | ld ra, 8(sp) |
| 555 | 599 | ld s0, 0(sp) |
| 556 | − addi sp, sp, 80 | |
| 600 | + addi sp, sp, 96 | |
| 557 | 601 | ret |
| 558 | 602 | endfunc |
| 559 | 603 | |
| 560 | 604 | func ff_h264_idct8_add4_\depth\()_rvv, zve32x |
| 561 | 605 | csrwi vxrm, 0 |
| 562 | − addi sp, sp, -80 | |
| 606 | + addi sp, sp, -96 | |
| 563 | 607 | lla t0, ff_h264_scan8 |
| 564 | 608 | sd s0, (sp) |
| 565 | − li t1, 4 * 32 << (\depth > 8) | |
| 609 | + li t1, 4 * 32 * (\depth / 8) | |
| 566 | 610 | mv s0, sp |
| 567 | 611 | li t2, 4 |
| 568 | 612 | sd ra, 8(sp) |
| @@ -573,9 +617,19 @@ func ff_h264_idct8_add4_\depth\()_rvv, zve32x · 4 unmodified lines | ||
| 573 | 617 | sd s5, 48(sp) |
| 574 | 618 | sd s6, 56(sp) |
| 575 | 619 | sd s7, 64(sp) |
| 620 | +.if \depth > 8 | |
| 621 | + sd s8, 72(sp) | |
| 622 | + sd s9, 80(sp) | |
| 623 | + mv s8, a5 | |
| 624 | + mv s9, a6 | |
| 625 | +.endif | |
| 576 | 626 | vsetivli zero, 4, e8, mf4, ta, ma |
| 577 | 627 | vlse8.v v8, (t0), t2 |
| 628 | +.if \depth == 8 | |
| 578 | 629 | vlse16.v v16, (a2), t1 |
| 630 | +.else | |
| 631 | + vlse32.v v16, (a2), t1 | |
| 632 | +.endif | |
| 579 | 633 | vluxei8.v v12, (a4), v8 |
| 580 | 634 | .if \depth == 8 |
| 581 | 635 | vsetvli zero, zero, e16, mf2, ta, ma |
| @@ -604,17 +658,28 @@ func ff_h264_idct8_add4_\depth\()_rvv, zve32x · 22 unmodified lines | ||
| 604 | 658 | mv a1, s6 |
| 605 | 659 | mv a2, s7 |
| 606 | 660 | add a0, s4, t2 |
| 607 | − beqz t1, 2f # if (nnz == 1 && block[i * 16]) | |
| 608 | − call ff_h264_idct8_dc_add_\depth\()_c | |
| 661 | +.if \depth > 8 | |
| 662 | + mv a5, s8 | |
| 663 | +.endif | |
| 664 | + bnez t1, 2f # if (nnz == 1 && block[i * 16]) | |
| 665 | + jal .Lidct8_add_\depth\()_rvv | |
| 609 | 666 | j 3f |
| 610 | 667 | 2: |
| 611 | − call .Lidct8_add_\depth\()_rvv | |
| 668 | +.if \depth == 8 | |
| 669 | + call ff_h264_idct8_dc_add_\depth\()_c | |
| 670 | +.else | |
| 671 | + jalr s9 | |
| 672 | +.endif | |
| 612 | 673 | 3: |
| 613 | 674 | srli s3, s3, 1 |
| 614 | 675 | addi s5, s5, 4 * 4 |
| 615 | − addi s6, s6, 4 * 16 * 2 << (\depth > 8) | |
| 676 | + addi s6, s6, 4 * 16 * 2 * (\depth / 8) | |
| 616 | 677 | bnez s1, 1b |
| 617 | 678 | |
| 679 | +.if \depth > 8 | |
| 680 | + ld s9, 80(sp) | |
| 681 | + ld s8, 72(sp) | |
| 682 | +.endif | |
| 618 | 683 | ld s7, 64(sp) |
| 619 | 684 | ld s6, 56(sp) |
| 620 | 685 | ld s5, 48(sp) |
| @@ -624,8 +689,28 @@ func ff_h264_idct8_add4_\depth\()_rvv, zve32x · 3 unmodified lines | ||
| 624 | 689 | ld s1, 16(sp) |
| 625 | 690 | ld ra, 8(sp) |
| 626 | 691 | ld s0, 0(sp) |
| 627 | − addi sp, sp, 80 | |
| 692 | + addi sp, sp, 96 | |
| 628 | 693 | ret |
| 629 | 694 | endfunc |
| 630 | 695 | .endr |
| 696 | + | |
| 697 | +.irp depth, 9, 10, 12, 14 | |
| 698 | +func ff_h264_idct_add16_\depth\()_rvv, zve32x | |
| 699 | + li a5, (1 << \depth) - 1 | |
| 700 | + lla a6, ff_h264_idct_dc_add_\depth\()_c | |
| 701 | + j ff_h264_idct_add16_16_rvv | |
| 702 | +endfunc | |
| 703 | + | |
| 704 | +func ff_h264_idct_add16intra_\depth\()_rvv, zve32x | |
| 705 | + li a5, (1 << \depth) - 1 | |
| 706 | + lla a6, ff_h264_idct_dc_add_\depth\()_c | |
| 707 | + j ff_h264_idct_add16intra_16_rvv | |
| 708 | +endfunc | |
| 709 | + | |
| 710 | +func ff_h264_idct8_add4_\depth\()_rvv, zve32x | |
| 711 | + li a5, (1 << \depth) - 1 | |
| 712 | + lla a6, ff_h264_idct8_dc_add_\depth\()_c | |
| 713 | + j ff_h264_idct8_add4_16_rvv | |
| 714 | +endfunc | |
| 715 | +.endr | |
| 631 | 716 | #endif |