mips.md (cprestore): Provide two alternatives...
authorRichard Sandiford <rsandifo@redhat.com>
Sun, 1 Aug 2004 11:30:39 +0000 (11:30 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Sun, 1 Aug 2004 11:30:39 +0000 (11:30 +0000)
* config/mips/mips.md (cprestore): Provide two alternatives, one for
an in-range offset and one for an out-of-range offset.  Wrap the latter
in .set macro/.set nomacro if it's inside a .set nomacro block.

From-SVN: r85405

gcc/ChangeLog
gcc/config/mips/mips.md

index c47eb67..965c655 100644 (file)
@@ -1,5 +1,11 @@
 2004-08-01  Richard Sandiford  <rsandifo@redhat.com>
 
+       * config/mips/mips.md (cprestore): Provide two alternatives, one for
+       an in-range offset and one for an out-of-range offset.  Wrap the latter
+       in .set macro/.set nomacro if it's inside a .set nomacro block.
+
+2004-08-01  Richard Sandiford  <rsandifo@redhat.com>
+
        * config/mips/mips-protos.h (mips_gp_save_slot): Remove.
        (mips_restore_gp): Declare.
        * config/mips/mips.c (mips_add_offset): Add a scratch register
index 586f12d..7c6771d 100644 (file)
@@ -4787,16 +4787,21 @@ dsrl\t%3,%3,1\n\
    (set_attr "mode"    "none")
    (set_attr "length"  "0")])
 
-;; Emit a .cprestore directive, which expands to a single store instruction.
-;; Note that we continue to use .cprestore for explicit reloc code so that
-;; jals inside inlines asms will work correctly.
+;; Emit a .cprestore directive, which normally expands to a single store
+;; instruction.  Note that we continue to use .cprestore for explicit reloc
+;; code so that jals inside inline asms will work correctly.
 (define_insn "cprestore"
-  [(unspec_volatile [(match_operand 0 "const_int_operand" "")]
+  [(unspec_volatile [(match_operand 0 "const_int_operand" "I,i")]
                    UNSPEC_CPRESTORE)]
   ""
-  ".cprestore\t%0"
+{
+  if (set_nomacro && which_alternative == 1)
+    return ".set\tmacro\;.cprestore\t%0\;.set\tnomacro";
+  else
+    return ".cprestore\t%0";
+}
   [(set_attr "type" "store")
-   (set_attr "length" "4")])
+   (set_attr "length" "4,12")])
 \f
 ;; Block moves, see mips.c for more details.
 ;; Argument 0 is the destination