blob: e554e660e42e92a1a0c4ffb95a89bccbc52593fc (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
From cd3db73d253df229054863e5f920e59e60b84c45 Mon Sep 17 00:00:00 2001
From: Mahesh Bodapati <mbodapat@xilinx.com>
Date: Thu, 12 Jan 2017 16:41:43 +0530
Subject: [PATCH 08/54] Fix atomic side effects. In atomic_compare_and_swapsi,
add side effects to prevent incorrect assumptions during optimization.
Previously, the outputs were considered unused; this generated assembly code
with undefined side effects after invocation of the atomic.
Signed-off-by: Kirk Meyer <kirk.meyer@sencore.com>
Signed-off-by: David Holsgrove <david.holsgrove@xilinx.com>
Conflicts:
gcc/config/microblaze/microblaze.md
---
gcc/config/microblaze/microblaze.md | 3 +++
gcc/config/microblaze/sync.md | 21 +++++++++++++--------
2 files changed, 16 insertions(+), 8 deletions(-)
diff --git a/gcc/config/microblaze/microblaze.md b/gcc/config/microblaze/microblaze.md
index 671667b537c..dfd7395432b 100644
--- a/gcc/config/microblaze/microblaze.md
+++ b/gcc/config/microblaze/microblaze.md
@@ -43,6 +43,9 @@
(UNSPEC_TLS 106) ;; jump table
(UNSPEC_SET_TEXT 107) ;; set text start
(UNSPEC_TEXT 108) ;; data text relative
+ (UNSPECV_CAS_BOOL 201) ;; compare and swap (bool)
+ (UNSPECV_CAS_VAL 202) ;; compare and swap (val)
+ (UNSPECV_CAS_MEM 203) ;; compare and swap (mem)
])
(define_c_enum "unspec" [
diff --git a/gcc/config/microblaze/sync.md b/gcc/config/microblaze/sync.md
index c84bac94101..587f852b3a0 100644
--- a/gcc/config/microblaze/sync.md
+++ b/gcc/config/microblaze/sync.md
@@ -18,14 +18,19 @@
;; <http://www.gnu.org/licenses/>.
(define_insn "atomic_compare_and_swapsi"
- [(match_operand:SI 0 "register_operand" "=&d") ;; bool output
- (match_operand:SI 1 "register_operand" "=&d") ;; val output
- (match_operand:SI 2 "nonimmediate_operand" "+Q") ;; memory
- (match_operand:SI 3 "register_operand" "d") ;; expected value
- (match_operand:SI 4 "register_operand" "d") ;; desired value
- (match_operand:SI 5 "const_int_operand" "") ;; is_weak
- (match_operand:SI 6 "const_int_operand" "") ;; mod_s
- (match_operand:SI 7 "const_int_operand" "") ;; mod_f
+ [(set (match_operand:SI 0 "register_operand" "=&d") ;; bool output
+ (unspec_volatile:SI
+ [(match_operand:SI 2 "nonimmediate_operand" "+Q") ;; memory
+ (match_operand:SI 3 "register_operand" "d") ;; expected value
+ (match_operand:SI 4 "register_operand" "d")] ;; desired value
+ UNSPECV_CAS_BOOL))
+ (set (match_operand:SI 1 "register_operand" "=&d") ;; val output
+ (unspec_volatile:SI [(const_int 0)] UNSPECV_CAS_VAL))
+ (set (match_dup 2)
+ (unspec_volatile:SI [(const_int 0)] UNSPECV_CAS_MEM))
+ (match_operand:SI 5 "const_int_operand" "") ;; is_weak
+ (match_operand:SI 6 "const_int_operand" "") ;; mod_s
+ (match_operand:SI 7 "const_int_operand" "") ;; mod_f
(clobber (match_scratch:SI 8 "=&d"))]
""
{
--
2.34.1
|