Mercurial > libavcodec.hg
comparison sh4/dsputil_sh4.c @ 1259:e8c3884f2c7e libavcodec
sh4 optimized idct & bswap patch by (BERO <bero at geocities dot co dot jp>)
author | michaelni |
---|---|
date | Wed, 14 May 2003 12:18:49 +0000 |
parents | |
children | bc68a29d0dd1 |
comparison
equal
deleted
inserted
replaced
1258:802614404398 | 1259:e8c3884f2c7e |
---|---|
1 /* | |
2 * sh4 dsputil | |
3 * | |
4 * Copyright (c) 2003 BERO <bero@geocities.co.jp> | |
5 * | |
6 * This library is free software; you can redistribute it and/or | |
7 * modify it under the terms of the GNU Lesser General Public | |
8 * License as published by the Free Software Foundation; either | |
9 * version 2 of the License, or (at your option) any later version. | |
10 * | |
11 * This library is distributed in the hope that it will be useful, | |
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
14 * Lesser General Public License for more details. | |
15 * | |
16 * You should have received a copy of the GNU Lesser General Public | |
17 * License along with this library; if not, write to the Free Software | |
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
19 */ | |
20 | |
21 #include "../avcodec.h" | |
22 #include "../dsputil.h" | |
23 | |
24 static void memzero_align8(void *dst,size_t size) | |
25 { | |
26 #if defined(__SH4__) || defined(__SH4_SINGLE__) || defined(__SH4_SINGLE_ONLY__) | |
27 (char*)dst+=size; | |
28 size/=8*4; | |
29 asm( | |
30 #if defined(__SH4__) | |
31 " fschg\n" //single float mode | |
32 #endif | |
33 " fldi0 fr0\n" | |
34 " fldi0 fr1\n" | |
35 " fschg\n" // double | |
36 "1: \n" \ | |
37 " dt %1\n" | |
38 " fmov dr0,@-%0\n" | |
39 " fmov dr0,@-%0\n" | |
40 " fmov dr0,@-%0\n" | |
41 " bf.s 1b\n" | |
42 " fmov dr0,@-%0\n" | |
43 #if defined(__SH4_SINGLE__) || defined(__SH4_SINGLE_ONLY__) | |
44 " fschg" //back to single | |
45 #endif | |
46 : : "r"(dst),"r"(size): "memory" ); | |
47 #else | |
48 double *d = dst; | |
49 size/=8*4; | |
50 do { | |
51 d[0] = 0.0; | |
52 d[1] = 0.0; | |
53 d[2] = 0.0; | |
54 d[3] = 0.0; | |
55 d+=4; | |
56 } while(--size); | |
57 #endif | |
58 } | |
59 | |
60 static void clear_blocks_sh4(DCTELEM *blocks) | |
61 { | |
62 // if (((int)blocks&7)==0) | |
63 memzero_align8(blocks,sizeof(DCTELEM)*6*64); | |
64 } | |
65 | |
66 extern void idct_sh4(DCTELEM *block); | |
67 static void idct_put(uint8_t *dest, int line_size, DCTELEM *block) | |
68 { | |
69 idct_sh4(block); | |
70 int i; | |
71 uint8_t *cm = cropTbl + MAX_NEG_CROP; | |
72 for(i=0;i<8;i++) { | |
73 dest[0] = cm[block[0]]; | |
74 dest[1] = cm[block[1]]; | |
75 dest[2] = cm[block[2]]; | |
76 dest[3] = cm[block[3]]; | |
77 dest[4] = cm[block[4]]; | |
78 dest[5] = cm[block[5]]; | |
79 dest[6] = cm[block[6]]; | |
80 dest[7] = cm[block[7]]; | |
81 dest+=line_size; | |
82 block+=8; | |
83 } | |
84 } | |
85 static void idct_add(uint8_t *dest, int line_size, DCTELEM *block) | |
86 { | |
87 idct_sh4(block); | |
88 int i; | |
89 uint8_t *cm = cropTbl + MAX_NEG_CROP; | |
90 for(i=0;i<8;i++) { | |
91 dest[0] = cm[dest[0]+block[0]]; | |
92 dest[1] = cm[dest[1]+block[1]]; | |
93 dest[2] = cm[dest[2]+block[2]]; | |
94 dest[3] = cm[dest[3]+block[3]]; | |
95 dest[4] = cm[dest[4]+block[4]]; | |
96 dest[5] = cm[dest[5]+block[5]]; | |
97 dest[6] = cm[dest[6]+block[6]]; | |
98 dest[7] = cm[dest[7]+block[7]]; | |
99 dest+=line_size; | |
100 block+=8; | |
101 } | |
102 } | |
103 | |
104 extern void dsputil_init_align(DSPContext* c, AVCodecContext *avctx); | |
105 | |
106 void dsputil_init_sh4(DSPContext* c, AVCodecContext *avctx) | |
107 { | |
108 dsputil_init_align(c,avctx); | |
109 | |
110 c->clear_blocks = clear_blocks_sh4; | |
111 c->idct_put = idct_put; | |
112 c->idct_add = idct_add; | |
113 c->idct_permutation_type= FF_NO_IDCT_PERM; //FF_SIMPLE_IDCT_PERM; //FF_LIBMPEG2_IDCT_PERM; | |
114 } |