Assembly version of put_pixels. This is currently the function that
[ffmpeg.git] / libavcodec / alpha / dsputil_alpha_asm.S
1 /*
2  * Alpha optimized DSP utils
3  * Copyright (c) 2002 Falk Hueffner <falk@debian.org>
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18  */
19
20 /*
21  * These functions are scheduled for pca56. They should work
22  * reasonably on ev6, though.
23  */
24
25 #include "regdef.h"
26 #ifdef HAVE_AV_CONFIG_H 
27 #include "config.h"
28 #endif
29
30 /* Some nicer register names.  */
31 #define ta t10
32 #define tb t11
33 #define tc t12
34 #define td AT
35 /* Danger: these overlap with the argument list and the return value */
36 #define te a5
37 #define tf a4
38 #define tg a3
39 #define th v0
40                 
41         .set noat
42         .set noreorder
43         .arch pca56
44         .text
45
46 /************************************************************************
47  * void put_pixels_axp_asm(uint8_t *block, const uint8_t *pixels,
48  *                         int line_size, int h)
49  */
50         .align 6
51         .globl put_pixels_axp_asm
52         .ent put_pixels_axp_asm
53 put_pixels_axp_asm:
54         .frame sp, 0, ra
55         .prologue 0
56
57 #ifdef HAVE_GPROF
58         lda     AT, _mcount
59         jsr     AT, (AT), _mcount
60 #endif
61
62         and     a1, 7, t0
63         beq     t0, $aligned
64
65         .align 4
66 $unaligned:
67         ldq_u   t0, 0(a1)
68         ldq_u   t1, 8(a1)
69         addq    a1, a2, a1
70         nop
71
72         ldq_u   t2, 0(a1)
73         ldq_u   t3, 8(a1)
74         addq    a1, a2, a1
75         nop
76
77         ldq_u   t4, 0(a1)
78         ldq_u   t5, 8(a1)
79         addq    a1, a2, a1
80         nop
81
82         ldq_u   t6, 0(a1)
83         ldq_u   t7, 8(a1)
84         extql   t0, a1, t0
85         addq    a1, a2, a1
86
87         extqh   t1, a1, t1
88         addq    a0, a2, t8
89         extql   t2, a1, t2
90         addq    t8, a2, t9
91
92         extqh   t3, a1, t3
93         addq    t9, a2, ta
94         extql   t4, a1, t4
95         or      t0, t1, t0
96
97         extqh   t5, a1, t5
98         or      t2, t3, t2
99         extql   t6, a1, t6
100         or      t4, t5, t4
101
102         extqh   t7, a1, t7
103         or      t6, t7, t6
104         stq     t0, 0(a0)
105         stq     t2, 0(t8)
106
107         stq     t4, 0(t9)
108         subq    a3, 4, a3
109         stq     t6, 0(ta)
110         addq    ta, a2, a0
111
112         bne     a3, $unaligned
113         ret
114
115         .align 4
116 $aligned:
117         ldq     t0, 0(a1)
118         addq    a1, a2, a1
119         ldq     t1, 0(a1)
120         addq    a1, a2, a1
121
122         ldq     t2, 0(a1)
123         addq    a1, a2, a1
124         ldq     t3, 0(a1)
125         addq    a1, a2, a1
126
127         ldq     t4, 0(a1)
128         addq    a1, a2, a1
129         ldq     t5, 0(a1)
130         addq    a1, a2, a1
131
132         ldq     t6, 0(a1)
133         addq    a1, a2, a1
134         ldq     t7, 0(a1)
135         addq    a1, a2, a1
136
137         addq    a0, a2, t8
138         stq     t0, 0(a0)
139         addq    t8, a2, t9
140         stq     t1, 0(t8)
141
142         addq    t9, a2, ta
143         stq     t2, 0(t9)
144         addq    ta, a2, tb
145         stq     t3, 0(ta)
146
147         addq    tb, a2, tc
148         stq     t4, 0(tb)
149         addq    tc, a2, td
150         stq     t5, 0(tc)
151
152         addq    td, a2, te
153         stq     t6, 0(td)
154         addq    te, a2, a0
155         stq     t7, 0(te)
156
157         subq    a3, 8, a3
158         bne     a3, $aligned
159
160         ret
161         .end put_pixels_axp_asm
162
163 /************************************************************************
164  * void put_pixels_clamped_mvi_asm(const DCTELEM *block, uint8_t *pixels, 
165  *                                 int line_size)
166  */
167         .align 6
168         .globl put_pixels_clamped_mvi_asm
169         .ent put_pixels_clamped_mvi_asm
170 put_pixels_clamped_mvi_asm:
171         .frame sp, 0, ra
172         .prologue 0
173
174 #ifdef HAVE_GPROF
175         lda     AT, _mcount
176         jsr     AT, (AT), _mcount
177 #endif
178
179         lda     t8, -1
180         lda     t9, 8           # loop counter
181         zap     t8, 0xaa, t8    # 00ff00ff00ff00ff
182
183         .align 4
184 1:      ldq     t0,  0(a0)
185         ldq     t1,  8(a0)
186         ldq     t2, 16(a0)
187         ldq     t3, 24(a0)
188
189         maxsw4  t0, zero, t0
190         subq    t9, 2, t9
191         maxsw4  t1, zero, t1
192         lda     a0, 32(a0)
193
194         maxsw4  t2, zero, t2
195         addq    a1, a2, ta
196         maxsw4  t3, zero, t3
197         minsw4  t0, t8, t0
198         
199         minsw4  t1, t8, t1
200         minsw4  t2, t8, t2
201         minsw4  t3, t8, t3
202         pkwb    t0, t0
203         
204         pkwb    t1, t1
205         pkwb    t2, t2
206         pkwb    t3, t3
207         stl     t0, 0(a1)
208         
209         stl     t1, 4(a1)
210         addq    ta, a2, a1
211         stl     t2, 0(ta)
212         stl     t3, 4(ta)
213
214         bne     t9, 1b
215         ret
216         .end put_pixels_clamped_mvi_asm
217
218 /************************************************************************
219  * void add_pixels_clamped_mvi_asm(const DCTELEM *block, uint8_t *pixels, 
220  *                                 int line_size)
221  */
222         .align 6
223         .globl add_pixels_clamped_mvi_asm
224         .ent add_pixels_clamped_mvi_asm
225 add_pixels_clamped_mvi_asm:
226         .frame sp, 0, ra
227         .prologue 0
228
229 #ifdef HAVE_GPROF
230         lda     AT, _mcount
231         jsr     AT, (AT), _mcount
232 #endif
233
234         lda     t1, -1
235         lda     th, 8
236         zap     t1, 0x33, tg
237         nop
238
239         srl     tg, 1, t0
240         xor     tg, t0, tg      # 0x8000800080008000
241         zap     t1, 0xaa, tf    # 0x00ff00ff00ff00ff
242
243         .align 4
244 1:      ldl     t1, 0(a1)       # pix0 (try to hit cache line soon)
245         ldl     t4, 4(a1)       # pix1
246         addq    a1, a2, te      # pixels += line_size
247         ldq     t0, 0(a0)       # shorts0
248
249         ldl     t7, 0(te)       # pix2 (try to hit cache line soon)
250         ldl     ta, 4(te)       # pix3
251         ldq     t3, 8(a0)       # shorts1
252         ldq     t6, 16(a0)      # shorts2
253
254         ldq     t9, 24(a0)      # shorts3
255         unpkbw  t1, t1          # 0 0 (quarter/op no.)
256         and     t0, tg, t2      # 0 1
257         unpkbw  t4, t4          # 1 0
258
259         bic     t0, tg, t0      # 0 2
260         unpkbw  t7, t7          # 2 0
261         and     t3, tg, t5      # 1 1
262         addq    t0, t1, t0      # 0 3 
263
264         xor     t0, t2, t0      # 0 4
265         unpkbw  ta, ta          # 3 0
266         and     t6, tg, t8      # 2 1
267         maxsw4  t0, zero, t0    # 0 5
268         
269         bic     t3, tg, t3      # 1 2
270         bic     t6, tg, t6      # 2 2
271         minsw4  t0, tf, t0      # 0 6
272         addq    t3, t4, t3      # 1 3
273         
274         pkwb    t0, t0          # 0 7
275         xor     t3, t5, t3      # 1 4
276         maxsw4  t3, zero, t3    # 1 5
277         addq    t6, t7, t6      # 2 3
278
279         xor     t6, t8, t6      # 2 4
280         and     t9, tg, tb      # 3 1
281         minsw4  t3, tf, t3      # 1 6
282         bic     t9, tg, t9      # 3 2
283
284         maxsw4  t6, zero, t6    # 2 5
285         addq    t9, ta, t9      # 3 3
286         stl     t0, 0(a1)       # 0 8   
287         minsw4  t6, tf, t6      # 2 6
288
289         xor     t9, tb, t9      # 3 4
290         maxsw4  t9, zero, t9    # 3 5
291         lda     a0, 32(a0)      # block += 16;
292         pkwb    t3, t3          # 1 7
293         
294         minsw4  t9, tf, t9      # 3 6
295         subq    th, 2, th
296         pkwb    t6, t6          # 2 7
297         pkwb    t9, t9          # 3 7
298
299         stl     t3, 4(a1)       # 1 8
300         addq    te, a2, a1      # pixels += line_size
301         stl     t6, 0(te)       # 2 8
302         stl     t9, 4(te)       # 3 8
303
304         bne     th, 1b
305         ret     
306         .end add_pixels_clamped_mvi_asm