Commit bf85bc3d by Bernd Schmidt Committed by Bernd Schmidt

bfin.opt (micplb): New option.

	* config/bfin/bfin.opt (micplb): New option.
	* config/bfin/linux.h (SUBTARGET_DRIVER_SELF_SPECS): Set it.
	* config/bfin/bfin-protos.h (WA_INDIRECT_CALLS,
	ENABLE_WA_INDIRECT_CALLS): New macros.
	* config/bfin/bfin.c (bfin_cpus): Add WA_INDIRECT_CALLS to
	all 54x CPUs.
	(indirect_call_p): New function.
	(workaround_speculation): Handle anomaly 05-00-0426 when
	ENABLE_WA_INDIRECT_CALLS is true.
	* config/bfin/bfin.h (TARGET_CPU_CPP_BUILTINS): Define
	__WORKAROUND_INDIRECT_CALLS if ENABLE_WA_INDIRECT_CALLS.
	* doc/invoke.texi (Blackfin Options): Document -micplb.

From-SVN: r142240
parent 58ad17cf
2008-11-27 Bernd Schmidt <bernd.schmidt@analog.com>
* config/bfin/bfin.opt (micplb): New option.
* config/bfin/linux.h (SUBTARGET_DRIVER_SELF_SPECS): Set it.
* config/bfin/bfin-protos.h (WA_INDIRECT_CALLS,
ENABLE_WA_INDIRECT_CALLS): New macros.
* config/bfin/bfin.c (bfin_cpus): Add WA_INDIRECT_CALLS to
all 54x CPUs.
(indirect_call_p): New function.
(workaround_speculation): Handle anomaly 05-00-0426 when
ENABLE_WA_INDIRECT_CALLS is true.
* config/bfin/bfin.h (TARGET_CPU_CPP_BUILTINS): Define
__WORKAROUND_INDIRECT_CALLS if ENABLE_WA_INDIRECT_CALLS.
* doc/invoke.texi (Blackfin Options): Document -micplb.
2008-11-26 DJ Delorie <dj@redhat.com> 2008-11-26 DJ Delorie <dj@redhat.com>
* config/m32c/mov.md ("extendhipsi2"): New. * config/m32c/mov.md ("extendhipsi2"): New.
...@@ -75,6 +75,11 @@ extern unsigned int bfin_workarounds; ...@@ -75,6 +75,11 @@ extern unsigned int bfin_workarounds;
#define ENABLE_WA_RETS \ #define ENABLE_WA_RETS \
(bfin_workarounds & WA_RETS) (bfin_workarounds & WA_RETS)
/* For the anomaly 05-00-0426 */
#define WA_INDIRECT_CALLS 0x00000008
#define ENABLE_WA_INDIRECT_CALLS \
((bfin_workarounds & WA_INDIRECT_CALLS) && !TARGET_ICPLB)
#define WA_05000257 0x00000040 #define WA_05000257 0x00000040
#define ENABLE_WA_05000257 \ #define ENABLE_WA_05000257 \
(bfin_workarounds & WA_05000257) (bfin_workarounds & WA_05000257)
......
...@@ -254,39 +254,39 @@ struct bfin_cpu bfin_cpus[] = ...@@ -254,39 +254,39 @@ struct bfin_cpu bfin_cpus[] =
| WA_05000283 | WA_05000257 | WA_05000315}, | WA_05000283 | WA_05000257 | WA_05000315},
{"bf542", BFIN_CPU_BF542, 0x0002, {"bf542", BFIN_CPU_BF542, 0x0002,
WA_SPECULATIVE_LOADS}, WA_SPECULATIVE_LOADS | WA_INDIRECT_CALLS},
{"bf542", BFIN_CPU_BF542, 0x0001, {"bf542", BFIN_CPU_BF542, 0x0001,
WA_SPECULATIVE_LOADS | WA_RETS}, WA_SPECULATIVE_LOADS | WA_RETS | WA_INDIRECT_CALLS},
{"bf542", BFIN_CPU_BF542, 0x0000, {"bf542", BFIN_CPU_BF542, 0x0000,
WA_SPECULATIVE_LOADS | WA_RETS}, WA_SPECULATIVE_LOADS | WA_RETS | WA_INDIRECT_CALLS},
{"bf544", BFIN_CPU_BF544, 0x0002, {"bf544", BFIN_CPU_BF544, 0x0002,
WA_SPECULATIVE_LOADS}, WA_SPECULATIVE_LOADS | WA_INDIRECT_CALLS},
{"bf544", BFIN_CPU_BF544, 0x0001, {"bf544", BFIN_CPU_BF544, 0x0001,
WA_SPECULATIVE_LOADS | WA_RETS}, WA_SPECULATIVE_LOADS | WA_RETS | WA_INDIRECT_CALLS},
{"bf544", BFIN_CPU_BF544, 0x0000, {"bf544", BFIN_CPU_BF544, 0x0000,
WA_SPECULATIVE_LOADS | WA_RETS}, WA_SPECULATIVE_LOADS | WA_RETS | WA_INDIRECT_CALLS},
{"bf547", BFIN_CPU_BF547, 0x0002, {"bf547", BFIN_CPU_BF547, 0x0002,
WA_SPECULATIVE_LOADS}, WA_SPECULATIVE_LOADS | WA_INDIRECT_CALLS},
{"bf547", BFIN_CPU_BF547, 0x0001, {"bf547", BFIN_CPU_BF547, 0x0001,
WA_SPECULATIVE_LOADS | WA_RETS}, WA_SPECULATIVE_LOADS | WA_RETS | WA_INDIRECT_CALLS},
{"bf547", BFIN_CPU_BF547, 0x0000, {"bf547", BFIN_CPU_BF547, 0x0000,
WA_SPECULATIVE_LOADS | WA_RETS}, WA_SPECULATIVE_LOADS | WA_RETS | WA_INDIRECT_CALLS},
{"bf548", BFIN_CPU_BF548, 0x0002, {"bf548", BFIN_CPU_BF548, 0x0002,
WA_SPECULATIVE_LOADS}, WA_SPECULATIVE_LOADS | WA_INDIRECT_CALLS},
{"bf548", BFIN_CPU_BF548, 0x0001, {"bf548", BFIN_CPU_BF548, 0x0001,
WA_SPECULATIVE_LOADS | WA_RETS}, WA_SPECULATIVE_LOADS | WA_RETS | WA_INDIRECT_CALLS},
{"bf548", BFIN_CPU_BF548, 0x0000, {"bf548", BFIN_CPU_BF548, 0x0000,
WA_SPECULATIVE_LOADS | WA_RETS}, WA_SPECULATIVE_LOADS | WA_RETS | WA_INDIRECT_CALLS},
{"bf549", BFIN_CPU_BF549, 0x0002, {"bf549", BFIN_CPU_BF549, 0x0002,
WA_SPECULATIVE_LOADS}, WA_SPECULATIVE_LOADS | WA_INDIRECT_CALLS},
{"bf549", BFIN_CPU_BF549, 0x0001, {"bf549", BFIN_CPU_BF549, 0x0001,
WA_SPECULATIVE_LOADS | WA_RETS}, WA_SPECULATIVE_LOADS | WA_RETS | WA_INDIRECT_CALLS},
{"bf549", BFIN_CPU_BF549, 0x0000, {"bf549", BFIN_CPU_BF549, 0x0000,
WA_SPECULATIVE_LOADS | WA_RETS}, WA_SPECULATIVE_LOADS | WA_RETS | WA_INDIRECT_CALLS},
{"bf561", BFIN_CPU_BF561, 0x0005, WA_RETS {"bf561", BFIN_CPU_BF561, 0x0005, WA_RETS
| WA_05000283 | WA_05000315}, | WA_05000283 | WA_05000315},
...@@ -4921,6 +4921,22 @@ find_load (rtx insn) ...@@ -4921,6 +4921,22 @@ find_load (rtx insn)
return NULL_RTX; return NULL_RTX;
} }
/* Determine whether PAT is an indirect call pattern. */
static bool
indirect_call_p (rtx pat)
{
if (GET_CODE (pat) == PARALLEL)
pat = XVECEXP (pat, 0, 0);
if (GET_CODE (pat) == SET)
pat = SET_SRC (pat);
gcc_assert (GET_CODE (pat) == CALL);
pat = XEXP (pat, 0);
gcc_assert (GET_CODE (pat) == MEM);
pat = XEXP (pat, 0);
return REG_P (pat);
}
static void static void
workaround_speculation (void) workaround_speculation (void)
{ {
...@@ -4929,7 +4945,8 @@ workaround_speculation (void) ...@@ -4929,7 +4945,8 @@ workaround_speculation (void)
int cycles_since_jump = INT_MAX; int cycles_since_jump = INT_MAX;
int delay_added = 0; int delay_added = 0;
if (! ENABLE_WA_SPECULATIVE_LOADS && ! ENABLE_WA_SPECULATIVE_SYNCS) if (! ENABLE_WA_SPECULATIVE_LOADS && ! ENABLE_WA_SPECULATIVE_SYNCS
&& ! ENABLE_WA_INDIRECT_CALLS)
return; return;
/* First pass: find predicted-false branches; if something after them /* First pass: find predicted-false branches; if something after them
...@@ -4962,6 +4979,15 @@ workaround_speculation (void) ...@@ -4962,6 +4979,15 @@ workaround_speculation (void)
else else
cycles_since_jump = INT_MAX; cycles_since_jump = INT_MAX;
} }
else if (CALL_P (insn))
{
if (cycles_since_jump < INT_MAX)
cycles_since_jump++;
if (indirect_call_p (pat) && ENABLE_WA_INDIRECT_CALLS)
{
delay_needed = 3;
}
}
else if (INSN_P (insn)) else if (INSN_P (insn))
{ {
rtx load_insn = find_load (insn); rtx load_insn = find_load (insn);
......
...@@ -149,8 +149,10 @@ extern int target_flags; ...@@ -149,8 +149,10 @@ extern int target_flags;
builtin_define ("__WORKAROUND_SPECULATIVE_LOADS"); \ builtin_define ("__WORKAROUND_SPECULATIVE_LOADS"); \
if (ENABLE_WA_SPECULATIVE_SYNCS) \ if (ENABLE_WA_SPECULATIVE_SYNCS) \
builtin_define ("__WORKAROUND_SPECULATIVE_SYNCS"); \ builtin_define ("__WORKAROUND_SPECULATIVE_SYNCS"); \
if (ENABLE_WA_SPECULATIVE_SYNCS) \
builtin_define ("__WORKAROUND_INDIRECT_CALLS"); \
if (ENABLE_WA_RETS) \ if (ENABLE_WA_RETS) \
builtin_define ("__WORKAROUND_RETS"); \ builtin_define ("__WORKAROUND_RETS"); \
\ \
if (TARGET_FDPIC) \ if (TARGET_FDPIC) \
{ \ { \
......
...@@ -95,3 +95,7 @@ Build for Core B ...@@ -95,3 +95,7 @@ Build for Core B
msdram msdram
Target Report Mask(SDRAM) Target Report Mask(SDRAM)
Build for SDRAM Build for SDRAM
micplb
Target Report Mask(ICPLB)
Assume ICPLBs are enabled at runtime.
#undef SUBTARGET_DRIVER_SELF_SPECS #undef SUBTARGET_DRIVER_SELF_SPECS
#define SUBTARGET_DRIVER_SELF_SPECS \ #define SUBTARGET_DRIVER_SELF_SPECS \
"%{!mno-fdpic:-mfdpic}", "%{!mno-fdpic:-mfdpic} -micplb",
#undef TARGET_OS_CPP_BUILTINS #undef TARGET_OS_CPP_BUILTINS
#define TARGET_OS_CPP_BUILTINS() LINUX_TARGET_OS_CPP_BUILTINS() #define TARGET_OS_CPP_BUILTINS() LINUX_TARGET_OS_CPP_BUILTINS()
......
...@@ -468,7 +468,8 @@ Objective-C and Objective-C++ Dialects}. ...@@ -468,7 +468,8 @@ Objective-C and Objective-C++ Dialects}.
-mno-id-shared-library -mshared-library-id=@var{n} @gol -mno-id-shared-library -mshared-library-id=@var{n} @gol
-mleaf-id-shared-library -mno-leaf-id-shared-library @gol -mleaf-id-shared-library -mno-leaf-id-shared-library @gol
-msep-data -mno-sep-data -mlong-calls -mno-long-calls @gol -msep-data -mno-sep-data -mlong-calls -mno-long-calls @gol
-mfast-fp -minline-plt -mmulticore -mcorea -mcoreb -msdram} -mfast-fp -minline-plt -mmulticore -mcorea -mcoreb -msdram @gol
-micplb}
@emph{CRIS Options} @emph{CRIS Options}
@gccoptlist{-mcpu=@var{cpu} -march=@var{cpu} -mtune=@var{cpu} @gol @gccoptlist{-mcpu=@var{cpu} -march=@var{cpu} -mtune=@var{cpu} @gol
...@@ -9312,6 +9313,12 @@ Build standalone application for SDRAM. Proper start files and ...@@ -9312,6 +9313,12 @@ Build standalone application for SDRAM. Proper start files and
link scripts will be used to put the application into SDRAM. link scripts will be used to put the application into SDRAM.
Loader should initialize SDRAM before loading the application Loader should initialize SDRAM before loading the application
into SDRAM. This option defines @code{__BFIN_SDRAM}. into SDRAM. This option defines @code{__BFIN_SDRAM}.
@item -micplb
@opindex micplb
Assume that ICPLBs are enabled at runtime. This has an effect on certain
anomaly workarounds. For Linux targets, the default is to assume ICPLBs
are enabled; for standalone applications the default is off.
@end table @end table
@node CRIS Options @node CRIS Options
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment