This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] RE: ill effect of <register>+<constant>


>>> Nick Clifton <nickc@redhat.com> 25.09.07 18:21 >>>
>> Here's a patch that disables such for x86 and ia64. Perhaps a few other
>> architecture may want to follow.
>
>I think that the patch ought to include some documentation on this new md_ 
>define.  In gas/doc/internals.texi presumably.

Sorry, I keep forgetting about doing this. OK this way?

gas/
2007-09-26  Jan Beulich  <jbeulich@novell.com>

	* config/tc-i386.h (md_register_arithmetic): Define.
	* config/tc-ia64.h (md_register_arithmetic): Likewise.
	* doc/internals.texi: Document md_register_arithmetic.
	* expr.c (make_expr_symbol): Force O_register expressions into
	reg_section.
	(expr): Provide default for md_register_arithmetic. Don't resolve
	adding/subtracting constants to/from registers if
	md_register_arithmetic is zero.

--- 2007-09-25/gas/config/tc-i386.h	2007-09-25 16:27:43.000000000 +0200
+++ 2007-09-25/gas/config/tc-i386.h	2007-09-24 13:44:49.000000000 +0200
@@ -272,6 +272,8 @@ extern int tc_i386_fix_adjustable (struc
 extern int i386_parse_name (char *, expressionS *, char *);
 #define md_parse_name(s, e, m, c) i386_parse_name (s, e, c)
 
+#define md_register_arithmetic 0
+
 extern const struct relax_type md_relax_table[];
 #define TC_GENERIC_RELAX_TABLE md_relax_table
 
--- 2007-09-25/gas/config/tc-ia64.h	2007-08-22 11:01:53.000000000 +0200
+++ 2007-09-25/gas/config/tc-ia64.h	2007-09-24 11:23:34.000000000 +0200
@@ -130,6 +130,7 @@ extern void ia64_convert_frag (fragS *);
 #endif /* TE_HPUX */
 #define md_flush_pending_output()	ia64_flush_pending_output ()
 #define md_parse_name(s,e,m,c)		ia64_parse_name (s, e, c)
+#define md_register_arithmetic		0
 #define tc_canonicalize_symbol_name(s)	ia64_canonicalize_symbol_name (s)
 #define tc_canonicalize_section_name(s)	ia64_canonicalize_symbol_name (s)
 #define md_optimize_expr(l,o,r)		ia64_optimize_expr (l, o, r)
--- 2007-09-25/gas/doc/internals.texi	2007-02-05 10:14:37.000000000 +0100
+++ 2007-09-25/gas/doc/internals.texi	2007-09-26 09:09:30.000000000 +0200
@@ -1045,6 +1045,12 @@ pointer, for any expression that can not
 is called, @code{input_line_pointer} will point to the start of the
 expression.
 
+@item md_register_arithmetic
+@cindex md_register_arithmetic
+If this macro is defined and evaluates to non-zero, GAS will avoid folding
+expressions like adding a constant to a register into a register with its
+number being the sum of the original register's and the constant.
+
 @item tc_unrecognized_line
 @cindex tc_unrecognized_line
 If you define this macro, GAS will call it when it finds a line that it can not
--- 2007-09-25/gas/expr.c	2007-08-22 11:01:50.000000000 +0200
+++ 2007-09-25/gas/expr.c	2007-09-24 11:21:31.000000000 +0200
@@ -95,7 +95,9 @@ make_expr_symbol (expressionS *expressio
   symbolP = symbol_create (FAKE_LABEL_NAME,
 			   (expressionP->X_op == O_constant
 			    ? absolute_section
-			    : expr_section),
+			    : expressionP->X_op == O_register
+			      ? reg_section
+			      : expr_section),
 			   0, &zero_address_frag);
   symbol_set_value_expression (symbolP, expressionP);
 
@@ -1722,7 +1724,11 @@ expr (int rankarg,		/* Larger # is highe
 	}
       else
 #endif
-      if (op_left == O_add && right.X_op == O_constant)
+#ifndef md_register_arithmetic
+# define md_register_arithmetic 1
+#endif
+      if (op_left == O_add && right.X_op == O_constant
+	  && (md_register_arithmetic || resultP->X_op != O_register))
 	{
 	  /* X + constant.  */
 	  resultP->X_add_number += right.X_add_number;
@@ -1745,12 +1751,14 @@ expr (int rankarg,		/* Larger # is highe
 	  resultP->X_op = O_constant;
 	  resultP->X_add_symbol = 0;
 	}
-      else if (op_left == O_subtract && right.X_op == O_constant)
+      else if (op_left == O_subtract && right.X_op == O_constant
+	       && (md_register_arithmetic || resultP->X_op != O_register))
 	{
 	  /* X - constant.  */
 	  resultP->X_add_number -= right.X_add_number;
 	}
-      else if (op_left == O_add && resultP->X_op == O_constant)
+      else if (op_left == O_add && resultP->X_op == O_constant
+	       && (md_register_arithmetic || right.X_op != O_register))
 	{
 	  /* Constant + X.  */
 	  resultP->X_op = right.X_op;



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]