@@ -35,7 +35,7 @@ source %{
35
35
36
36
static void z_load_barrier(MacroAssembler& _masm, const MachNode* node, Address ref_addr, Register ref, Register tmp, uint8_t barrier_data) {
37
37
if (barrier_data == ZLoadBarrierElided) {
38
- return; // Elided.
38
+ return;
39
39
}
40
40
ZLoadBarrierStubC2* const stub = ZLoadBarrierStubC2::create(node, ref_addr, ref, tmp, barrier_data);
41
41
{
@@ -60,6 +60,27 @@ static void z_load_barrier_cmpxchg(MacroAssembler& _masm, const MachNode* node,
60
60
__ bind(*stub->continuation());
61
61
}
62
62
63
+ static void z_cmpxchg_common(MacroAssembler& _masm, const MachNode* node, Register mem_reg, Register newval, Register tmp) {
64
+ // Compare value (oldval) is in rax
65
+ const Address mem = Address(mem_reg, 0);
66
+
67
+ if (node->barrier_data() != ZLoadBarrierElided) {
68
+ __ movptr(tmp, rax);
69
+ }
70
+
71
+ __ lock();
72
+ __ cmpxchgptr(newval, mem);
73
+
74
+ if (node->barrier_data() != ZLoadBarrierElided) {
75
+ Label good;
76
+ z_load_barrier_cmpxchg(_masm, node, mem, rax, tmp, good);
77
+ __ movptr(rax, tmp);
78
+ __ lock();
79
+ __ cmpxchgptr(newval, mem);
80
+ __ bind(good);
81
+ }
82
+ }
83
+
63
84
%}
64
85
65
86
// Load Pointer
@@ -81,7 +102,7 @@ instruct zLoadP(rRegP dst, memory mem, rFlagsReg cr)
81
102
ins_pipe(ialu_reg_mem);
82
103
%}
83
104
84
- instruct zCompareAndExchangeP(memory mem, rax_RegP oldval, rRegP newval, rRegP tmp, rFlagsReg cr) %{
105
+ instruct zCompareAndExchangeP(indirect mem, rax_RegP oldval, rRegP newval, rRegP tmp, rFlagsReg cr) %{
85
106
match(Set oldval (CompareAndExchangeP mem (Binary oldval newval)));
86
107
predicate(UseZGC && n->as_LoadStore()->barrier_data() == ZLoadBarrierStrong);
87
108
effect(KILL cr, TEMP tmp);
@@ -90,26 +111,14 @@ instruct zCompareAndExchangeP(memory mem, rax_RegP oldval, rRegP newval, rRegP t
90
111
"cmpxchgq $newval, $mem" %}
91
112
92
113
ins_encode %{
93
- if (barrier_data() != ZLoadBarrierElided) { // barrier could be elided by ZBarrierSetC2::analyze_dominating_barriers()
94
- __ movptr($tmp$$Register, $oldval$$Register);
95
- }
96
- __ lock();
97
- __ cmpxchgptr($newval$$Register, $mem$$Address);
98
-
99
- if (barrier_data() != ZLoadBarrierElided) {
100
- Label good;
101
- z_load_barrier_cmpxchg(_masm, this, $mem$$Address, $oldval$$Register, $tmp$$Register, good);
102
- __ movptr($oldval$$Register, $tmp$$Register);
103
- __ lock();
104
- __ cmpxchgptr($newval$$Register, $mem$$Address);
105
- __ bind(good);
106
- }
114
+ precond($oldval$$Register == rax);
115
+ z_cmpxchg_common(_masm, this, $mem$$Register, $newval$$Register, $tmp$$Register);
107
116
%}
108
117
109
118
ins_pipe(pipe_cmpxchg);
110
119
%}
111
120
112
- instruct zCompareAndSwapP(rRegI res, memory mem, rRegP newval, rRegP tmp, rFlagsReg cr, rax_RegP oldval) %{
121
+ instruct zCompareAndSwapP(rRegI res, indirect mem, rRegP newval, rRegP tmp, rFlagsReg cr, rax_RegP oldval) %{
113
122
match(Set res (CompareAndSwapP mem (Binary oldval newval)));
114
123
match(Set res (WeakCompareAndSwapP mem (Binary oldval newval)));
115
124
predicate(UseZGC && n->as_LoadStore()->barrier_data() == ZLoadBarrierStrong);
@@ -121,20 +130,10 @@ instruct zCompareAndSwapP(rRegI res, memory mem, rRegP newval, rRegP tmp, rFlags
121
130
"movzbl $res, $res" %}
122
131
123
132
ins_encode %{
124
- if (barrier_data() != ZLoadBarrierElided) { // barrier could be elided by ZBarrierSetC2::analyze_dominating_barriers()
125
- __ movptr($tmp$$Register, $oldval$$Register);
126
- }
127
- __ lock();
128
- __ cmpxchgptr($newval$$Register, $mem$$Address);
129
-
133
+ precond($oldval$$Register == rax);
134
+ z_cmpxchg_common(_masm, this, $mem$$Register, $newval$$Register, $tmp$$Register);
130
135
if (barrier_data() != ZLoadBarrierElided) {
131
- Label good;
132
- z_load_barrier_cmpxchg(_masm, this, $mem$$Address, $oldval$$Register, $tmp$$Register, good);
133
- __ movptr($oldval$$Register, $tmp$$Register);
134
- __ lock();
135
- __ cmpxchgptr($newval$$Register, $mem$$Address);
136
- __ bind(good);
137
- __ cmpptr($tmp$$Register, $oldval$$Register);
136
+ __ cmpptr($tmp$$Register, rax);
138
137
}
139
138
__ setb(Assembler::equal, $res$$Register);
140
139
__ movzbl($res$$Register, $res$$Register);
@@ -143,15 +142,15 @@ instruct zCompareAndSwapP(rRegI res, memory mem, rRegP newval, rRegP tmp, rFlags
143
142
ins_pipe(pipe_cmpxchg);
144
143
%}
145
144
146
- instruct zXChgP(memory mem, rRegP newval, rFlagsReg cr) %{
145
+ instruct zXChgP(indirect mem, rRegP newval, rFlagsReg cr) %{
147
146
match(Set newval (GetAndSetP mem newval));
148
147
predicate(UseZGC && n->as_LoadStore()->barrier_data() != 0);
149
148
effect(KILL cr);
150
149
151
150
format %{ "xchgq $newval, $mem" %}
152
151
153
152
ins_encode %{
154
- __ xchgptr($newval$$Register, $mem$$Address );
153
+ __ xchgptr($newval$$Register, Address( $mem$$Register, 0) );
155
154
z_load_barrier(_masm, this, Address(noreg, 0), $newval$$Register, noreg /* tmp */, barrier_data());
156
155
%}
157
156
0 commit comments