This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


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

Patch for the mn10300




A recent patch to mn10300.md added:

    (use (reg:SI 14))
    (use (reg:SI 15))
    (use (reg:SI 16))
    (use (reg:SI 17))

to the definition of the store_movm instruction.  The instruction is
generated on both the AM33 and non-AM33 targets, but registers 14 to 17
are specific to the AM33.  Since the backend assumes that registers 14
to 17 can only live on an AM33, it caused many test failures at -O3 when
that was not the target.

The following patch replaces store_movm with two other instructions, one
to be used on the AM33 and one to be used otherwise.  Ran 'make check'
to verify that this fixes the problem.


2000-11-30  Richard Sandiford  <rsandifo@redhat.com>

	* config/mn10300/mn10300.md: Spawned two store_movm insns,
	  one the AM33 and one for non-AM33 targets.

	* config/mn10300/mn10300.c (print_live_regs): Added.

Index: gcc/config/mn10300/mn10300.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/mn10300/mn10300.c,v
retrieving revision 1.31
diff -c -r1.31 mn10300.c
*** mn10300.c	2000/10/25 04:26:35	1.31
--- gcc/config/mn10300/mn10300.c	2000/11/30 18:51:27
***************
*** 361,366 ****
--- 361,411 ----
      }
  }
  
+ void
+ print_live_regs (file)
+      FILE *file;
+ {
+   int need_comma;
+ 
+   need_comma = 0;
+   fputc ('[', file);
+   if (regs_ever_live[2])
+     {
+       fputs ("d2", file);
+       need_comma = 1;
+     }
+   if (regs_ever_live[3])
+     {
+       if (need_comma)
+ 	fputc (',', file); 
+       fputs ("d3", file);
+       need_comma = 1;
+     }
+   if (regs_ever_live[6])
+     {
+       if (need_comma)
+ 	fputc (',', file); 
+       fputs ("a2", file);
+       need_comma = 1;
+     }
+   if (regs_ever_live[7])
+     {
+       if (need_comma)
+ 	fputc (',', file); 
+       fputs ("a3", file);
+       need_comma = 1;
+     }
+   if (regs_ever_live[14] || regs_ever_live[15]
+       || regs_ever_live[16] || regs_ever_live[17])
+     {
+       if (need_comma)
+ 	fputc (',', file); 
+       fputs ("exreg1", file);
+       need_comma = 1;
+     }
+   fputc (']', file);
+ }
+ 
  int
  can_use_return_insn ()
  {
***************
*** 411,417 ****
        || regs_ever_live[14] || regs_ever_live[15]
        || regs_ever_live[16] || regs_ever_live[17]
        || frame_pointer_needed)
!     emit_insn (gen_store_movm ());
  
    /* Now put the frame pointer into the frame pointer register.  */
    if (frame_pointer_needed)
--- 456,467 ----
        || regs_ever_live[14] || regs_ever_live[15]
        || regs_ever_live[16] || regs_ever_live[17]
        || frame_pointer_needed)
!     {
!       if (TARGET_AM33)
! 	emit_insn (gen_store_movm_am33 ());
!       else
! 	emit_insn (gen_store_movm_non_am33 ());
!     }
  
    /* Now put the frame pointer into the frame pointer register.  */
    if (frame_pointer_needed)
Index: gcc/config/mn10300/mn10300.md
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/mn10300/mn10300.md,v
retrieving revision 1.37
diff -c -r1.37 mn10300.md
*** mn10300.md	2000/11/13 16:37:09	1.37
--- gcc/config/mn10300/mn10300.md	2000/11/30 18:51:29
***************
*** 1999,2045 ****
    int need_comma;
  
    need_comma = 0;
!   fputs (\"\\tret [\", asm_out_file);
!   if (regs_ever_live[2])
!     {
!       fputs (\"d2\", asm_out_file);
!       need_comma = 1;
!     }
!   if (regs_ever_live[3])
!     {
!       if (need_comma)
! 	fputc (',', asm_out_file); 
!       fputs (\"d3\", asm_out_file);
!       need_comma = 1;
!     }
!   if (regs_ever_live[6])
!     {
!       if (need_comma)
! 	fputc (',', asm_out_file); 
!       fputs (\"a2\", asm_out_file);
!       need_comma = 1;
!     }
!   if (regs_ever_live[7])
!     {
!       if (need_comma)
! 	fputc (',', asm_out_file); 
!       fputs (\"a3\", asm_out_file);
!       need_comma = 1;
!     }
!   if (regs_ever_live[14] || regs_ever_live[15]
!       || regs_ever_live[16] || regs_ever_live[17])
!     {
!       if (need_comma)
! 	fputc (',', asm_out_file); 
!       fputs (\"exreg1\", asm_out_file);
!       need_comma = 1;
!     }
!   fprintf (asm_out_file, \"],%d\\n\", INTVAL (operands[0]));
    return \"\";
  }"
    [(set_attr "cc" "clobber")])
  
! (define_insn "store_movm"
    [(const_int 1)
     (use (reg:SI 2))
     (use (reg:SI 3))
--- 1999,2012 ----
    int need_comma;
  
    need_comma = 0;
!   fputs (\"\\tret \", asm_out_file);
!   print_live_regs (asm_out_file);
!   fprintf (asm_out_file, \",%d\\n\", INTVAL (operands[0]));
    return \"\";
  }"
    [(set_attr "cc" "clobber")])
  
! (define_insn "store_movm_am33"
    [(const_int 1)
     (use (reg:SI 2))
     (use (reg:SI 3))
***************
*** 2053,2097 ****
    ""
    "*
  {
!   int need_comma;
  
!   need_comma = 0;
!   fputs (\"\\tmovm [\", asm_out_file);
!   if (regs_ever_live[2])
!     {
!       fputs (\"d2\", asm_out_file);
!       need_comma = 1;
!     }
!   if (regs_ever_live[3])
!     {
!       if (need_comma)
! 	fputc (',', asm_out_file); 
!       fputs (\"d3\", asm_out_file);
!       need_comma = 1;
!     }
!   if (regs_ever_live[6])
!     {
!       if (need_comma)
! 	fputc (',', asm_out_file); 
!       fputs (\"a2\", asm_out_file);
!       need_comma = 1;
!     }
!   if (regs_ever_live[7])
!     {
!       if (need_comma)
! 	fputc (',', asm_out_file); 
!       fputs (\"a3\", asm_out_file);
!       need_comma = 1;
!     }
!   if (regs_ever_live[14] || regs_ever_live[15]
!       || regs_ever_live[16] || regs_ever_live[17])
!     {
!       if (need_comma)
! 	fputc (',', asm_out_file); 
!       fputs (\"exreg1\", asm_out_file);
!       need_comma = 1;
!     }
!   fputs (\"],(sp)\\n\", asm_out_file);
    return \"\";
  }"
    [(set_attr "cc" "clobber")])
--- 2020,2045 ----
    ""
    "*
  {
!   fputs (\"\\tmovm \", asm_out_file);
!   print_live_regs (asm_out_file);
!   fputs (\",(sp)\\n\", asm_out_file);
!   return \"\";
! }"
!   [(set_attr "cc" "clobber")])
  
! (define_insn "store_movm_non_am33"
!   [(const_int 1)
!    (use (reg:SI 2))
!    (use (reg:SI 3))
!    (use (reg:SI 6))
!    (use (reg:SI 7))
!    (clobber (reg:SI 9))]
!   ""
!   "*
! {
!   fputs (\"\\tmovm \", asm_out_file);
!   print_live_regs (asm_out_file);
!   fputs (\",(sp)\\n\", asm_out_file);
    return \"\";
  }"
    [(set_attr "cc" "clobber")])
Index: gcc/config/mn10300/mn10300-protos.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/mn10300/mn10300-protos.h,v
retrieving revision 1.2
diff -c -r1.2 mn10300-protos.h
*** mn10300-protos.h	2000/04/21 21:19:55	1.2
--- gcc/config/mn10300/mn10300-protos.h	2000/11/30 18:51:29
***************
*** 28,33 ****
--- 28,34 ----
  extern struct rtx_def *legitimize_address PARAMS ((rtx, rtx, enum machine_mode));
  extern void print_operand PARAMS ((FILE *, rtx, int));
  extern void print_operand_address PARAMS ((FILE *, rtx));
+ extern void print_live_regs PARAMS ((FILE *));
  extern void notice_update_cc PARAMS ((rtx, rtx));
  extern enum reg_class secondary_reload_class PARAMS ((enum reg_class,
  						      enum machine_mode, rtx));


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