alpha.h (TARGET_FIXUP_EV5_PREFETCH): New.

* config/alpha/alpha.h (TARGET_FIXUP_EV5_PREFETCH): New.
        * config/alpha/linux.h (TARGET_FIXUP_EV5_PREFETCH): New.
        * config/alpha/alpha.md (prefetch): New.

From-SVN: r47922
This commit is contained in:
Richard Henderson 2001-12-11 22:40:27 -08:00 committed by Richard Henderson
parent 8deb751450
commit 14291bc7fa
4 changed files with 51 additions and 0 deletions

View file

@ -1,3 +1,9 @@
2001-12-11 Richard Henderson <rth@redhat.com>
* config/alpha/alpha.h (TARGET_FIXUP_EV5_PREFETCH): New.
* config/alpha/linux.h (TARGET_FIXUP_EV5_PREFETCH): New.
* config/alpha/alpha.md (prefetch): New.
2001-12-11 Richard Henderson <rth@redhat.com>
* combine.c (simplify_and_const_int): Simplify (AND (PLUS X Y) C)

View file

@ -206,6 +206,9 @@ extern enum alpha_fp_trap_mode alpha_fptm;
#ifndef TARGET_LD_BUGGY_LDGP
#define TARGET_LD_BUGGY_LDGP 0
#endif
#ifndef TARGET_FIXUP_EV5_PREFETCH
#define TARGET_FIXUP_EV5_PREFETCH 0
#endif
/* Macro to define tables used to set the flags.
This is a list in braces of pairs in braces,

View file

@ -6716,6 +6716,44 @@ fadd,fmul,fcpys,fdiv,fsqrt,misc,mvi,ftoi,itof,multi"
[(set_attr "length" "16")
(set_attr "type" "multi")])
;; Prefetch data.
;;
;; On EV4, these instructions are nops -- no load occurs.
;;
;; On EV5, these instructions act as a normal load, and thus can trap
;; if the address is invalid. The OS may (or may not) handle this in
;; the entMM fault handler and suppress the fault. If so, then this
;; has the effect of a read prefetch instruction.
;;
;; On EV6, these become official prefetch instructions.
(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_FIXUP_EV5_PREFETCH || TARGET_CPU_EV6"
{
/* Interpret "no temporal locality" as this data should be evicted once
it is used. The "evict next" alternatives load the data into the cache
and leave the LRU eviction counter pointing to that block. */
static const char * const alt[2][2] = {
{
"lds $f31,%a0", /* read, evict next */
"ldl $31,%a0", /* read, evict last */
},
{
"ldt $f31,%a0", /* write, evict next */
"ldq $31,%a0", /* write, evict last */
}
};
bool write = INTVAL (operands[1]) != 0;
bool lru = INTVAL (operands[2]) != 0;
return alt[write][lru];
}
[(set_attr "type" "ild")])
;; Close the trap shadow of preceding instructions. This is generated
;; by alpha_reorg.

View file

@ -46,6 +46,10 @@ SUB_CPP_PREDEFINES
#undef TARGET_CAN_FAULT_IN_PROLOGUE
#define TARGET_CAN_FAULT_IN_PROLOGUE 1
/* OS fixes up EV5 data fault on prefetch. */
#undef TARGET_FIXUP_EV5_PREFETCH
#define TARGET_FIXUP_EV5_PREFETCH 1
#undef WCHAR_TYPE
#define WCHAR_TYPE "int"