1
1
/*
2
- * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
2
+ * Copyright (c) 2019, 2020, Oracle and/or its affiliates. All rights reserved.
3
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
4
*
5
5
* This code is free software; you can redistribute it and/or modify it
@@ -67,8 +67,6 @@ void ZBarrierSetAssembler::load_at(MacroAssembler* masm,
67
67
assert_different_registers (rscratch1, rscratch2, src.base ());
68
68
assert_different_registers (rscratch1, rscratch2, dst);
69
69
70
- RegSet savedRegs = RegSet::range (r0, r28) - RegSet::of (dst, rscratch1, rscratch2);
71
-
72
70
Label done;
73
71
74
72
// Load bad mask into scratch register.
@@ -82,37 +80,21 @@ void ZBarrierSetAssembler::load_at(MacroAssembler* masm,
82
80
83
81
__ enter ();
84
82
85
- __ push (savedRegs, sp );
83
+ __ push_call_clobbered_registers_except ( RegSet::of (dst) );
86
84
87
85
if (c_rarg0 != dst) {
88
86
__ mov (c_rarg0, dst);
89
87
}
90
88
__ mov (c_rarg1, rscratch2);
91
89
92
- int step = 4 * wordSize;
93
- __ mov (rscratch2, -step);
94
- __ sub (sp, sp, step);
95
-
96
- for (int i = 28 ; i >= 4 ; i -= 4 ) {
97
- __ st1 (as_FloatRegister (i), as_FloatRegister (i+1 ), as_FloatRegister (i+2 ),
98
- as_FloatRegister (i+3 ), __ T1D, Address (__ post (sp, rscratch2)));
99
- }
100
- __ st1 (as_FloatRegister (0 ), as_FloatRegister (1 ), as_FloatRegister (2 ),
101
- as_FloatRegister (3 ), __ T1D, Address (sp));
102
-
103
90
__ call_VM_leaf (ZBarrierSetRuntime::load_barrier_on_oop_field_preloaded_addr (decorators), 2 );
104
91
105
- for (int i = 0 ; i <= 28 ; i += 4 ) {
106
- __ ld1 (as_FloatRegister (i), as_FloatRegister (i+1 ), as_FloatRegister (i+2 ),
107
- as_FloatRegister (i+3 ), __ T1D, Address (__ post (sp, step)));
108
- }
109
-
110
92
// Make sure dst has the return value.
111
93
if (dst != r0) {
112
94
__ mov (dst, r0);
113
95
}
114
96
115
- __ pop (savedRegs, sp );
97
+ __ pop_call_clobbered_registers_except ( RegSet::of (dst) );
116
98
__ leave ();
117
99
118
100
__ bind (done);
@@ -170,7 +152,7 @@ void ZBarrierSetAssembler::arraycopy_prologue(MacroAssembler* masm,
170
152
171
153
assert_different_registers (src, count, rscratch1);
172
154
173
- __ pusha ( );
155
+ __ push (saved_regs, sp );
174
156
175
157
if (count == c_rarg0) {
176
158
if (src == c_rarg1) {
@@ -189,7 +171,8 @@ void ZBarrierSetAssembler::arraycopy_prologue(MacroAssembler* masm,
189
171
190
172
__ call_VM_leaf (ZBarrierSetRuntime::load_barrier_on_oop_array_addr (), 2 );
191
173
192
- __ popa ();
174
+ __ pop (saved_regs, sp);
175
+
193
176
BLOCK_COMMENT (" } ZBarrierSetAssembler::arraycopy_prologue" );
194
177
}
195
178
@@ -295,25 +278,15 @@ void ZBarrierSetAssembler::generate_c1_load_barrier_runtime_stub(StubAssembler*
295
278
DecoratorSet decorators) const {
296
279
__ prologue (" zgc_load_barrier stub" , false );
297
280
298
- // We don't use push/pop_clobbered_registers() - we need to pull out the result from r0.
299
- for (int i = 0 ; i < 32 ; i += 2 ) {
300
- __ stpd (as_FloatRegister (i), as_FloatRegister (i + 1 ), Address (__ pre (sp,-16 )));
301
- }
302
-
303
- const RegSet save_regs = RegSet::range (r1, r28);
304
- __ push (save_regs, sp);
281
+ __ push_call_clobbered_registers_except (RegSet::of (r0));
305
282
306
283
// Setup arguments
307
284
__ load_parameter (0 , c_rarg0);
308
285
__ load_parameter (1 , c_rarg1);
309
286
310
287
__ call_VM_leaf (ZBarrierSetRuntime::load_barrier_on_oop_field_preloaded_addr (decorators), 2 );
311
288
312
- __ pop (save_regs, sp);
313
-
314
- for (int i = 30 ; i >= 0 ; i -= 2 ) {
315
- __ ldpd (as_FloatRegister (i), as_FloatRegister (i + 1 ), Address (__ post (sp, 16 )));
316
- }
289
+ __ pop_call_clobbered_registers_except (RegSet::of (r0));
317
290
318
291
__ epilogue ();
319
292
}
0 commit comments