diff mbox series

[v3,4/5] pcm_dmix assembly: refactor the PIC mode

Message ID 20200506171924.2644-4-frederic.recoules@univ-grenoble-alpes.fr (mailing list archive)
State New, archived
Headers show
Series [v3,1/5] pcm_dmix assembly: change the token by symbolic names | expand

Commit Message

FRÉDÉRIC RECOULES May 6, 2020, 5:19 p.m. UTC
From: Frédéric Recoules <frederic.recoules@orange.fr>

Newer versions of GCC (> 5.0) accept that ebx is declared
in the clobber list even in PIC mode. Meanwhile, even
unlikely, the compiler may use ebx as base address of
one of the memory entry, making subsequent access to
them unreliable ('size', 'dst_step', 'src_step', 'sum_step').

Adding ebx in the clobber solves the problem.
By the way, the entry 'old_ebx' is no longer required.

Signed-off-by: Frédéric Recoules <frederic.recoules@orange.fr>
---
 src/pcm/pcm_dmix_i386.h   | 93 ++++++++++++++++++++++++++++++---------
 src/pcm/pcm_dmix_x86_64.h | 59 ++++++++++++++++++++-----
 2 files changed, 120 insertions(+), 32 deletions(-)
diff mbox series

Patch

diff --git a/src/pcm/pcm_dmix_i386.h b/src/pcm/pcm_dmix_i386.h
index 5c900bf1..bd1d6644 100644
--- a/src/pcm/pcm_dmix_i386.h
+++ b/src/pcm/pcm_dmix_i386.h
@@ -26,6 +26,10 @@ 
  *
  */
 
+#if defined(__GNUC__) && __GNUC__ < 5 && defined(__PIC__)
+#  define BOUNDED_EBX
+#endif
+
 /*
  *  for plain i386
  */
@@ -34,8 +38,9 @@  static void MIX_AREAS_16(unsigned int size,
 			 volatile signed int *sum, size_t dst_step,
 			 size_t src_step, size_t sum_step)
 {
+#ifdef BOUNDED_EBX
 	unsigned int old_ebx;
-
+#endif
 	/*
 	 *  ESI - src
 	 *  EDI - dst
@@ -46,8 +51,9 @@  static void MIX_AREAS_16(unsigned int size,
 	 */
 	__asm__ __volatile__ (
 		"\n"
-
+#ifdef BOUNDED_EBX
 		"\tmovl %%ebx, %[old_ebx]\n"	/* ebx is GOT pointer (-fPIC) */
+#endif
 		/*
 		 *  initialization, load ESI, EDI, EBX registers
 		 */
@@ -140,13 +146,20 @@  static void MIX_AREAS_16(unsigned int size,
 		"\tjnz 1b\n"
 
 		"7:"
+#ifdef BOUNDED_EBX
 		"\tmovl %[old_ebx], %%ebx\n"	/* ebx is GOT pointer (-fPIC) */
-
-		: [size] "+m" (size), [old_ebx] "=m" (old_ebx)
+#endif
+		: [size] "+m" (size)
+#ifdef BOUNDED_EBX
+		  , [old_ebx] "=m" (old_ebx)
+#endif
 		: [dst] "m" (dst), [src] "m" (src), [sum] "m" (sum),
 		  [dst_step] "m" (dst_step),  [src_step] "m" (src_step),
 		  [sum_step] "m" (sum_step)
 		: "esi", "edi", "edx", "ecx", "eax", "memory", "cc"
+#ifndef BOUNDED_EBX
+		  , "ebx"
+#endif
 	);
 }
 
@@ -158,8 +171,9 @@  static void MIX_AREAS_16_MMX(unsigned int size,
 			     volatile signed int *sum, size_t dst_step,
 			     size_t src_step, size_t sum_step)
 {
+#ifdef BOUNDED_EBX
 	unsigned int old_ebx;
-
+#endif
 	/*
 	 *  ESI - src
 	 *  EDI - dst
@@ -170,8 +184,9 @@  static void MIX_AREAS_16_MMX(unsigned int size,
 	 */
 	__asm__ __volatile__ (
 		"\n"
-
+#ifdef BOUNDED_EBX
 		"\tmovl %%ebx, %[old_ebx]\n"	/* ebx is GOT pointer (-fPIC) */
+#endif
 		/*
 		 *  initialization, load ESI, EDI, EBX registers
 		 */
@@ -230,13 +245,20 @@  static void MIX_AREAS_16_MMX(unsigned int size,
 		"\tjnz 1b\n"
 		"\temms\n"
                 "5:"
+#ifdef BOUNDED_EBX
 		"\tmovl %[old_ebx], %%ebx\n"	/* ebx is GOT pointer (-fPIC) */
-
-	        : [size] "+m" (size), [old_ebx] "=m" (old_ebx)
+#endif
+		: [size] "+m" (size)
+#ifdef BOUNDED_EBX
+		  , [old_ebx] "=m" (old_ebx)
+#endif
 		: [dst] "m" (dst), [src] "m" (src), [sum] "m" (sum),
 		  [dst_step] "m" (dst_step),  [src_step] "m" (src_step),
 		  [sum_step] "m" (sum_step)
 		: "esi", "edi", "edx", "ecx", "eax", "memory", "cc"
+#ifndef BOUNDED_EBX
+		  , "ebx"
+#endif
 #ifdef HAVE_MMX
 		  , "mm0"
 #else
@@ -254,8 +276,9 @@  static void MIX_AREAS_32(unsigned int size,
 			 volatile signed int *sum, size_t dst_step,
 			 size_t src_step, size_t sum_step)
 {
+#ifdef BOUNDED_EBX
 	unsigned int old_ebx;
-
+#endif
 	/*
 	 *  ESI - src
 	 *  EDI - dst
@@ -266,8 +289,9 @@  static void MIX_AREAS_32(unsigned int size,
 	 */
 	__asm__ __volatile__ (
 		"\n"
-
+#ifdef BOUNDED_EBX
 		"\tmovl %%ebx, %[old_ebx]\n"	/* ebx is GOT pointer (-fPIC) */
+#endif
 		/*
 		 *  initialization, load ESI, EDI, EBX registers
 		 */
@@ -349,13 +373,20 @@  static void MIX_AREAS_32(unsigned int size,
 		"\tjmp 1b\n"
 
 		"6:"
+#ifdef BOUNDED_EBX
 		"\tmovl %[old_ebx], %%ebx\n"	/* ebx is GOT pointer (-fPIC) */
-
-		: [size] "+m" (size), [old_ebx] "=m" (old_ebx)
+#endif
+		: [size] "+m" (size)
+#ifdef BOUNDED_EBX
+		  , [old_ebx] "=m" (old_ebx)
+#endif
 		: [dst] "m" (dst), [src] "m" (src), [sum] "m" (sum),
 		  [dst_step] "m" (dst_step),  [src_step] "m" (src_step),
 		  [sum_step] "m" (sum_step)
 		: "esi", "edi", "edx", "ecx", "eax", "memory", "cc"
+#ifndef BOUNDED_EBX
+		  , "ebx"
+#endif
 	);
 }
 
@@ -367,8 +398,9 @@  static void MIX_AREAS_24(unsigned int size,
 			 volatile signed int *sum, size_t dst_step,
 			 size_t src_step, size_t sum_step)
 {
+#ifdef BOUNDED_EBX
 	unsigned int old_ebx;
-
+#endif
 	/*
 	 *  ESI - src
 	 *  EDI - dst
@@ -379,8 +411,9 @@  static void MIX_AREAS_24(unsigned int size,
 	 */
 	__asm__ __volatile__ (
 		"\n"
-
+#ifdef BOUNDED_EBX
 		"\tmovl %%ebx, %[old_ebx]\n"	/* ebx is GOT pointer (-fPIC) */
+#endif
 		/*
 		 *  initialization, load ESI, EDI, EBX registers
 		 */
@@ -455,13 +488,20 @@  static void MIX_AREAS_24(unsigned int size,
 		"\tjmp 1b\n"
 
 		"6:"
+#ifdef BOUNDED_EBX
 		"\tmovl %[old_ebx], %%ebx\n"	/* ebx is GOT pointer (-fPIC) */
-
-	        : [size] "+m" (size), [old_ebx] "=m" (old_ebx)
+#endif
+		: [size] "+m" (size)
+#ifdef BOUNDED_EBX
+		  , [old_ebx] "=m" (old_ebx)
+#endif
 		: [dst] "m" (dst), [src] "m" (src), [sum] "m" (sum),
 		  [dst_step] "m" (dst_step),  [src_step] "m" (src_step),
 		  [sum_step] "m" (sum_step)
 		: "esi", "edi", "edx", "ecx", "eax", "memory", "cc"
+#ifndef BOUNDED_EBX
+		  , "ebx"
+#endif
 	);
 }
 
@@ -473,8 +513,9 @@  static void MIX_AREAS_24_CMOV(unsigned int size,
 			      volatile signed int *sum, size_t dst_step,
 			      size_t src_step, size_t sum_step)
 {
+#ifdef BOUNDED_EBX
 	unsigned int old_ebx;
-
+#endif
 	/*
 	 *  ESI - src
 	 *  EDI - dst
@@ -485,8 +526,9 @@  static void MIX_AREAS_24_CMOV(unsigned int size,
 	 */
 	__asm__ __volatile__ (
 		"\n"
-
+#ifdef BOUNDED_EBX
 		"\tmovl %%ebx, %[old_ebx]\n"	/* ebx is GOT pointer (-fPIC) */
+#endif
 		/*
 		 *  initialization, load ESI, EDI, EBX registers
 		 */
@@ -554,12 +596,23 @@  static void MIX_AREAS_24_CMOV(unsigned int size,
 		"\tjnz 1b\n"
 
 		"6:"
+#ifdef BOUNDED_EBX
 		"\tmovl %[old_ebx], %%ebx\n"	/* ebx is GOT pointer (-fPIC) */
-
-	        : [size] "+m" (size), [old_ebx] "=m" (old_ebx)
+#endif
+		: [size] "+m" (size)
+#ifdef BOUNDED_EBX
+		  , [old_ebx] "=m" (old_ebx)
+#endif
 		: [dst] "m" (dst), [src] "m" (src), [sum] "m" (sum),
 		  [dst_step] "m" (dst_step),  [src_step] "m" (src_step),
 		  [sum_step] "m" (sum_step)
 		: "esi", "edi", "edx", "ecx", "eax", "memory", "cc"
+#ifndef BOUNDED_EBX
+		  , "ebx"
+#endif
 	);
 }
+
+#ifdef BOUNDED_EBX
+#  undef BOUNDED_EBX
+#endif
diff --git a/src/pcm/pcm_dmix_x86_64.h b/src/pcm/pcm_dmix_x86_64.h
index 803d3b24..fff07529 100644
--- a/src/pcm/pcm_dmix_x86_64.h
+++ b/src/pcm/pcm_dmix_x86_64.h
@@ -27,6 +27,10 @@ 
  *
  */
 
+#if defined(__GNUC__) && __GNUC__ < 5 && defined(__PIC__)
+#  define BOUNDED_RBX
+#endif
+
 /*
  *  MMX optimized
  */
@@ -35,8 +39,9 @@  static void MIX_AREAS_16(unsigned int size,
 			 volatile signed int *sum, size_t dst_step,
 			 size_t src_step, size_t sum_step)
 {
+#ifdef BOUNDED_RBX
 	unsigned long long old_rbx;
-
+#endif
 	/*
 	 *  RSI - src
 	 *  RDI - dst
@@ -47,8 +52,9 @@  static void MIX_AREAS_16(unsigned int size,
 	 */
 	__asm__ __volatile__ (
 		"\n"
-
+#ifdef BOUNDED_RBX
 		"\tmovq %%rbx, %[old_rbx]\n"
+#endif
 		/*
 		 *  initialization, load RSI, RDI, RBX registers
 		 */
@@ -112,13 +118,20 @@  static void MIX_AREAS_16(unsigned int size,
 		"6:"
 
 		"\temms\n"
+#ifdef BOUNDED_RBX
 		"\tmovq %[old_rbx], %%rbx\n"
-
-		: [size] "+m" (size), [old_rbx] "=m" (old_rbx)
+#endif
+		: [size] "+m" (size)
+#ifdef BOUNDED_RBX
+		  , [old_rbx] "=m" (old_rbx)
+#endif
 	        : [dst] "m" (dst), [src] "m" (src), [sum] "m" (sum),
 		  [dst_step] "m" (dst_step),  [src_step] "m" (src_step),
 		  [sum_step] "m" (sum_step)
 		: "rsi", "rdi", "edx", "ecx", "eax", "memory", "cc"
+#ifndef BOUNDED_RBX
+		  , "rbx"
+#endif
 #ifdef HAVE_MMX
 		  , "mm0"
 #else
@@ -136,8 +149,9 @@  static void MIX_AREAS_32(unsigned int size,
 			 volatile signed int *sum, size_t dst_step,
 			 size_t src_step, size_t sum_step)
 {
+#ifdef BOUNDED_RBX
 	unsigned long long old_rbx;
-
+#endif
 	/*
 	 *  RSI - src
 	 *  RDI - dst
@@ -148,8 +162,9 @@  static void MIX_AREAS_32(unsigned int size,
 	 */
 	__asm__ __volatile__ (
 		"\n"
-
+#ifdef BOUNDED_RBX
 		"\tmovq %%rbx, %[old_rbx]\n"
+#endif
 		/*
 		 *  initialization, load RSI, RDI, RBX registers
 		 */
@@ -233,13 +248,20 @@  static void MIX_AREAS_32(unsigned int size,
 		"\tjnz 1b\n"
 
 		"6:"
+#ifdef BOUNDED_RBX
 		"\tmovq %[old_rbx], %%rbx\n"
-
-		: [size] "+m" (size), [old_rbx] "=m" (old_rbx)
+#endif
+		: [size] "+m" (size)
+#ifdef BOUNDED_RBX
+		  , [old_rbx] "=m" (old_rbx)
+#endif
 	        : [dst] "m" (dst), [src] "m" (src), [sum] "m" (sum),
 		  [dst_step] "m" (dst_step),  [src_step] "m" (src_step),
 		  [sum_step] "m" (sum_step)
 		: "rsi", "rdi", "edx", "ecx", "eax", "memory", "cc"
+#ifndef BOUNDED_RBX
+		  , "rbx"
+#endif
 	);
 }
 
@@ -251,8 +273,9 @@  static void MIX_AREAS_24(unsigned int size,
 			 volatile signed int *sum, size_t dst_step,
 			 size_t src_step, size_t sum_step)
 {
+#ifdef BOUNDED_RBX
 	unsigned long long old_rbx;
-
+#endif
 	/*
 	 *  RSI - src
 	 *  RDI - dst
@@ -263,8 +286,9 @@  static void MIX_AREAS_24(unsigned int size,
 	 */
 	__asm__ __volatile__ (
 		"\n"
-
+#ifdef BOUNDED_RBX
 		"\tmovq %%rbx, %[old_rbx]\n"
+#endif
 		/*
 		 *  initialization, load RSI, RDI, RBX registers
 		 */
@@ -336,12 +360,23 @@  static void MIX_AREAS_24(unsigned int size,
 		"\tjnz 1b\n"
 
 		"6:"
+#ifdef BOUNDED_RBX
 		"\tmovq %[old_rbx], %%rbx\n"
-
-		: [size] "+m" (size), [old_rbx] "=m" (old_rbx)
+#endif
+		: [size] "+m" (size)
+#ifdef BOUNDED_RBX
+		  , [old_rbx] "=m" (old_rbx)
+#endif
 	        : [dst] "m" (dst), [src] "m" (src), [sum] "m" (sum),
 		  [dst_step] "m" (dst_step),  [src_step] "m" (src_step),
 		  [sum_step] "m" (sum_step)
 		: "rsi", "rdi", "edx", "ecx", "eax", "memory", "cc"
+#ifndef BOUNDED_RBX
+		  , "rbx"
+#endif
 	);
 }
+
+#ifdef BOUNDED_RBX
+#  undef BOUNDED_RBX
+#endif