comparison ps2/dsputil_mmi.c @ 772:311ac50375e4 libavcodec

dsputil mmi cleanup patch by (Leon van Stuivenberg <leonvs at iae dot nl>)
author michaelni
date Sun, 27 Oct 2002 09:20:48 +0000
parents 71f669e9f633
children 3c6df37177dd
comparison
equal deleted inserted replaced
771:d4cc92144266 772:311ac50375e4
20 */ 20 */
21 21
22 #include "../dsputil.h" 22 #include "../dsputil.h"
23 #include "mmi.h" 23 #include "mmi.h"
24 24
25 /* the provided 'as' in binutils 2.9EE doesn't support
26 the EE's mips3 instructions properly */
27 #define AS_BUGGY
28
29 25
30 static void clear_blocks_mmi(DCTELEM * blocks) 26 static void clear_blocks_mmi(DCTELEM * blocks)
31 { 27 {
32 int i; 28 int i;
33 for (i = 0; i < 6; i++) { 29 for (i = 0; i < 6; i++) {
47 43
48 static void get_pixels_mmi(DCTELEM *block, const UINT8 *pixels, int line_size) 44 static void get_pixels_mmi(DCTELEM *block, const UINT8 *pixels, int line_size)
49 { 45 {
50 int i; 46 int i;
51 for(i=0;i<8;i++) { 47 for(i=0;i<8;i++) {
52 #ifdef AS_BUGGY
53 ld3(5, 0, 8);
54 asm volatile( 48 asm volatile(
55 "add %1, %1, %2 \n\t" 49 ".set push \n\t"
56 "pextlb $8, $0, $8 \n\t" 50 ".set mips3 \n\t"
57 "sq $8, 0(%0) \n\t" :: "r" (block), "r" (pixels), "r" (line_size) : "$8", "memory" );
58 #else
59 asm volatile(
60 "ld $8, 0(%1) \n\t" 51 "ld $8, 0(%1) \n\t"
61 "add %1, %1, %2 \n\t" 52 "add %1, %1, %2 \n\t"
62 "pextlb $8, $0, $8 \n\t" 53 "pextlb $8, $0, $8 \n\t"
63 "sq $8, 0(%0) \n\t" :: "r" (block), "r" (pixels), "r" (line_size) : "$8", "memory" ); 54 "sq $8, 0(%0) \n\t"
64 #endif 55 ".set pop \n\t"
56 :: "r" (block), "r" (pixels), "r" (line_size) : "$8", "memory" );
65 block += 8; 57 block += 8;
66 } 58 }
67 } 59 }
68 60
69 61
70 static void put_pixels8_mmi(uint8_t *block, const uint8_t *pixels, int line_size, int h) 62 static void put_pixels8_mmi(uint8_t *block, const uint8_t *pixels, int line_size, int h)
71 { 63 {
72 int i; 64 int i;
73 for(i=0; i<h; i++) { 65 for(i=0; i<h; i++) {
74 #ifdef AS_BUGGY
75 ldr3(5, 0, 8);
76 ldl3(5, 7, 8);
77 asm volatile ( "add $5, $5, $6 \n\t" );
78 sd3(8, 0, 4);
79 asm volatile ( "add $4, $4, $6 \n\t" );
80 #else
81 asm volatile( 66 asm volatile(
67 ".set push \n\t"
68 ".set mips3 \n\t"
82 "ldr $8, 0(%1) \n\t" 69 "ldr $8, 0(%1) \n\t"
83 "ldl $8, 7(%1) \n\t" 70 "ldl $8, 7(%1) \n\t"
84 "add %1, %1, %2 \n\t" 71 "add %1, %1, %2 \n\t"
85 "sd $8, 0(%0) \n\t" 72 "sd $8, 0(%0) \n\t"
86 "add %0, %0, %2 \n\t" :: "r" (block), "r" (pixels), "r" (line_size) : "$8", "memory" ); 73 "add %0, %0, %2 \n\t"
87 #endif 74 ".set pop \n\t"
75 :: "r" (block), "r" (pixels), "r" (line_size) : "$8", "memory" );
88 } 76 }
89 } 77 }
90 78
91 79
92 static void put_pixels16_mmi(uint8_t *block, const uint8_t *pixels, int line_size, int h) 80 static void put_pixels16_mmi(uint8_t *block, const uint8_t *pixels, int line_size, int h)
93 { 81 {
94 int i; 82 int i;
95 for(i=0; i<h; i++) { 83 for(i=0; i<(h>>2); i++) {
96 #ifdef AS_BUGGY
97 ldr3(5, 0, 8);
98 ldl3(5, 7, 8);
99 ldr3(5, 8, 9);
100 ldl3(5, 15, 9);
101 asm volatile ( "add $5, $5, $6 \n\t" );
102 pcpyld($9, $8, $8);
103 sq($8, 0, $4);
104 asm volatile ( "add $4, $4, $6 \n\t" );
105 #else
106 asm volatile ( 84 asm volatile (
107 "ldr $8, 0(%1) \n\t" 85 ".set push \n\t"
108 "ldl $8, 7(%1) \n\t" 86 ".set mips3 \n\t"
109 "ldr $9, 8(%1) \n\t" 87 #define PUTPIX16 \
110 "ldl $9, 15(%1) \n\t" 88 "ldr $8, 0(%1) \n\t" \
111 "add %1, %1, %2 \n\t" 89 "ldl $8, 7(%1) \n\t" \
112 "pcpyld $8, $9, $8 \n\t" 90 "ldr $9, 8(%1) \n\t" \
113 "sq $8, 0(%0) \n\t" 91 "ldl $9, 15(%1) \n\t" \
114 "add %0, %0, %2 \n\t" :: "r" (block), "r" (pixels), "r" (line_size) : "$8", "$9", "memory" ); 92 "add %1, %1, %2 \n\t" \
115 #endif 93 "pcpyld $8, $9, $8 \n\t" \
94 "sq $8, 0(%0) \n\t" \
95 "add %0, %0, %2 \n\t"
96 PUTPIX16
97 PUTPIX16
98 PUTPIX16
99 PUTPIX16
100 ".set pop \n\t"
101 :: "r" (block), "r" (pixels), "r" (line_size) : "$8", "$9", "memory" );
116 } 102 }
117 } 103 }
118 104
119 105
120 void dsputil_init_mmi(void) 106 void dsputil_init_mmi(void)