aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Cederman <cederman@gaisler.com>2024-01-04 14:56:06 +0100
committerDaniel Hellstrom <daniel@gaisler.com>2024-01-16 12:53:48 +0100
commitaf5986139811137fe02154a25c5e62abbdc93048 (patch)
tree79f0af35461ffcf4ba7c7671daaa198bb9125acd
parent13db80cb88f93fb7b06e0ad24ea6b9ecf028282e (diff)
downloadgcc-af5986139811137fe02154a25c5e62abbdc93048.zip
gcc-af5986139811137fe02154a25c5e62abbdc93048.tar.gz
gcc-af5986139811137fe02154a25c5e62abbdc93048.tar.bz2
sparc: Add errata workaround to membar patterns
LEON now uses the standard V8 membar patterns that contains an ldstub instruction. This instruction needs to be aligned properly when the GR712RC errata workaround is enabled. gcc/ChangeLog: * config/sparc/sparc.cc (atomic_insn_for_leon3_p): Treat membar_storeload as atomic * config/sparc/sync.md (membar_storeload): Turn into named insn and add GR712RC errata workaround. (membar_v8): Add GR712RC errata workaround.
-rw-r--r--gcc/config/sparc/sparc.cc1
-rw-r--r--gcc/config/sparc/sync.md23
2 files changed, 19 insertions, 5 deletions
diff --git a/gcc/config/sparc/sparc.cc b/gcc/config/sparc/sparc.cc
index ebf1a55..62c57cc 100644
--- a/gcc/config/sparc/sparc.cc
+++ b/gcc/config/sparc/sparc.cc
@@ -1052,6 +1052,7 @@ atomic_insn_for_leon3_p (rtx_insn *insn)
{
switch (INSN_CODE (insn))
{
+ case CODE_FOR_membar_storeload:
case CODE_FOR_swapsi:
case CODE_FOR_ldstub:
case CODE_FOR_atomic_compare_and_swap_leon3_1:
diff --git a/gcc/config/sparc/sync.md b/gcc/config/sparc/sync.md
index ac29142..fa24990 100644
--- a/gcc/config/sparc/sync.md
+++ b/gcc/config/sparc/sync.md
@@ -65,12 +65,19 @@
[(set_attr "type" "multi")])
;; For V8, LDSTUB has the effect of membar #StoreLoad.
-(define_insn "*membar_storeload"
+(define_insn "membar_storeload"
[(set (match_operand:BLK 0 "" "")
(unspec:BLK [(match_dup 0) (const_int 2)] UNSPEC_MEMBAR))]
"TARGET_V8"
- "ldstub\t[%%sp-1], %%g0"
- [(set_attr "type" "multi")])
+{
+ if (sparc_fix_gr712rc)
+ return ".align\t16\n\tldstub\t[%%sp-1], %%g0";
+ else
+ return "ldstub\t[%%sp-1], %%g0";
+}
+ [(set_attr "type" "multi")
+ (set (attr "length") (if_then_else (eq_attr "fix_gr712rc" "true")
+ (const_int 4) (const_int 1)))])
;; Put the two together, in combination with the fact that V8 implements PSO
;; as its weakest memory model, means a full barrier. Match all remaining
@@ -80,9 +87,15 @@
(unspec:BLK [(match_dup 0) (match_operand:SI 1 "const_int_operand")]
UNSPEC_MEMBAR))]
"TARGET_V8"
- "stbar\n\tldstub\t[%%sp-1], %%g0"
+{
+ if (sparc_fix_gr712rc)
+ return "stbar\n.align\t16\n\tldstub\t[%%sp-1], %%g0";
+ else
+ return "stbar\n\tldstub\t[%%sp-1], %%g0";
+}
[(set_attr "type" "multi")
- (set_attr "length" "2")])
+ (set (attr "length") (if_then_else (eq_attr "fix_gr712rc" "true")
+ (const_int 5) (const_int 2)))])
;; For V9, we have the full membar instruction.
(define_insn "*membar"