linking. The FDPIC relocs also break for any other format. Thus check the compiler environment and select the appropriate sections/relocs. patch by Mike Frysinger, vapier.adi a gmail d com Originally committed as revision 12125 to svn://svn.ffmpeg.org/ffmpeg/trunktags/v0.5
@@ -35,10 +35,14 @@ DEFUN(put_pixels_clamped,mL1, | |||||
#ifndef DEFUN | #ifndef DEFUN | ||||
#define mL3 .text | |||||
#ifndef mL1 | #ifndef mL1 | ||||
#ifdef __FDPIC__ | |||||
#define mL1 .l1.text | #define mL1 .l1.text | ||||
#else | |||||
#define mL1 mL3 | |||||
#endif | |||||
#endif | #endif | ||||
#define mL3 .text | |||||
#define DEFUN(fname,where,interface) \ | #define DEFUN(fname,where,interface) \ | ||||
.section where; \ | .section where; \ | ||||
@@ -50,6 +54,11 @@ DEFUN(put_pixels_clamped,mL1, | |||||
#define DEFUN_END(fname) \ | #define DEFUN_END(fname) \ | ||||
.size _ff_bfin_ ## fname, . - _ff_bfin_ ## fname | .size _ff_bfin_ ## fname, . - _ff_bfin_ ## fname | ||||
#ifdef __FDPIC__ | |||||
#define RELOC(reg,got,obj) reg = [got + obj@GOT17M4] | |||||
#else | |||||
#define RELOC(reg,got,obj) reg.L = obj; reg.H = obj | |||||
#endif | |||||
#endif | #endif | ||||
@@ -173,7 +173,7 @@ static int bfin_vsad (void *c, uint8_t *blk1, uint8_t *blk2, int stride, int h) | |||||
+ ff_bfin_z_sad16x16 (blk2,blk2+stride,stride<<1,stride<<1,h); | + ff_bfin_z_sad16x16 (blk2,blk2+stride,stride<<1,stride<<1,h); | ||||
} | } | ||||
static uint8_t vtmp_blk[256] __attribute__((l1_data_B)); | |||||
static uint8_t vtmp_blk[256] attribute_l1_data_b; | |||||
static int bfin_pix_abs16_x2 (void *c, uint8_t *blk1, uint8_t *blk2, int line_size, int h) | static int bfin_pix_abs16_x2 (void *c, uint8_t *blk1, uint8_t *blk2, int line_size, int h) | ||||
{ | { | ||||
@@ -24,7 +24,13 @@ | |||||
#ifndef FFMPEG_DSPUTIL_BFIN_H | #ifndef FFMPEG_DSPUTIL_BFIN_H | ||||
#define FFMPEG_DSPUTIL_BFIN_H | #define FFMPEG_DSPUTIL_BFIN_H | ||||
#ifdef __FDPIC__ | |||||
#define attribute_l1_text __attribute__ ((l1_text)) | #define attribute_l1_text __attribute__ ((l1_text)) | ||||
#define attribute_l1_data_b __attribute__((l1_data_B)) | |||||
#else | |||||
#define attribute_l1_text | |||||
#define attribute_l1_data_b | |||||
#endif | |||||
#ifdef BFIN_PROFILE | #ifdef BFIN_PROFILE | ||||
@@ -129,23 +129,30 @@ root:/u/ffmpeg/bhead/libavcodec> | |||||
#include "config_bfin.h" | #include "config_bfin.h" | ||||
#ifdef __FDPIC__ | |||||
.section .l1.data.B,"aw",@progbits | .section .l1.data.B,"aw",@progbits | ||||
#else | |||||
.data | |||||
#endif | |||||
.align 4; | .align 4; | ||||
dct_coeff: | dct_coeff: | ||||
.short 0x5a82, 0x2d41, 0x187e, 0x3b21, 0x0c7c, 0x3ec5, 0x238e, 0x3537; | .short 0x5a82, 0x2d41, 0x187e, 0x3b21, 0x0c7c, 0x3ec5, 0x238e, 0x3537; | ||||
#ifdef __FDPIC__ | |||||
.section .l1.data.A,"aw",@progbits | .section .l1.data.A,"aw",@progbits | ||||
#endif | |||||
.align 4 | .align 4 | ||||
vtmp: .space 128 | vtmp: .space 128 | ||||
.text | |||||
DEFUN(fdct,mL1, | DEFUN(fdct,mL1, | ||||
(DCTELEM *block)): | (DCTELEM *block)): | ||||
[--SP] = (R7:4, P5:3); // Push the registers onto the stack. | [--SP] = (R7:4, P5:3); // Push the registers onto the stack. | ||||
b0 = r0; | b0 = r0; | ||||
r0 = [P3+dct_coeff@GOT17M4]; | |||||
RELOC(r0, P3, dct_coeff); | |||||
b3 = r0; | b3 = r0; | ||||
r0 = [P3+vtmp@GOT17M4]; | |||||
RELOC(r0, P3, vtmp); | |||||
b2 = r0; | b2 = r0; | ||||
L3 = 16; // L3 is set to 16 to make the coefficient | L3 = 16; // L3 is set to 16 to make the coefficient | ||||
@@ -57,7 +57,11 @@ IDCT BFINidct: 88.3 kdct/s | |||||
#include "config_bfin.h" | #include "config_bfin.h" | ||||
#ifdef __FDPIC__ | |||||
.section .l1.data.B,"aw",@progbits | .section .l1.data.B,"aw",@progbits | ||||
#else | |||||
.data | |||||
#endif | |||||
.align 4; | .align 4; | ||||
coefs: | coefs: | ||||
@@ -72,7 +76,9 @@ coefs: | |||||
.short 0x18F9; //cos(7pi/16) | .short 0x18F9; //cos(7pi/16) | ||||
.short 0x7D8A; //cos(pi/16) | .short 0x7D8A; //cos(pi/16) | ||||
.section .l1.data.A | |||||
#ifdef __FDPIC__ | |||||
.section .l1.data.A,"aw",@progbits | |||||
#endif | |||||
vtmp: .space 256 | vtmp: .space 256 | ||||
@@ -81,6 +87,7 @@ vtmp: .space 256 | |||||
#define TMP2 FP-16 | #define TMP2 FP-16 | ||||
.text | |||||
DEFUN(idct,mL1, | DEFUN(idct,mL1, | ||||
(DCTELEM *block)): | (DCTELEM *block)): | ||||
@@ -88,8 +95,8 @@ DEFUN(idct,mL1, | |||||
link 16; | link 16; | ||||
[--SP] = (R7:4, P5:3); // Push the registers onto the stack. | [--SP] = (R7:4, P5:3); // Push the registers onto the stack. | ||||
B0 = R0; // Pointer to Input matrix | B0 = R0; // Pointer to Input matrix | ||||
R1 = [P3+coefs@GOT17M4]; // Pointer to Coefficients | |||||
R2 = [P3+vtmp@GOT17M4]; // Pointer to Temporary matrix | |||||
RELOC(R1, P3, coefs); // Pointer to Coefficients | |||||
RELOC(R2, P3, vtmp); // Pointer to Temporary matrix | |||||
B3 = R1; | B3 = R1; | ||||
B2 = R2; | B2 = R2; | ||||
L3 = 20; // L3 is used for making the coefficient array | L3 = 20; // L3 is used for making the coefficient array | ||||
@@ -30,7 +30,11 @@ Registers Used : A0, A1, R0-R7, I0-I3, B0, B2, B3, M0-M2, L0-L3, P0-P5, LC0. | |||||
#include "config_bfin.h" | #include "config_bfin.h" | ||||
#ifdef __FDPIC__ | |||||
.section .l1.data.B,"aw",@progbits | .section .l1.data.B,"aw",@progbits | ||||
#else | |||||
.data | |||||
#endif | |||||
.align 4; | .align 4; | ||||
coefs: | coefs: | ||||
@@ -45,7 +49,9 @@ coefs: | |||||
.short 0x18F9; //cos(7pi/16) | .short 0x18F9; //cos(7pi/16) | ||||
.short 0x7D8A; //cos(pi/16) | .short 0x7D8A; //cos(pi/16) | ||||
#ifdef __FDPIC__ | |||||
.section .l1.data.A | .section .l1.data.A | ||||
#endif | |||||
vtmp: .space 256 | vtmp: .space 256 | ||||
@@ -54,6 +60,7 @@ vtmp: .space 256 | |||||
#define TMP2 FP-16 | #define TMP2 FP-16 | ||||
.text | |||||
DEFUN(vp3_idct,mL1, | DEFUN(vp3_idct,mL1, | ||||
(DCTELEM *block)): | (DCTELEM *block)): | ||||
@@ -61,8 +68,8 @@ DEFUN(vp3_idct,mL1, | |||||
link 16; | link 16; | ||||
[--SP] = (R7:4, P5:3); // Push the registers onto the stack. | [--SP] = (R7:4, P5:3); // Push the registers onto the stack. | ||||
B0 = R0; // Pointer to Input matrix | B0 = R0; // Pointer to Input matrix | ||||
R1 = [P3+coefs@GOT17M4]; // Pointer to Coefficients | |||||
R2 = [P3+vtmp@GOT17M4]; // Pointer to Temporary matrix | |||||
RELOC(R1, P3, coefs); // Pointer to Coefficients | |||||
RELOC(R2, P3, vtmp); // Pointer to Temporary matrix | |||||
B3 = R1; | B3 = R1; | ||||
B2 = R2; | B2 = R2; | ||||
L3 = 20; // L3 is used for making the coefficient array | L3 = 20; // L3 is used for making the coefficient array | ||||