From: David Daney <ddaney@avtrex.com>
To: gcc-patches@gcc.gnu.org
Subject: [Patch] 2/3 MIPS support for builtin __builtin_flush_icache().
Date: Sun, 01 Jul 2007 05:05:00 -0000 [thread overview]
Message-ID: <46873597.30607@avtrex.com> (raw)
In-Reply-To: <468734D3.3020908@avtrex.com>
[-- Attachment #1: Type: text/plain, Size: 1336 bytes --]
This is the second part of the __builtin_flush_icache patch. It adds
support for MIPS.
flush_icache is expanded to either a library call or an in-line cache
flushing sequence if the ISA supports it.
It it is expanded in-line it is done by two insns (synci_loop and
clear_hazard). A possible follow on optimization would be to fold the
clear_hazard into the next jump instruction that follows the synci_loop.
I also changed INITIALIZE_TRAMPOLINE to emit flush_icache instead of
the library call it used previously.
Bootstrapped and tested on x86_64-unknown-linux-gnu all default
languages with no regressions.
Also tested on:
x86_64 cross to mipsel-linux --with-arch=mips32
i686 cross to mipsel-linux --with-arch=mips32r2
with no regressions.
OK to commit?
2007-06-30 David Daney <ddaney@avtrex.com>
* config/mips/mips.h (ISA_HAS_SYNCI): New target capability
predicate.
(INITIALIZE_TRAMPOLINE): Emit flush_icache instead library call.
* config/mips/mips.md (UNSPEC_SYNCI_LOOP): New constant
(UNSPEC_CLEAR_HAZARD): New constant.
(flush_icache): New expand.
(synci_loop): New insn.
(clear_hazard): New insn.
* testsuite/gcc.target/mips/flush-icache-2.c: New test.
* testsuite/gcc.target/mips/flush-icache-1.c: New test.
* testsuite/gcc.target/mips/flush-icache-3.c: New test.
[-- Attachment #2: flush-cache2.diff --]
[-- Type: text/x-patch, Size: 5846 bytes --]
Index: config/mips/mips.h
===================================================================
--- config/mips/mips.h (revision 125997)
+++ config/mips/mips.h (working copy)
@@ -770,6 +770,10 @@ extern const struct mips_rtx_cost_data *
|| ISA_MIPS32R2 \
|| ISA_MIPS64 \
|| TARGET_MIPS5500)
+
+/* ISA includes synci, jr.hb and jalr.hb */
+#define ISA_HAS_SYNCI ISA_MIPS32R2
+
\f
/* Add -G xx support. */
@@ -2122,15 +2126,7 @@ typedef struct mips_args {
chain_addr = plus_constant (func_addr, GET_MODE_SIZE (ptr_mode)); \
emit_move_insn (gen_rtx_MEM (ptr_mode, func_addr), FUNC); \
emit_move_insn (gen_rtx_MEM (ptr_mode, chain_addr), CHAIN); \
- \
- /* Flush both caches. We need to flush the data cache in case \
- the system has a write-back cache. */ \
- /* ??? Should check the return value for errors. */ \
- if (mips_cache_flush_func && mips_cache_flush_func[0]) \
- emit_library_call (gen_rtx_SYMBOL_REF (Pmode, mips_cache_flush_func), \
- 0, VOIDmode, 3, ADDR, Pmode, \
- GEN_INT (TRAMPOLINE_SIZE), TYPE_MODE (integer_type_node),\
- GEN_INT (3), TYPE_MODE (integer_type_node)); \
+ emit_insn (gen_flush_icache (copy_rtx (ADDR), GEN_INT (TRAMPOLINE_SIZE))); \
}
\f
/* Addressing modes, and classification of registers for them. */
Index: config/mips/mips.md
===================================================================
--- config/mips/mips.md (revision 125997)
+++ config/mips/mips.md (working copy)
@@ -50,6 +50,8 @@ (define_constants
(UNSPEC_TLS_GET_TP 28)
(UNSPEC_MFHC1 31)
(UNSPEC_MTHC1 32)
+ (UNSPEC_SYNCI_LOOP 33)
+ (UNSPEC_CLEAR_HAZARD 34)
(UNSPEC_ADDRESS_FIRST 100)
@@ -4171,6 +4173,72 @@ (define_insn "cprestore"
}
[(set_attr "type" "store")
(set_attr "length" "4,12")])
+
+(define_expand "flush_icache"
+ [(match_operand:SI 0 "general_operand" "r")
+ (match_operand:SI 1 "general_operand" "r")]
+ ""
+ "
+{
+ if (ISA_HAS_SYNCI)
+ {
+ emit_insn (gen_synci_loop (copy_rtx (operands[0]),
+ copy_rtx (operands[1])));
+ emit_insn (gen_clear_hazard ());
+ }
+ else
+ /* Flush both caches. We need to flush the data cache in case
+ the system has a write-back cache. */
+ /* ??? Should check the return value for errors. */
+ if (mips_cache_flush_func && mips_cache_flush_func[0])
+ emit_library_call (gen_rtx_SYMBOL_REF (Pmode, mips_cache_flush_func),
+ 0, VOIDmode, 3, copy_rtx (operands[0]), Pmode,
+ copy_rtx (operands[1]), TYPE_MODE (integer_type_node),
+ GEN_INT (3), TYPE_MODE (integer_type_node));
+ DONE;
+}")
+
+(define_insn "synci_loop"
+ [(unspec_volatile[(match_operand:SI 0 "general_operand" "r")
+ (match_operand:SI 1 "general_operand" "r")
+ (clobber (match_scratch:SI 2 "=0"))
+ (clobber (match_scratch:SI 3 "=1"))
+ (clobber (match_scratch:SI 4 "=r"))
+ (clobber (match_scratch:SI 5 "=r"))]
+ UNSPEC_SYNCI_LOOP)]
+ "ISA_HAS_SYNCI"
+{
+ return ".set\tpush\n"
+ "\t.set\tnoreorder\n"
+ "\t.set\tnomacro\n"
+ "\taddu\t%3,%0,%1\n"
+ "\trdhwr\t%4,$1\n"
+ "1:\tsynci\t0(%2)\n"
+ "\tsltu\t%5,%2,%3\n"
+ "\tbne\t%5,$0,1b\n"
+ "\taddu\t%2,%2,%4\n"
+ "\tsync\n"
+ "\t.set\tpop";
+ }
+ [(set_attr "length" "28")])
+
+(define_insn "clear_hazard"
+ [(unspec_volatile [(clobber (match_scratch:SI 0 "=r"))] UNSPEC_CLEAR_HAZARD)
+ (clobber (reg:SI 31))]
+ "ISA_HAS_SYNCI"
+{
+ return ".set\tpush\n"
+ "\t.set\tnoreorder\n"
+ "\t.set\tnomacro\n"
+ "\tbal\t1f\n"
+ "\tnop\n"
+ "1:\taddiu\t%0,$31,12\n"
+ "\tjr.hb\t%0\n"
+ "\tnop\n"
+ "\t.set\tpop";
+}
+ [(set_attr "length" "20")])
+
\f
;; Block moves, see mips.c for more details.
;; Argument 0 is the destination
Index: testsuite/gcc.target/mips/flush-icache-2.c
===================================================================
--- testsuite/gcc.target/mips/flush-icache-2.c (revision 0)
+++ testsuite/gcc.target/mips/flush-icache-2.c (revision 0)
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-mips-options "-O2 -mips32" } */
+/* { dg-final { scan-assembler-not "synci" } } */
+/* { dg-final { scan-assembler-not "jr.hb" } } */
+/* { dg-final { scan-assembler "_flush_cache" } } */
+
+void f()
+{
+ int size = 40;
+ char *memory = __builtin_alloca(size);
+ __builtin_flush_icache(memory, size);
+}
+
Index: testsuite/gcc.target/mips/flush-icache-1.c
===================================================================
--- testsuite/gcc.target/mips/flush-icache-1.c (revision 0)
+++ testsuite/gcc.target/mips/flush-icache-1.c (revision 0)
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-mips-options "-O2 -mips32r2" } */
+/* { dg-final { scan-assembler "synci" } } */
+/* { dg-final { scan-assembler "jr.hb" } } */
+/* { dg-final { scan-assembler-not "_flush_cache" } } */
+
+void f()
+{
+ int size = 40;
+ char *memory = __builtin_alloca(size);
+ __builtin_flush_icache(memory, size);
+}
+
Index: testsuite/gcc.target/mips/flush-icache-3.c
===================================================================
--- testsuite/gcc.target/mips/flush-icache-3.c (revision 0)
+++ testsuite/gcc.target/mips/flush-icache-3.c (revision 0)
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-mips-options "-O2 -mips32r2" } */
+/* { dg-final { scan-assembler-not "synci" } } */
+/* { dg-final { scan-assembler-not "jr.hb" } } */
+/* { dg-final { scan-assembler-not "_flush_cache" } } */
+
+void f()
+{
+ char *memory = __builtin_alloca(40);
+ __builtin_flush_icache(memory, 0);
+}
+
next prev parent reply other threads:[~2007-07-01 5:05 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-07-01 5:01 [Patch] 1/3 Add new " David Daney
2007-07-01 5:05 ` David Daney [this message]
2007-07-01 10:56 ` [Patch] 2/3 MIPS support for " Richard Sandiford
2007-07-05 7:50 ` David Daney
2007-07-05 19:05 ` Richard Sandiford
2007-07-08 20:00 ` David Daney
2007-07-09 19:07 ` Richard Sandiford
2007-07-11 5:45 ` David Daney
2007-07-01 5:11 ` [Patch] 3/3 FFI: Use __builtin_flush_icache() to flush MIPS i-cache David Daney
2007-07-05 8:34 ` David Daney
2007-07-05 19:08 ` Richard Sandiford
2007-07-11 18:55 ` Tom Tromey
2007-07-01 8:01 ` [Patch] 1/3 Add new builtin __builtin_flush_icache() Paolo Bonzini
2007-07-01 17:51 ` Thiemo Seufer
2007-07-01 18:47 ` David Daney
2007-07-02 5:04 ` Paolo Bonzini
2007-07-03 23:55 ` Mark Mitchell
2007-07-04 7:18 ` Paolo Bonzini
2007-07-04 17:17 ` Mark Mitchell
2007-07-04 17:10 ` David Daney
2007-07-04 17:51 ` Mark Mitchell
2007-07-05 7:36 ` David Daney
2007-07-05 17:59 ` Richard Sandiford
2007-07-05 18:23 ` David Daney
2007-07-05 19:11 ` Richard Sandiford
2007-07-06 6:07 ` Mark Mitchell
2007-07-06 6:19 ` David Daney
2007-07-06 16:39 ` Mark Mitchell
2007-07-08 19:22 ` David Daney
2007-07-09 19:04 ` Richard Sandiford
2007-07-11 2:22 ` Mark Mitchell
2007-07-11 4:47 ` David Daney
2007-07-05 9:05 ` [Patch] 4/3 i386 target support for __builtin___clear_cache() David Daney
2007-07-08 20:39 ` David Daney
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=46873597.30607@avtrex.com \
--to=ddaney@avtrex.com \
--cc=gcc-patches@gcc.gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).