sh.md (tls_global_dynamic): Use MEM pattern for the first argument of CALL.
authorKaz Kojima <kkojima@gcc.gnu.org>
Fri, 8 Oct 2004 11:44:20 +0000 (11:44 +0000)
committerKaz Kojima <kkojima@gcc.gnu.org>
Fri, 8 Oct 2004 11:44:20 +0000 (11:44 +0000)
* config/sh/sh.md (tls_global_dynamic): Use MEM pattern for the
first argument of CALL.
(tls_local_dynamic): Likewise.

* config/sh/sh.md (prefetch_media, prefetch_i4): New insns.
(prefetch): Convert to expander.

From-SVN: r88747

gcc/ChangeLog
gcc/config/sh/sh.md

index 2c0a9055724a52a43157e335b211f459a9f7d9ec..8055ac68be1a887748295bd838ad50a4250ba2cc 100644 (file)
@@ -1,3 +1,14 @@
+2004-10-08  Kaz Kojima  <kkojima@gcc.gnu.org>
+
+       * config/sh/sh.md (prefetch_media, prefetch_i4): New insns.
+       (prefetch): Convert to expander.
+
+2004-10-08  Kaz Kojima  <kkojima@gcc.gnu.org>
+
+       * config/sh/sh.md (tls_global_dynamic): Use MEM pattern for the
+       first argument of CALL.
+       (tls_local_dynamic): Likewise.
+
 2004-10-08  Joseph S. Myers  <jsm@polyomino.org.uk>
 
        * c-typeck.c (enum impl_conv): New.
index 5adcac226646b8edbb9fe47fae7b1c825af08154..dd9f216b587649c9e75e02d2457eb308367ed589 100644 (file)
 
 (define_insn "tls_global_dynamic"
   [(set (match_operand:SI 0 "register_operand" "=&z")
-       (call (unspec:SI [(match_operand:SI 1 "" "")]
-                         UNSPEC_TLSGD)
+       (call (mem:SI (unspec:SI [(match_operand:SI 1 "" "")]
+                                 UNSPEC_TLSGD))
              (const_int 0)))
    (use (reg:PSI FPSCR_REG))
    (use (reg:SI PIC_REG))
@@ -6898,8 +6898,8 @@ mov.l\\t1f,r4\\n\\
 
 (define_insn "tls_local_dynamic"
   [(set (match_operand:SI 0 "register_operand" "=&z")
-       (call (unspec:SI [(match_operand:SI 1 "" "")]
-                         UNSPEC_TLSLDM)
+       (call (mem:SI (unspec:SI [(match_operand:SI 1 "" "")]
+                                 UNSPEC_TLSLDM))
              (const_int 0)))
    (use (reg:PSI FPSCR_REG))
    (use (reg:SI PIC_REG))
@@ -10951,17 +10951,45 @@ mov.l\\t1f,r0\\n\\
   "byterev     %1, %0"
   [(set_attr "type" "arith_media")])
 
-(define_insn "prefetch"
+(define_insn "prefetch_media"
   [(prefetch (match_operand:QI 0 "address_operand" "p")
              (match_operand:SI 1 "const_int_operand" "n")
              (match_operand:SI 2 "const_int_operand" "n"))]
-  "TARGET_SHMEDIA || TARGET_HARD_SH4"
+  "TARGET_SHMEDIA"
   "*
 {
-  if (TARGET_HARD_SH4)
-    return \"pref @%0\";
   operands[0] = gen_rtx_MEM (QImode, operands[0]);
   output_asm_insn (\"ld%M0.b    %m0,r63\", operands);
   return \"\";
 }"
   [(set_attr "type" "other")])
+
+(define_insn "prefetch_i4"
+  [(prefetch (match_operand:SI 0 "register_operand" "r")
+             (match_operand:SI 1 "const_int_operand" "n")
+             (match_operand:SI 2 "const_int_operand" "n"))]
+  "TARGET_HARD_SH4"
+  "*
+{
+  return \"pref @%0\";
+}"
+  [(set_attr "type" "other")])
+
+(define_expand "prefetch"
+  [(prefetch (match_operand:QI 0 "address_operand" "p")
+             (match_operand:SI 1 "const_int_operand" "n")
+             (match_operand:SI 2 "const_int_operand" "n"))]
+  "TARGET_SHMEDIA || TARGET_HARD_SH4"
+  "
+{
+  if (TARGET_HARD_SH4 && ! register_operand (operands[0], SImode))
+    {
+      rtx reg = gen_reg_rtx (SImode);
+      emit_move_insn (reg, operands[0]);
+      operands[0] = reg;
+    }
+
+  emit_insn ((TARGET_SHMEDIA ? gen_prefetch_media : gen_prefetch_i4)
+            (operands[0], operands[1], operands[2]));
+  DONE;
+}")