FLAT objects cannot have multiple sections, so using the L1 attributes breaks
authorMike Frysinger <vapier.adi@gmail.com>
Sat, 16 Feb 2008 15:17:31 +0000 (15:17 +0000)
committerDiego Biurrun <diego@biurrun.de>
Sat, 16 Feb 2008 15:17:31 +0000 (15:17 +0000)
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

libavcodec/bfin/config_bfin.h
libavcodec/bfin/dsputil_bfin.c
libavcodec/bfin/dsputil_bfin.h
libavcodec/bfin/fdct_bfin.S
libavcodec/bfin/idct_bfin.S
libavcodec/bfin/vp3_idct_bfin.S

index 85b478fb0860ec0fcf8cf9398d618b90fe125619..0f0eab6bef213995d1691f6a7ffb10276f0b4b87 100644 (file)
@@ -35,10 +35,14 @@ DEFUN(put_pixels_clamped,mL1,
 
 #ifndef DEFUN
 
+#define mL3 .text
 #ifndef mL1
+#ifdef __FDPIC__
 #define mL1 .l1.text
+#else
+#define mL1 mL3
+#endif
 #endif
-#define mL3 .text
 
 #define DEFUN(fname,where,interface) \
         .section where;              \
@@ -50,6 +54,11 @@ DEFUN(put_pixels_clamped,mL1,
 #define DEFUN_END(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
 
index 93b324cfd24b09b25fd7959f3b6fbcb6481ac817..a72459948c851a17d92414d7da829f404663ec41 100644 (file)
@@ -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);
 }
 
-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)
 {
index 5731f4f53c25b062fd7fece06d0827e92d5bc304..411c8ea73cb95157d53c1fd4df9dff39a03e0f89 100644 (file)
 #ifndef FFMPEG_DSPUTIL_BFIN_H
 #define FFMPEG_DSPUTIL_BFIN_H
 
+#ifdef __FDPIC__
 #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
 
index 9f3ef1fa8a572fcded8d8b60808957d70aad0a78..03f2709e3c1a3e8b75496acfc07f5727759919d9 100644 (file)
@@ -129,23 +129,30 @@ root:/u/ffmpeg/bhead/libavcodec>
 
 #include "config_bfin.h"
 
+#ifdef __FDPIC__
 .section .l1.data.B,"aw",@progbits
+#else
+.data
+#endif
 .align 4;
 dct_coeff:
 .short 0x5a82, 0x2d41, 0x187e, 0x3b21, 0x0c7c, 0x3ec5, 0x238e, 0x3537;
 
+#ifdef __FDPIC__
 .section .l1.data.A,"aw",@progbits
+#endif
 .align 4
 vtmp:   .space 128
 
+.text
 DEFUN(fdct,mL1,
         (DCTELEM *block)):
     [--SP] = (R7:4, P5:3);          // Push the registers onto the stack.
 
     b0 = r0;
-    r0 = [P3+dct_coeff@GOT17M4];
+    RELOC(r0, P3, dct_coeff);
     b3 = r0;
-    r0 = [P3+vtmp@GOT17M4];
+    RELOC(r0, P3, vtmp);
     b2 = r0;
 
     L3 = 16;                        // L3 is set to 16 to make the coefficient
index e40e5e0085c7f2ed1ea32ebcd0a098efda7a225d..7bb104038d4da2cce853db0003f8d09877da790e 100644 (file)
@@ -57,7 +57,11 @@ IDCT BFINidct: 88.3 kdct/s
 
 #include "config_bfin.h"
 
+#ifdef __FDPIC__
 .section .l1.data.B,"aw",@progbits
+#else
+.data
+#endif
 
 .align 4;
 coefs:
@@ -72,7 +76,9 @@ coefs:
 .short 0x18F9;           //cos(7pi/16)
 .short 0x7D8A;           //cos(pi/16)
 
-.section .l1.data.A
+#ifdef __FDPIC__
+.section .l1.data.A,"aw",@progbits
+#endif
 
 vtmp: .space 256
 
@@ -81,6 +87,7 @@ vtmp: .space 256
 #define TMP2 FP-16
 
 
+.text
 DEFUN(idct,mL1,
         (DCTELEM *block)):
 
@@ -88,8 +95,8 @@ DEFUN(idct,mL1,
     link 16;
     [--SP] = (R7:4, P5:3);   // Push the registers onto the stack.
     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;
     B2 = R2;
     L3 = 20;                // L3 is used for making the coefficient array
index 1ed9209cdd55fefdb31ee713dfd2cd77a4c22bb7..ec8c1bee77c543ba8f068ab5fe7692e43de19c75 100644 (file)
@@ -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"
 
+#ifdef __FDPIC__
 .section .l1.data.B,"aw",@progbits
+#else
+.data
+#endif
 
 .align 4;
 coefs:
@@ -45,7 +49,9 @@ coefs:
 .short 0x18F9;           //cos(7pi/16)
 .short 0x7D8A;           //cos(pi/16)
 
+#ifdef __FDPIC__
 .section .l1.data.A
+#endif
 
 vtmp: .space 256
 
@@ -54,6 +60,7 @@ vtmp: .space 256
 #define TMP2 FP-16
 
 
+.text
 DEFUN(vp3_idct,mL1,
         (DCTELEM *block)):
 
@@ -61,8 +68,8 @@ DEFUN(vp3_idct,mL1,
     link 16;
     [--SP] = (R7:4, P5:3);   // Push the registers onto the stack.
     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;
     B2 = R2;
     L3 = 20;                // L3 is used for making the coefficient array