Commit e44d7c65 authored by Mike Frysinger's avatar Mike Frysinger Committed by Diego Biurrun

FLAT objects cannot have multiple sections, so using the L1 attributes breaks

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/trunk
parent 2d83fe90
...@@ -35,10 +35,14 @@ DEFUN(put_pixels_clamped,mL1, ...@@ -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, ...@@ -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) ...@@ -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 @@ ...@@ -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> ...@@ -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 ...@@ -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: ...@@ -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 ...@@ -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, ...@@ -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 RELOC(R1, P3, coefs); // Pointer to Coefficients
R2 = [P3+vtmp@GOT17M4]; // Pointer to Temporary matrix 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. ...@@ -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: ...@@ -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 ...@@ -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, ...@@ -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 RELOC(R1, P3, coefs); // Pointer to Coefficients
R2 = [P3+vtmp@GOT17M4]; // Pointer to Temporary matrix 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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment