aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorDan Nicolaescu <dann@ics.uci.edu>2001-12-12 02:22:51 +0000
committerRichard Henderson <rth@gcc.gnu.org>2001-12-11 18:22:51 -0800
commitf3bfd09c28cee0b618ada98a97c864c242f46421 (patch)
tree8c6adc3de9a3851e96397be7cef2fabcc31872e2 /gcc
parente817125dbbc96845ced07f54f93df2d757d0398f (diff)
downloadgcc-f3bfd09c28cee0b618ada98a97c864c242f46421.zip
gcc-f3bfd09c28cee0b618ada98a97c864c242f46421.tar.gz
gcc-f3bfd09c28cee0b618ada98a97c864c242f46421.tar.bz2
* config/sparc/sparc.md (prefetch): New.
From-SVN: r47911
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/config/sparc/sparc.md31
2 files changed, 35 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4151ff9..48a09e5 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,7 @@
+2001-12-11 Dan Nicolaescu <dann@ics.uci.edu>
+
+ * config/sparc/sparc.md (prefetch): New.
+
2001-12-11 Aldy Hernandez <aldyh@redhat.com>
* output.h (regno_uninitialized): Make argument unsigned.
diff --git a/gcc/config/sparc/sparc.md b/gcc/config/sparc/sparc.md
index 516453f..fc3f10b 100644
--- a/gcc/config/sparc/sparc.md
+++ b/gcc/config/sparc/sparc.md
@@ -9224,6 +9224,37 @@
&& short_branch (INSN_UID (insn), INSN_UID (operands[2]))
&& (USING_SJLJ_EXCEPTIONS || ! can_throw_internal (insn))"
"call\\t%a0, %1\\n\\tadd\\t%%o7, (%l2-.-4), %%o7")
+
+(define_insn "prefetch"
+ [(prefetch (match_operand:DI 0 "address_operand" "p")
+ (match_operand:DI 1 "const_int_operand" "n")
+ (match_operand:DI 2 "const_int_operand" "n"))]
+ "TARGET_V9"
+{
+ static const char * const prefetch_instr[2][4] = {
+ {
+ "prefetch\\t[%a0], 1", /* no locality: prefetch for one read */
+ "prefetch\\t[%a0], 0", /* medium locality: prefetch for several reads */
+ "prefetch\\t[%a0], 0", /* medium locality: prefetch for several reads */
+ "prefetch\\t[%a0], 4", /* high locality: prefetch page */
+ },
+ {
+ "prefetch\\t[%a0], 3", /* no locality: prefetch for one write */
+ "prefetch\\t[%a0], 2", /* medium locality: prefetch for several writes */
+ "prefetch\\t[%a0], 2", /* medium locality: prefetch for several writes */
+ "prefetch\\t[%a0], 4", /* high locality: prefetch page */
+ }
+ };
+ int read_or_write = INTVAL (operands[1]);
+ int locality = INTVAL (operands[2]);
+
+ if (read_or_write != 0 && read_or_write != 1)
+ abort ();
+ if (locality < 0 || locality > 3)
+ abort ();
+ return prefetch_instr [read_or_write][locality];
+}
+ [(set_attr "type" "load")])
(define_expand "prologue"
[(const_int 1)]