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]
Other format: [Raw text]

[patch] h8300: Emit correct stack push/pop code in normal mode.


Hi,

Attached is a patch to emit correct stack push/pop code when
generating code for normal mode.

In normal mode, the pointer should be of HImode.  GCC without this
patch would use SImode in stack push/pop code, preventing reload from
correctly keeping track of the stack depth.

The patch fixes so many failures with no new failure.

Tested on h8300 port.  Committed.

Kazu Hirata

2003-11-23  Kazu Hirata  <kazu@cs.umass.edu>

	PR target/13122
	* config/h8300/h8300.c (push): Call push_h8300hs_normal in
	normal mode.
	(pop): Call pop_h8300hs_normal in normal mode.
	* config/h8300/h8300.md: Likewise.
	(pushqi1_h8300hs_normal): New.
	(pushqi1): Call pushqi1_h8300hs_normal in normal mode.
	(pushhi1_h8300hs_normal): New.
	(pushhi1): Call pushhi1_h8300hs_normal in normal mode.
	(push_h8300hs_normal): New.
	(pop_h8300hs_normal): Likewise.

Index: h8300.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/h8300/h8300.c,v
retrieving revision 1.255
diff -u -r1.255 h8300.c
--- h8300.c	22 Nov 2003 15:51:48 -0000	1.255
+++ h8300.c	22 Nov 2003 21:39:50 -0000
@@ -434,8 +434,10 @@
 
   if (TARGET_H8300)
     x = gen_push_h8300 (reg);
-  else
+  else if (!TARGET_NORMAL_MODE)
     x = gen_push_h8300hs (reg);
+  else
+    x = gen_push_h8300hs_normal (reg);
   x = emit_insn (x);
   REG_NOTES (x) = gen_rtx_EXPR_LIST (REG_INC, stack_pointer_rtx, 0);
 }
@@ -450,8 +452,10 @@
 
   if (TARGET_H8300)
     x = gen_pop_h8300 (reg);
-  else
+  else if (!TARGET_NORMAL_MODE)
     x = gen_pop_h8300hs (reg);
+  else
+    x = gen_pop_h8300hs_normal (reg);
   x = emit_insn (x);
   REG_NOTES (x) = gen_rtx_EXPR_LIST (REG_INC, stack_pointer_rtx, 0);
 }
Index: h8300.md
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/h8300/h8300.md,v
retrieving revision 1.241
diff -u -r1.241 h8300.md
--- h8300.md	17 Nov 2003 02:29:54 -0000	1.241
+++ h8300.md	22 Nov 2003 21:39:51 -0000
@@ -140,6 +140,17 @@
   [(set_attr "length" "4")
    (set_attr "cc" "clobber")])
 
+(define_insn "pushqi1_h8300hs_normal"
+  [(parallel [(set (reg:HI SP_REG)
+		   (plus:HI (reg:HI SP_REG) (const_int -4)))
+	      (set (mem:QI (plus:HI (reg:HI SP_REG) (const_int -3)))
+		   (match_operand:QI 0 "register_operand" "r"))])]
+  "(TARGET_H8300H || TARGET_H8300S)
+   && operands[0] != stack_pointer_rtx"
+  "mov.l\\t%S0,@-er7"
+  [(set_attr "length" "4")
+   (set_attr "cc" "clobber")])
+
 (define_expand "pushqi1"
   [(use (match_operand:QI 0 "register_operand" ""))]
   ""
@@ -147,8 +158,10 @@
 {
   if (TARGET_H8300)
     emit_insn (gen_pushqi1_h8300 (operands[0]));
-  else
+  else if (!TARGET_NORMAL_MODE)
     emit_insn (gen_pushqi1_h8300hs (operands[0]));
+  else
+    emit_insn (gen_pushqi1_h8300hs_normal (operands[0]));
   DONE;
 }")
 
@@ -232,6 +245,17 @@
   [(set_attr "length" "4")
    (set_attr "cc" "clobber")])
 
+(define_insn "pushhi1_h8300hs_normal"
+  [(parallel [(set (reg:HI SP_REG)
+		   (plus:HI (reg:HI SP_REG) (const_int -4)))
+	      (set (mem:HI (plus:HI (reg:HI SP_REG) (const_int -2)))
+		   (match_operand:HI 0 "register_operand" "r"))])]
+  "(TARGET_H8300H || TARGET_H8300S)
+   && operands[0] != stack_pointer_rtx"
+  "mov.l\\t%S0,@-er7"
+  [(set_attr "length" "4")
+   (set_attr "cc" "clobber")])
+
 (define_expand "pushhi1"
   [(use (match_operand:HI 0 "register_operand" ""))]
   ""
@@ -239,8 +263,10 @@
 {
   if (TARGET_H8300)
     emit_insn (gen_pushhi1_h8300 (operands[0]));
-  else
+  else if (!TARGET_NORMAL_MODE)
     emit_insn (gen_pushhi1_h8300hs (operands[0]));
+  else
+    emit_insn (gen_pushhi1_h8300hs_normal (operands[0]));
   DONE;
 }")
 
@@ -1847,6 +1873,12 @@
   "TARGET_H8300H && TARGET_H8300S"
   "")
 
+(define_expand "push_h8300hs_normal"
+  [(set (mem:SI (pre_dec:HI (reg:HI SP_REG)))
+        (match_operand:SI 0 "register_operand" "=r"))]
+  "TARGET_NORMAL_MODE"
+  "")
+
 (define_expand "pop_h8300"
   [(set (match_operand:HI 0 "register_operand" "=r")
 	(mem:HI (post_inc:HI (reg:HI SP_REG))))]
@@ -1857,6 +1889,12 @@
   [(set (match_operand:SI 0 "register_operand" "=r")
 	(mem:SI (post_inc:SI (reg:SI SP_REG))))]
   "TARGET_H8300H && TARGET_H8300S"
+  "")
+
+(define_expand "pop_h8300hs_normal"
+  [(set (match_operand:SI 0 "register_operand" "=r")
+	(mem:SI (post_inc:HI (reg:HI SP_REG))))]
+  "TARGET_NORMAL_MODE"
   "")
 
 (define_insn "stm_h8300s_2"


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