This is the mail archive of the binutils@sources.redhat.com 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: Fix -xauto for ia64 assembler


On Thu, May 27, 2004 at 11:09:23PM -0700, Jim Wilson wrote:
> On Thu, 2004-05-27 at 22:18, H. J. Lu wrote:
> > 	* config/tc-ia64.c (remove_marked_resource): Restore the old
> > 	slot when inserting srlz.i/srlz.d.
> 
> Yes, like that, except if we are copying the entire CURR_SLOT, then we
> probably need to be clearing more of the fields too.  Shouldn't we be
> clearing all of CURR_SLOT instead of just a couple of fields?  If we do
> clear more fields, is there any risk of breaking anything?  I don't
> think so, but I can't prove it.
> 
> This patch does work right with the tag and unwind testcases I gave
> though.  It doesn't seem to work right for debug info.  The inserted
> instruction ends up at line 2, whereas I would expect it to be at line
> 1.  This is perhaps arguable though.

Here is the new patch.


H.J.
---
2004-05-28  H.J. Lu  <hongjiu.lu@intel.com>

	* config/tc-ia64.c (remove_marked_resource): Restore the old
	slot when inserting srlz.i/srlz.d.

--- gas/config/tc-ia64.c.auto	2004-05-27 22:08:52.000000000 -0700
+++ gas/config/tc-ia64.c	2004-05-28 08:51:01.480217959 -0700
@@ -9560,17 +9560,15 @@ remove_marked_resource (rs)
 	insn_group_break (1, 0, 0);
       if (rs->insn_srlz < STATE_SRLZ)
 	{
-	  int oldqp = CURR_SLOT.qp_regno;
-	  struct ia64_opcode *oldidesc = CURR_SLOT.idesc;
+	  struct slot oldslot = CURR_SLOT;
 	  /* Manually jam a srlz.i insn into the stream */
-	  CURR_SLOT.qp_regno = 0;
+	  memset (&CURR_SLOT, 0, sizeof (CURR_SLOT));
 	  CURR_SLOT.idesc = ia64_find_opcode ("srlz.i");
 	  instruction_serialization ();
 	  md.curr_slot = (md.curr_slot + 1) % NUM_SLOTS;
 	  if (++md.num_slots_in_use >= NUM_SLOTS)
 	    emit_one_bundle ();
-	  CURR_SLOT.qp_regno = oldqp;
-	  CURR_SLOT.idesc = oldidesc;
+	  CURR_SLOT = oldslot;
 	}
       insn_group_break (1, 0, 0);
       break;
@@ -9583,17 +9581,15 @@ remove_marked_resource (rs)
       if (rs->data_srlz < STATE_STOP)
 	insn_group_break (1, 0, 0);
       {
-	int oldqp = CURR_SLOT.qp_regno;
-	struct ia64_opcode *oldidesc = CURR_SLOT.idesc;
+	struct slot oldslot = CURR_SLOT;
 	/* Manually jam a srlz.d insn into the stream */
-	CURR_SLOT.qp_regno = 0;
+	memset (&CURR_SLOT, 0, sizeof (CURR_SLOT));
 	CURR_SLOT.idesc = ia64_find_opcode ("srlz.d");
 	data_serialization ();
 	md.curr_slot = (md.curr_slot + 1) % NUM_SLOTS;
 	if (++md.num_slots_in_use >= NUM_SLOTS)
 	  emit_one_bundle ();
-	CURR_SLOT.qp_regno = oldqp;
-	CURR_SLOT.idesc = oldidesc;
+	CURR_SLOT = oldslot;
       }
       break;
     case IA64_DVS_IMPLIED:


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