1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * ARM-NEON-optimized IDCT functions
3cabdff1aSopenharmony_ci * Copyright (c) 2008 Mans Rullgard <mans@mansr.com>
4cabdff1aSopenharmony_ci *
5cabdff1aSopenharmony_ci * This file is part of FFmpeg.
6cabdff1aSopenharmony_ci *
7cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or
8cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public
9cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either
10cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version.
11cabdff1aSopenharmony_ci *
12cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
13cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
14cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15cabdff1aSopenharmony_ci * Lesser General Public License for more details.
16cabdff1aSopenharmony_ci *
17cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public
18cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software
19cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20cabdff1aSopenharmony_ci */
21cabdff1aSopenharmony_ci
22cabdff1aSopenharmony_ci#include "libavutil/arm/asm.S"
23cabdff1aSopenharmony_ci
24cabdff1aSopenharmony_cifunction ff_put_pixels_clamped_neon, export=1
25cabdff1aSopenharmony_ci        vld1.16         {d16-d19}, [r0,:128]!
26cabdff1aSopenharmony_ci        vqmovun.s16     d0, q8
27cabdff1aSopenharmony_ci        vld1.16         {d20-d23}, [r0,:128]!
28cabdff1aSopenharmony_ci        vqmovun.s16     d1, q9
29cabdff1aSopenharmony_ci        vld1.16         {d24-d27}, [r0,:128]!
30cabdff1aSopenharmony_ci        vqmovun.s16     d2, q10
31cabdff1aSopenharmony_ci        vld1.16         {d28-d31}, [r0,:128]!
32cabdff1aSopenharmony_ci        vqmovun.s16     d3, q11
33cabdff1aSopenharmony_ci        vst1.8          {d0},      [r1,:64], r2
34cabdff1aSopenharmony_ci        vqmovun.s16     d4, q12
35cabdff1aSopenharmony_ci        vst1.8          {d1},      [r1,:64], r2
36cabdff1aSopenharmony_ci        vqmovun.s16     d5, q13
37cabdff1aSopenharmony_ci        vst1.8          {d2},      [r1,:64], r2
38cabdff1aSopenharmony_ci        vqmovun.s16     d6, q14
39cabdff1aSopenharmony_ci        vst1.8          {d3},      [r1,:64], r2
40cabdff1aSopenharmony_ci        vqmovun.s16     d7, q15
41cabdff1aSopenharmony_ci        vst1.8          {d4},      [r1,:64], r2
42cabdff1aSopenharmony_ci        vst1.8          {d5},      [r1,:64], r2
43cabdff1aSopenharmony_ci        vst1.8          {d6},      [r1,:64], r2
44cabdff1aSopenharmony_ci        vst1.8          {d7},      [r1,:64], r2
45cabdff1aSopenharmony_ci        bx              lr
46cabdff1aSopenharmony_ciendfunc
47cabdff1aSopenharmony_ci
48cabdff1aSopenharmony_cifunction ff_put_signed_pixels_clamped_neon, export=1
49cabdff1aSopenharmony_ci        vmov.u8         d31, #128
50cabdff1aSopenharmony_ci        vld1.16         {d16-d17}, [r0,:128]!
51cabdff1aSopenharmony_ci        vqmovn.s16      d0, q8
52cabdff1aSopenharmony_ci        vld1.16         {d18-d19}, [r0,:128]!
53cabdff1aSopenharmony_ci        vqmovn.s16      d1, q9
54cabdff1aSopenharmony_ci        vld1.16         {d16-d17}, [r0,:128]!
55cabdff1aSopenharmony_ci        vqmovn.s16      d2, q8
56cabdff1aSopenharmony_ci        vld1.16         {d18-d19}, [r0,:128]!
57cabdff1aSopenharmony_ci        vadd.u8         d0, d0, d31
58cabdff1aSopenharmony_ci        vld1.16         {d20-d21}, [r0,:128]!
59cabdff1aSopenharmony_ci        vadd.u8         d1, d1, d31
60cabdff1aSopenharmony_ci        vld1.16         {d22-d23}, [r0,:128]!
61cabdff1aSopenharmony_ci        vadd.u8         d2, d2, d31
62cabdff1aSopenharmony_ci        vst1.8          {d0},      [r1,:64], r2
63cabdff1aSopenharmony_ci        vqmovn.s16      d3, q9
64cabdff1aSopenharmony_ci        vst1.8          {d1},      [r1,:64], r2
65cabdff1aSopenharmony_ci        vqmovn.s16      d4, q10
66cabdff1aSopenharmony_ci        vst1.8          {d2},      [r1,:64], r2
67cabdff1aSopenharmony_ci        vqmovn.s16      d5, q11
68cabdff1aSopenharmony_ci        vld1.16         {d24-d25}, [r0,:128]!
69cabdff1aSopenharmony_ci        vadd.u8         d3, d3, d31
70cabdff1aSopenharmony_ci        vld1.16         {d26-d27}, [r0,:128]!
71cabdff1aSopenharmony_ci        vadd.u8         d4, d4, d31
72cabdff1aSopenharmony_ci        vadd.u8         d5, d5, d31
73cabdff1aSopenharmony_ci        vst1.8          {d3},      [r1,:64], r2
74cabdff1aSopenharmony_ci        vqmovn.s16      d6, q12
75cabdff1aSopenharmony_ci        vst1.8          {d4},      [r1,:64], r2
76cabdff1aSopenharmony_ci        vqmovn.s16      d7, q13
77cabdff1aSopenharmony_ci        vst1.8          {d5},      [r1,:64], r2
78cabdff1aSopenharmony_ci        vadd.u8         d6, d6, d31
79cabdff1aSopenharmony_ci        vadd.u8         d7, d7, d31
80cabdff1aSopenharmony_ci        vst1.8          {d6},      [r1,:64], r2
81cabdff1aSopenharmony_ci        vst1.8          {d7},      [r1,:64], r2
82cabdff1aSopenharmony_ci        bx              lr
83cabdff1aSopenharmony_ciendfunc
84cabdff1aSopenharmony_ci
85cabdff1aSopenharmony_cifunction ff_add_pixels_clamped_neon, export=1
86cabdff1aSopenharmony_ci        mov             r3, r1
87cabdff1aSopenharmony_ci        vld1.8          {d16},   [r1,:64], r2
88cabdff1aSopenharmony_ci        vld1.16         {d0-d1}, [r0,:128]!
89cabdff1aSopenharmony_ci        vaddw.u8        q0, q0, d16
90cabdff1aSopenharmony_ci        vld1.8          {d17},   [r1,:64], r2
91cabdff1aSopenharmony_ci        vld1.16         {d2-d3}, [r0,:128]!
92cabdff1aSopenharmony_ci        vqmovun.s16     d0, q0
93cabdff1aSopenharmony_ci        vld1.8          {d18},   [r1,:64], r2
94cabdff1aSopenharmony_ci        vaddw.u8        q1, q1, d17
95cabdff1aSopenharmony_ci        vld1.16         {d4-d5}, [r0,:128]!
96cabdff1aSopenharmony_ci        vaddw.u8        q2, q2, d18
97cabdff1aSopenharmony_ci        vst1.8          {d0},    [r3,:64], r2
98cabdff1aSopenharmony_ci        vqmovun.s16     d2, q1
99cabdff1aSopenharmony_ci        vld1.8          {d19},   [r1,:64], r2
100cabdff1aSopenharmony_ci        vld1.16         {d6-d7}, [r0,:128]!
101cabdff1aSopenharmony_ci        vaddw.u8        q3, q3, d19
102cabdff1aSopenharmony_ci        vqmovun.s16     d4, q2
103cabdff1aSopenharmony_ci        vst1.8          {d2},    [r3,:64], r2
104cabdff1aSopenharmony_ci        vld1.8          {d16},   [r1,:64], r2
105cabdff1aSopenharmony_ci        vqmovun.s16     d6, q3
106cabdff1aSopenharmony_ci        vld1.16         {d0-d1}, [r0,:128]!
107cabdff1aSopenharmony_ci        vaddw.u8        q0, q0, d16
108cabdff1aSopenharmony_ci        vst1.8          {d4},    [r3,:64], r2
109cabdff1aSopenharmony_ci        vld1.8          {d17},   [r1,:64], r2
110cabdff1aSopenharmony_ci        vld1.16         {d2-d3}, [r0,:128]!
111cabdff1aSopenharmony_ci        vaddw.u8        q1, q1, d17
112cabdff1aSopenharmony_ci        vst1.8          {d6},    [r3,:64], r2
113cabdff1aSopenharmony_ci        vqmovun.s16     d0, q0
114cabdff1aSopenharmony_ci        vld1.8          {d18},   [r1,:64], r2
115cabdff1aSopenharmony_ci        vld1.16         {d4-d5}, [r0,:128]!
116cabdff1aSopenharmony_ci        vaddw.u8        q2, q2, d18
117cabdff1aSopenharmony_ci        vst1.8          {d0},    [r3,:64], r2
118cabdff1aSopenharmony_ci        vqmovun.s16     d2, q1
119cabdff1aSopenharmony_ci        vld1.8          {d19},   [r1,:64], r2
120cabdff1aSopenharmony_ci        vqmovun.s16     d4, q2
121cabdff1aSopenharmony_ci        vld1.16         {d6-d7}, [r0,:128]!
122cabdff1aSopenharmony_ci        vaddw.u8        q3, q3, d19
123cabdff1aSopenharmony_ci        vst1.8          {d2},    [r3,:64], r2
124cabdff1aSopenharmony_ci        vqmovun.s16     d6, q3
125cabdff1aSopenharmony_ci        vst1.8          {d4},    [r3,:64], r2
126cabdff1aSopenharmony_ci        vst1.8          {d6},    [r3,:64], r2
127cabdff1aSopenharmony_ci        bx              lr
128cabdff1aSopenharmony_ciendfunc
129