bfin.h (EH_RETURN_HANDLER_RTX): Use gen_frame_mem.
authorBernd Schmidt <bernd.schmidt@analog.com>
Wed, 13 Jun 2007 17:41:07 +0000 (17:41 +0000)
committerBernd Schmidt <bernds@gcc.gnu.org>
Wed, 13 Jun 2007 17:41:07 +0000 (17:41 +0000)
* config/bfin/bfin.h (EH_RETURN_HANDLER_RTX): Use gen_frame_mem.
* config/bfin/bfin.md (UNSPEC_VOLATILE_STORE_EH_HANDLER): New constant.
(eh_store_handler): New pattern.
(eh_return): Emit it instead of a plain move.

From-SVN: r125681

gcc/ChangeLog
gcc/config/bfin/bfin.h
gcc/config/bfin/bfin.md

index 411193fed04a85e49b89736a495b40f3fe7a167c..411f28a08b81530537d9291e612d79ea65c19fb0 100644 (file)
@@ -1,3 +1,10 @@
+2007-06-13  Bernd Schmidt  <bernd.schmidt@analog.com>
+
+       * config/bfin/bfin.h (EH_RETURN_HANDLER_RTX): Use gen_frame_mem.
+       * config/bfin/bfin.md (UNSPEC_VOLATILE_STORE_EH_HANDLER): New constant.
+       (eh_store_handler): New pattern.
+       (eh_return): Emit it instead of a plain move.
+
 2007-06-13  Uros Bizjak  <ubizjak@gmail.com>
 
        * config/i386/i386.c (ix86_init_mmx_sse_builtins)
index b78ecb2c84a3009d8cae0dcc0d70791039a78e7d..b42a096fd7a07797d5ecc7d2e5bb06866ff9891b 100644 (file)
@@ -813,7 +813,7 @@ typedef struct {
 #define EH_RETURN_DATA_REGNO(N)        ((N) < 2 ? (N) : INVALID_REGNUM)
 #define EH_RETURN_STACKADJ_RTX gen_rtx_REG (Pmode, REG_P2)
 #define EH_RETURN_HANDLER_RTX \
-    gen_rtx_MEM (Pmode, plus_constant (frame_pointer_rtx, UNITS_PER_WORD))
+    gen_frame_mem (Pmode, plus_constant (frame_pointer_rtx, UNITS_PER_WORD))
 
 /* Addressing Modes */
 
index 1fafa881f7863de8eae649f3fedfee285b2338b3..144df5af30c9df78988691674901866e716cba34 100644 (file)
   [(UNSPEC_VOLATILE_EH_RETURN 0)
    (UNSPEC_VOLATILE_CSYNC 1)
    (UNSPEC_VOLATILE_SSYNC 2)
-   (UNSPEC_VOLATILE_LOAD_FUNCDESC 3)])
+   (UNSPEC_VOLATILE_LOAD_FUNCDESC 3)
+   (UNSPEC_VOLATILE_STORE_EH_HANDLER 4)])
 
 (define_constants
   [(MACFLAG_NONE 0)
                    UNSPEC_VOLATILE_EH_RETURN)]
   ""
 {
-  emit_move_insn (EH_RETURN_HANDLER_RTX, operands[0]);
+  emit_insn (gen_eh_store_handler (EH_RETURN_HANDLER_RTX, operands[0]));
   emit_jump_insn (gen_eh_return_internal ());
   emit_barrier ();
   DONE;
 })
 
+(define_insn "eh_store_handler"
+  [(unspec_volatile [(match_operand:SI 1 "register_operand" "da")]
+                   UNSPEC_VOLATILE_STORE_EH_HANDLER)
+   (clobber (match_operand:SI 0 "memory_operand" "=m"))]
+  ""
+  "%0 = %1%!"
+  [(set_attr "type" "mcst")])
+
 (define_insn_and_split "eh_return_internal"
   [(set (pc)
        (unspec_volatile [(reg:SI REG_P2)] UNSPEC_VOLATILE_EH_RETURN))]