Imported Upstream version 6.1
[platform/upstream/ffmpeg.git] / libswscale / loongarch / input.S
1 /*
2  * Loongson LSX optimized swscale
3  *
4  * Copyright (c) 2023 Loongson Technology Corporation Limited
5  * Contributed by Lu Wang <wanglu@loongson.cn>
6  *
7  * This file is part of FFmpeg.
8  *
9  * FFmpeg is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 2.1 of the License, or (at your option) any later version.
13  *
14  * FFmpeg is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with FFmpeg; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22  */
23
24 #include "libavcodec/loongarch/loongson_asm.S"
25
26 /* void planar_rgb_to_y_lsx(uint8_t *_dst, const uint8_t *src[4],
27  *                          int width, int32_t *rgb2yuv)
28  */
29 function planar_rgb_to_y_lsx
30     ld.d            a5,     a1,    0
31     ld.d            a6,     a1,    8
32     ld.d            a7,     a1,    16
33
34     ld.w            t1,     a3,    0     // ry
35     ld.w            t2,     a3,    4     // gy
36     ld.w            t3,     a3,    8     // by
37     li.w            t4,     9
38     li.w            t5,     524544
39     li.w            t7,     4
40     li.w            t8,     8
41     vldi            vr7,    0
42     vreplgr2vr.w    vr1,    t1
43     vreplgr2vr.w    vr2,    t2
44     vreplgr2vr.w    vr3,    t3
45     vreplgr2vr.w    vr4,    t4
46     vreplgr2vr.w    vr5,    t5
47     bge             a2,     t8,    .WIDTH8
48     bge             a2,     t7,    .WIDTH4
49     blt             zero,   a2,    .WIDTH
50     b               .END
51
52 .WIDTH8:
53     vld             vr8,    a5,    0
54     vld             vr9,    a6,    0
55     vld             vr10,   a7,    0
56     vilvl.b         vr11,   vr7,   vr8
57     vilvl.b         vr12,   vr7,   vr9
58     vilvl.b         vr13,   vr7,   vr10
59     vilvl.h         vr14,   vr7,   vr11
60     vilvl.h         vr15,   vr7,   vr12
61     vilvl.h         vr16,   vr7,   vr13
62     vilvh.h         vr17,   vr7,   vr11
63     vilvh.h         vr18,   vr7,   vr12
64     vilvh.h         vr19,   vr7,   vr13
65     vmul.w          vr20,   vr1,   vr16
66     vmul.w          vr21,   vr1,   vr19
67     vmadd.w         vr20,   vr2,   vr14
68     vmadd.w         vr20,   vr3,   vr15
69     vmadd.w         vr21,   vr2,   vr17
70     vmadd.w         vr21,   vr3,   vr18
71     vadd.w          vr20,   vr20,  vr5
72     vadd.w          vr21,   vr21,  vr5
73     vsra.w          vr20,   vr20,  vr4
74     vsra.w          vr21,   vr21,  vr4
75     vpickev.h       vr20,   vr21,  vr20
76     vst             vr20,   a0,    0
77     addi.d          a2,     a2,    -8
78     addi.d          a5,     a5,    8
79     addi.d          a6,     a6,    8
80     addi.d          a7,     a7,    8
81     addi.d          a0,     a0,    16
82     bge             a2,     t8,    .WIDTH8
83     bge             a2,     t7,    .WIDTH4
84     blt             zero,   a2,    .WIDTH
85     b               .END
86
87 .WIDTH4:
88     vld             vr8,    a5,    0
89     vld             vr9,    a6,    0
90     vld             vr10,   a7,    0
91     vilvl.b         vr11,   vr7,   vr8
92     vilvl.b         vr12,   vr7,   vr9
93     vilvl.b         vr13,   vr7,   vr10
94     vilvl.h         vr14,   vr7,   vr11
95     vilvl.h         vr15,   vr7,   vr12
96     vilvl.h         vr16,   vr7,   vr13
97     vmul.w          vr17,   vr1,   vr16
98     vmadd.w         vr17,   vr2,   vr14
99     vmadd.w         vr17,   vr3,   vr15
100     vadd.w          vr17,   vr17,  vr5
101     vsra.w          vr17,   vr17,  vr4
102     vpickev.h       vr17,   vr17,  vr17
103     vstelm.d        vr17,   a0,    0,    0
104     addi.d          a2,     a2,    -4
105     addi.d          a5,     a5,    4
106     addi.d          a6,     a6,    4
107     addi.d          a7,     a7,    4
108     addi.d          a0,     a0,    8
109     bge             a2,     t7,    .WIDTH4
110     blt             zero,   a2,    .WIDTH
111     b               .END
112
113 .WIDTH:
114     ld.bu           t0,     a5,    0
115     ld.bu           t4,     a6,    0
116     ld.bu           t6,     a7,    0
117     mul.w           t8,     t6,    t1
118     mul.w           t7,     t0,    t2
119     add.w           t8,     t8,    t7
120     mul.w           t7,     t4,    t3
121     add.w           t8,     t8,    t7
122     add.w           t8,     t8,    t5
123     srai.w          t8,     t8,    9
124     st.h            t8,     a0,    0
125     addi.d          a2,     a2,    -1
126     addi.d          a5,     a5,    1
127     addi.d          a6,     a6,    1
128     addi.d          a7,     a7,    1
129     addi.d          a0,     a0,    2
130     blt             zero,   a2,    .WIDTH
131 .END:
132 endfunc
133
134 /* void planar_rgb_to_uv_lsx(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *src[4],
135  *                           int width, int32_t *rgb2yuv)
136  */
137 function planar_rgb_to_uv_lsx
138     addi.d          sp,     sp,    -24
139     st.d            s1,     sp,    0
140     st.d            s2,     sp,    8
141     st.d            s3,     sp,    16
142
143     ld.d            a5,     a2,    0
144     ld.d            a6,     a2,    8
145     ld.d            a7,     a2,    16
146     ld.w            t1,     a4,    12     // ru
147     ld.w            t2,     a4,    16     // gu
148     ld.w            t3,     a4,    20     // bu
149     ld.w            s1,     a4,    24     // rv
150     ld.w            s2,     a4,    28     // gv
151     ld.w            s3,     a4,    32     // bv
152     li.w            t4,     9
153     li.w            t5,     4194560
154     li.w            t7,     4
155     li.w            t8,     8
156     vldi            vr0,    0
157     vreplgr2vr.w    vr1,    t1
158     vreplgr2vr.w    vr2,    t2
159     vreplgr2vr.w    vr3,    t3
160     vreplgr2vr.w    vr4,    s1
161     vreplgr2vr.w    vr5,    s2
162     vreplgr2vr.w    vr6,    s3
163     vreplgr2vr.w    vr7,    t4
164     vreplgr2vr.w    vr8,    t5
165     bge             a2,     t8,    .LOOP_WIDTH8
166     bge             a2,     t7,    .LOOP_WIDTH4
167     blt             zero,   a2,    .LOOP_WIDTH
168     b               .LOOP_END
169
170 .LOOP_WIDTH8:
171     vld             vr9,    a5,    0
172     vld             vr10,   a6,    0
173     vld             vr11,   a7,    0
174     vilvl.b         vr9,    vr0,   vr9
175     vilvl.b         vr10,   vr0,   vr10
176     vilvl.b         vr11,   vr0,   vr11
177     vilvl.h         vr12,   vr0,   vr9
178     vilvl.h         vr13,   vr0,   vr10
179     vilvl.h         vr14,   vr0,   vr11
180     vilvh.h         vr15,   vr0,   vr9
181     vilvh.h         vr16,   vr0,   vr10
182     vilvh.h         vr17,   vr0,   vr11
183     vmul.w          vr18,   vr1,   vr14
184     vmul.w          vr19,   vr1,   vr17
185     vmul.w          vr20,   vr4,   vr14
186     vmul.w          vr21,   vr4,   vr17
187     vmadd.w         vr18,   vr2,   vr12
188     vmadd.w         vr18,   vr3,   vr13
189     vmadd.w         vr19,   vr2,   vr15
190     vmadd.w         vr19,   vr3,   vr16
191     vmadd.w         vr20,   vr5,   vr12
192     vmadd.w         vr20,   vr6,   vr13
193     vmadd.w         vr21,   vr5,   vr15
194     vmadd.w         vr21,   vr6,   vr16
195     vadd.w          vr18,   vr18,  vr8
196     vadd.w          vr19,   vr19,  vr8
197     vadd.w          vr20,   vr20,  vr8
198     vadd.w          vr21,   vr21,  vr8
199     vsra.w          vr18,   vr18,  vr7
200     vsra.w          vr19,   vr19,  vr7
201     vsra.w          vr20,   vr20,  vr7
202     vsra.w          vr21,   vr21,  vr7
203     vpickev.h       vr18,   vr19,  vr18
204     vpickev.h       vr20,   vr21,  vr20
205     vst             vr18,   a0,    0
206     vst             vr20,   a1,    0
207     addi.d          a3,     a3,    -8
208     addi.d          a5,     a5,    8
209     addi.d          a6,     a6,    8
210     addi.d          a7,     a7,    8
211     addi.d          a0,     a0,    16
212     addi.d          a1,     a1,    16
213     bge             a3,     t8,    .LOOP_WIDTH8
214     bge             a3,     t7,    .LOOP_WIDTH4
215     blt             zero,   a3,    .LOOP_WIDTH
216     b               .LOOP_END
217
218 .LOOP_WIDTH4:
219     vld             vr9,    a5,    0
220     vld             vr10,   a6,    0
221     vld             vr11,   a7,    0
222     vilvl.b         vr9,    vr0,   vr9
223     vilvl.b         vr10,   vr0,   vr10
224     vilvl.b         vr11,   vr0,   vr11
225     vilvl.h         vr12,   vr0,   vr9
226     vilvl.h         vr13,   vr0,   vr10
227     vilvl.h         vr14,   vr0,   vr11
228     vmul.w          vr18,   vr1,   vr14
229     vmul.w          vr19,   vr4,   vr14
230     vmadd.w         vr18,   vr2,   vr12
231     vmadd.w         vr18,   vr3,   vr13
232     vmadd.w         vr19,   vr5,   vr12
233     vmadd.w         vr19,   vr6,   vr13
234     vadd.w          vr18,   vr18,  vr8
235     vadd.w          vr19,   vr19,  vr8
236     vsra.w          vr18,   vr18,  vr7
237     vsra.w          vr19,   vr19,  vr7
238     vpickev.h       vr18,   vr18,  vr18
239     vpickev.h       vr19,   vr19,  vr19
240     vstelm.d        vr18,   a0,    0,    0
241     vstelm.d        vr19,   a1,    0,    0
242     addi.d          a3,     a3,    -4
243     addi.d          a5,     a5,    4
244     addi.d          a6,     a6,    4
245     addi.d          a7,     a7,    4
246     addi.d          a0,     a0,    8
247     addi.d          a1,     a1,    8
248     bge             a3,     t7,    .LOOP_WIDTH4
249     blt             zero,   a3,    .LOOP_WIDTH
250     b               .LOOP_END
251
252 .LOOP_WIDTH:
253     ld.bu           t0,     a5,    0
254     ld.bu           t4,     a6,    0
255     ld.bu           t6,     a7,    0
256     mul.w           t8,     t6,    t1
257     mul.w           t7,     t0,    t2
258     add.w           t8,     t8,    t7
259     mul.w           t7,     t4,    t3
260     add.w           t8,     t8,    t7
261     add.w           t8,     t8,    t5
262     srai.w          t8,     t8,    9
263     st.h            t8,     a0,    0
264     mul.w           t8,     t6,    s1
265     mul.w           t7,     t0,    s2
266     add.w           t8,     t8,    t7
267     mul.w           t7,     t4,    s3
268     add.w           t8,     t8,    t7
269     add.w           t8,     t8,    t5
270     srai.w          t8,     t8,    9
271     st.h            t8,     a1,    0
272     addi.d          a3,     a3,    -1
273     addi.d          a5,     a5,    1
274     addi.d          a6,     a6,    1
275     addi.d          a7,     a7,    1
276     addi.d          a0,     a0,    2
277     addi.d          a1,     a1,    2
278     blt             zero,   a3,    .LOOP_WIDTH
279
280 .LOOP_END:
281     ld.d            s1,     sp,    0
282     ld.d            s2,     sp,    8
283     ld.d            s3,     sp,    16
284     addi.d          sp,     sp,    24
285 endfunc