diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 738464f17230..e6d2e6d40f19 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,17 @@
+2003-12-03  Kazu Hirata  <kazu@cs.umass.edu>
+
+	* config/h8300/h8300.c (push): Call gen_push_h8300hs_advanced
+	instead of gen_push_h8300hs.
+	(pop): Call gen_pop_h8300hs_advanced instead of
+	gen_pop_h8300hs.
+	* config/h8300/h8300.h (TRAMPOLINE_SIZE): Use Pmode.
+	* config/h8300/h8300.md (*tablejump_h8300hs_advanced):
+	Tighten the predicate.
+	(*tablejump_h8300hs_normal): Tighten the predicate.
+	(push_h8300hs): Change to
+	push_h8300hs_advanced.
+	(pop_h8300hs): Change to pop_h8300hs_advanced.
+
 2003-12-03  Eric Christopher  <echristo@redhat.com>
 
 	* rtl.c: Fix typo.
diff --git a/gcc/config/h8300/h8300.c b/gcc/config/h8300/h8300.c
index f9754e415c44..ed3cc08c51d9 100644
--- a/gcc/config/h8300/h8300.c
+++ b/gcc/config/h8300/h8300.c
@@ -435,7 +435,7 @@ push (int rn)
   if (TARGET_H8300)
     x = gen_push_h8300 (reg);
   else if (!TARGET_NORMAL_MODE)
-    x = gen_push_h8300hs (reg);
+    x = gen_push_h8300hs_advanced (reg);
   else
     x = gen_push_h8300hs_normal (reg);
   x = emit_insn (x);
@@ -453,7 +453,7 @@ pop (int rn)
   if (TARGET_H8300)
     x = gen_pop_h8300 (reg);
   else if (!TARGET_NORMAL_MODE)
-    x = gen_pop_h8300hs (reg);
+    x = gen_pop_h8300hs_advanced (reg);
   else
     x = gen_pop_h8300hs_normal (reg);
   x = emit_insn (x);
diff --git a/gcc/config/h8300/h8300.h b/gcc/config/h8300/h8300.h
index c377b57c96b1..b60fc52af492 100644
--- a/gcc/config/h8300/h8300.h
+++ b/gcc/config/h8300/h8300.h
@@ -735,7 +735,7 @@ struct cum_arg
 
 /* Length in units of the trampoline for entering a nested function.  */
 
-#define TRAMPOLINE_SIZE ((TARGET_H8300 || TARGET_NORMAL_MODE) ? 8 : 12)
+#define TRAMPOLINE_SIZE ((Pmode == HImode) ? 8 : 12)
 
 /* Emit RTL insns to build a trampoline.
    FNADDR is an RTX for the address of the function's pure code.
diff --git a/gcc/config/h8300/h8300.md b/gcc/config/h8300/h8300.md
index 5a9d6ad50791..974330847ec2 100644
--- a/gcc/config/h8300/h8300.md
+++ b/gcc/config/h8300/h8300.md
@@ -1763,7 +1763,7 @@
 (define_insn "*tablejump_h8300hs_advanced"
   [(set (pc) (match_operand:SI 0 "register_operand" "r"))
    (use (label_ref (match_operand 1 "" "")))]
-  "TARGET_H8300H || TARGET_H8300S"
+  "(TARGET_H8300H || TARGET_H8300S) && !TARGET_NORMAL_MODE"
   "jmp	@%0"
   [(set_attr "cc" "none")
    (set_attr "length" "2")])
@@ -1792,7 +1792,7 @@
 
 (define_insn "*indirect_jump_h8300hs_advanced"
   [(set (pc) (match_operand:SI 0 "jump_address_operand" "Vr"))]
-  "TARGET_H8300H || TARGET_H8300S"
+  "(TARGET_H8300H || TARGET_H8300S) && !TARGET_NORMAL_MODE"
   "jmp @%0"
   [(set_attr "cc" "none")
    (set_attr "length" "2")])
@@ -1867,16 +1867,16 @@
   "TARGET_H8300"
   "")
 
-(define_expand "push_h8300hs"
+(define_expand "push_h8300hs_advanced"
   [(set (mem:SI (pre_dec:SI (reg:SI SP_REG)))
         (match_operand:SI 0 "register_operand" ""))]
-  "TARGET_H8300H && TARGET_H8300S"
+  "TARGET_H8300H && TARGET_H8300S && !TARGET_NORMAL_MODE"
   "")
 
 (define_expand "push_h8300hs_normal"
   [(set (mem:SI (pre_dec:HI (reg:HI SP_REG)))
         (match_operand:SI 0 "register_operand" ""))]
-  "TARGET_NORMAL_MODE"
+  "TARGET_H8300H && TARGET_H8300S && TARGET_NORMAL_MODE"
   "")
 
 (define_expand "pop_h8300"
@@ -1885,16 +1885,16 @@
   "TARGET_H8300"
   "")
 
-(define_expand "pop_h8300hs"
+(define_expand "pop_h8300hs_advanced"
   [(set (match_operand:SI 0 "register_operand" "")
 	(mem:SI (post_inc:SI (reg:SI SP_REG))))]
-  "TARGET_H8300H && TARGET_H8300S"
+  "TARGET_H8300H && TARGET_H8300S && !TARGET_NORMAL_MODE"
   "")
 
 (define_expand "pop_h8300hs_normal"
   [(set (match_operand:SI 0 "register_operand" "")
 	(mem:SI (post_inc:HI (reg:HI SP_REG))))]
-  "TARGET_NORMAL_MODE"
+  "TARGET_H8300H && TARGET_H8300S && TARGET_NORMAL_MODE"
   "")
 
 (define_insn "stm_h8300s_2_advanced"