xref: /aosp_15_r20/external/libdav1d/src/riscv/64/pal.S (revision c09093415860a1c2373dacd84c4fde00c507cdfd)
1*c0909341SAndroid Build Coastguard Worker/******************************************************************************
2*c0909341SAndroid Build Coastguard Worker * Copyright © 2018, VideoLAN and dav1d authors
3*c0909341SAndroid Build Coastguard Worker * Copyright © 2024, Bogdan Gligorijevic
4*c0909341SAndroid Build Coastguard Worker * All rights reserved.
5*c0909341SAndroid Build Coastguard Worker *
6*c0909341SAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without
7*c0909341SAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions are met:
8*c0909341SAndroid Build Coastguard Worker *
9*c0909341SAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright notice, this
10*c0909341SAndroid Build Coastguard Worker *    list of conditions and the following disclaimer.
11*c0909341SAndroid Build Coastguard Worker *
12*c0909341SAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright notice,
13*c0909341SAndroid Build Coastguard Worker *    this list of conditions and the following disclaimer in the documentation
14*c0909341SAndroid Build Coastguard Worker *    and/or other materials provided with the distribution.
15*c0909341SAndroid Build Coastguard Worker *
16*c0909341SAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17*c0909341SAndroid Build Coastguard Worker * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18*c0909341SAndroid Build Coastguard Worker * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19*c0909341SAndroid Build Coastguard Worker * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
20*c0909341SAndroid Build Coastguard Worker * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21*c0909341SAndroid Build Coastguard Worker * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22*c0909341SAndroid Build Coastguard Worker * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23*c0909341SAndroid Build Coastguard Worker * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24*c0909341SAndroid Build Coastguard Worker * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25*c0909341SAndroid Build Coastguard Worker * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*c0909341SAndroid Build Coastguard Worker *****************************************************************************/
27*c0909341SAndroid Build Coastguard Worker
28*c0909341SAndroid Build Coastguard Worker#include "src/riscv/asm.S"
29*c0909341SAndroid Build Coastguard Worker
30*c0909341SAndroid Build Coastguard Workerfunction pal_idx_finish_rvv, export=1, ext="v,zba,zbb"
31*c0909341SAndroid Build Coastguard Worker    csrw vxrm, zero
32*c0909341SAndroid Build Coastguard Worker    srl t0, a2, 1
33*c0909341SAndroid Build Coastguard Worker    sub a2, a2, a4
34*c0909341SAndroid Build Coastguard Worker    srl t1, a4, 1
35*c0909341SAndroid Build Coastguard Worker    mv t2, a5
36*c0909341SAndroid Build Coastguard Worker
37*c0909341SAndroid Build Coastguard Worker    csrr t6, vlenb
38*c0909341SAndroid Build Coastguard Worker    li t4, -3
39*c0909341SAndroid Build Coastguard Worker    ctz a6, t0
40*c0909341SAndroid Build Coastguard Worker    ctz t6, t6
41*c0909341SAndroid Build Coastguard Worker    li a7, 16
42*c0909341SAndroid Build Coastguard Worker    sub a6, a6, t6
43*c0909341SAndroid Build Coastguard Worker    li t6, 1<<4+1
44*c0909341SAndroid Build Coastguard Worker
45*c0909341SAndroid Build Coastguard Worker    // a6 is never > 3 for VLEN >=128
46*c0909341SAndroid Build Coastguard Worker    // that would've required stripmining with a6 set to 3
47*c0909341SAndroid Build Coastguard Worker    max a6, a6, t4
48*c0909341SAndroid Build Coastguard Worker    li t5, 2
49*c0909341SAndroid Build Coastguard Worker    andi a6, a6, 7
50*c0909341SAndroid Build Coastguard Worker    addi t4, a1, 1
51*c0909341SAndroid Build Coastguard Worker    ori a6, a6, 0xc0
52*c0909341SAndroid Build Coastguard Worker
53*c0909341SAndroid Build Coastguard Worker1:
54*c0909341SAndroid Build Coastguard Worker    sub t3, t0, t1
55*c0909341SAndroid Build Coastguard Worker    vsetvl zero, t1, a6
56*c0909341SAndroid Build Coastguard Worker    vlse8.v v0, (a1), t5
57*c0909341SAndroid Build Coastguard Worker    sh1add a1, t1, a1
58*c0909341SAndroid Build Coastguard Worker    vlse8.v v8, (t4), t5
59*c0909341SAndroid Build Coastguard Worker    sh1add t4, t1, t4
60*c0909341SAndroid Build Coastguard Worker    vmacc.vx v0, a7, v8
61*c0909341SAndroid Build Coastguard Worker    vse8.v v0, (a0)
62*c0909341SAndroid Build Coastguard Worker    add a0, a0, t1
63*c0909341SAndroid Build Coastguard Worker    ble t3, zero, 4f
64*c0909341SAndroid Build Coastguard Worker
65*c0909341SAndroid Build Coastguard Worker    lbu a4, -1(a1)
66*c0909341SAndroid Build Coastguard Worker    mul a4, a4, t6
67*c0909341SAndroid Build Coastguard Worker    vsetvl zero, t3, a6
68*c0909341SAndroid Build Coastguard Worker    vmv.v.x v0, a4
69*c0909341SAndroid Build Coastguard Worker    vse8.v v0, (a0)
70*c0909341SAndroid Build Coastguard Worker    add a0, a0, t3
71*c0909341SAndroid Build Coastguard Worker4:
72*c0909341SAndroid Build Coastguard Worker    addi t2, t2, -1
73*c0909341SAndroid Build Coastguard Worker    add a1, a1, a2
74*c0909341SAndroid Build Coastguard Worker    add t4, t4, a2
75*c0909341SAndroid Build Coastguard Worker    bnez t2, 1b
76*c0909341SAndroid Build Coastguard Worker
77*c0909341SAndroid Build Coastguard Worker    sub t1, a3, a5
78*c0909341SAndroid Build Coastguard Worker
79*c0909341SAndroid Build Coastguard Worker    sub t2, a0, t0
80*c0909341SAndroid Build Coastguard Worker    ble t1, zero, 7f
81*c0909341SAndroid Build Coastguard Worker
82*c0909341SAndroid Build Coastguard Worker    vsetvl zero, t0, a6
83*c0909341SAndroid Build Coastguard Worker    vle8.v v0, (t2)
84*c0909341SAndroid Build Coastguard Worker    add t2, a0, t0
85*c0909341SAndroid Build Coastguard Worker5:
86*c0909341SAndroid Build Coastguard Worker    addi t1, t1, -2
87*c0909341SAndroid Build Coastguard Worker    vse8.v v0, (a0)
88*c0909341SAndroid Build Coastguard Worker    vse8.v v0, (t2)
89*c0909341SAndroid Build Coastguard Worker    sh1add a0, t0, a0
90*c0909341SAndroid Build Coastguard Worker    sh1add t2, t0, t2
91*c0909341SAndroid Build Coastguard Worker
92*c0909341SAndroid Build Coastguard Worker    bnez t1, 5b
93*c0909341SAndroid Build Coastguard Worker7:
94*c0909341SAndroid Build Coastguard Worker    ret
95*c0909341SAndroid Build Coastguard Workerendfunc
96