This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB 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]

RFA: recognize new instructions in rs6000 prologues


These prologues are generated by a not-yet-released compiler, but the
test suite does catch the problem.

2004-02-25  Jim Blandy  <jimb@redhat.com>

	* rs6000-tdep.c (skip_prologue): Recognize moves from argument
	registers to temp register r0 and byte stores as prologue
	instructions.

*** gdb/rs6000-tdep.c.~2~	2004-02-25 15:14:13.000000000 -0500
--- gdb/rs6000-tdep.c	2004-02-25 15:15:43.000000000 -0500
***************
*** 772,777 ****
--- 772,785 ----
  
  	  /* store parameters in stack */
  	}
+       /* Move parameters from argument registers to temporary register.  */
+       else if ((op & 0xfc0007fe) == 0x7c000378 &&	/* mr(.)  Rx,Ry */
+                (((op >> 21) & 31) >= 3) &&              /* R3 >= Ry >= R10 */
+                (((op >> 21) & 31) <= 10) &&
+                (((op >> 16) & 31) == 0)) /* Rx: scratch register r0 */
+         {
+           continue;
+         }
        else if ((op & 0xfc1f0003) == 0xf8010000 ||	/* std rx,NUM(r1) */
  	       (op & 0xfc1f0000) == 0xd8010000 ||	/* stfd Rx,NUM(r1) */
  	       (op & 0xfc1f0000) == 0xfc010000)		/* frsp, fp?,NUM(r1) */
***************
*** 781,790 ****
  	  /* store parameters in stack via frame pointer */
  	}
        else if (framep &&
! 	       ((op & 0xfc1f0000) == 0x901f0000 ||	/* st rx,NUM(r1) */
! 		(op & 0xfc1f0000) == 0xd81f0000 ||	/* stfd Rx,NUM(r1) */
! 		(op & 0xfc1f0000) == 0xfc1f0000))
! 	{			/* frsp, fp?,NUM(r1) */
  	  continue;
  
  	  /* Set up frame pointer */
--- 789,799 ----
  	  /* store parameters in stack via frame pointer */
  	}
        else if (framep &&
! 	       ((op & 0xfc1f0000) == 0x901f0000 ||     /* st rx,NUM(r31) */
!                 (op & 0xfc1f0000) == 0x981f0000 ||     /* stb Rx,NUM(r31) */
! 		(op & 0xfc1f0000) == 0xd81f0000 ||     /* stfd Rx,NUM(r31) */
! 		(op & 0xfc1f0000) == 0xfc1f0000))      /* frsp, fp?,NUM(r31) */
!         {
  	  continue;
  
  	  /* Set up frame pointer */


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