19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #include "precompiled.hpp"
26 #include "asm/macroAssembler.inline.hpp"
27 #include "gc/shared/modRefBarrierSetAssembler.hpp"
28
29 #define __ masm->
30
31 void ModRefBarrierSetAssembler::arraycopy_prologue(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
32 Register src, Register dst, Register count) {
33 bool checkcast = (decorators & ARRAYCOPY_CHECKCAST) != 0;
34 bool disjoint = (decorators & ARRAYCOPY_DISJOINT) != 0;
35 bool obj_int = type == T_OBJECT LP64_ONLY(&& UseCompressedOops);
36
37 if (type == T_OBJECT || type == T_ARRAY) {
38 #ifdef _LP64
39 if (!checkcast && !obj_int) {
40 // Save count for barrier
41 __ movptr(r11, count);
42 } else if (disjoint && obj_int) {
43 // Save dst in r11 in the disjoint case
44 __ movq(r11, dst);
45 }
46 #else
47 if (disjoint) {
48 __ mov(rdx, dst); // save 'to'
49 }
50 #endif
51 gen_write_ref_array_pre_barrier(masm, decorators, dst, count);
52 }
53 }
54
55 void ModRefBarrierSetAssembler::arraycopy_epilogue(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
56 Register src, Register dst, Register count) {
57 bool checkcast = (decorators & ARRAYCOPY_CHECKCAST) != 0;
58 bool disjoint = (decorators & ARRAYCOPY_DISJOINT) != 0;
59 bool obj_int = type == T_OBJECT LP64_ONLY(&& UseCompressedOops);
60 Register tmp = rax;
61
62 if (type == T_OBJECT || type == T_ARRAY) {
63 #ifdef _LP64
64 if (!checkcast && !obj_int) {
65 // Save count for barrier
66 count = r11;
67 } else if (disjoint && obj_int) {
68 // Use the saved dst in the disjoint case
69 dst = r11;
70 } else if (checkcast) {
71 tmp = rscratch1;
72 }
73 #else
74 if (disjoint) {
75 __ mov(dst, rdx); // restore 'to'
76 }
77 #endif
78 gen_write_ref_array_post_barrier(masm, decorators, dst, count, tmp);
79 }
80 }
81
82 void ModRefBarrierSetAssembler::store_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
83 Address dst, Register val, Register tmp1, Register tmp2) {
84 if (type == T_OBJECT || type == T_ARRAY) {
85 oop_store_at(masm, decorators, type, dst, val, tmp1, tmp2);
86 } else {
87 BarrierSetAssembler::store_at(masm, decorators, type, dst, val, tmp1, tmp2);
88 }
89 }
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #include "precompiled.hpp"
26 #include "asm/macroAssembler.inline.hpp"
27 #include "gc/shared/modRefBarrierSetAssembler.hpp"
28
29 #define __ masm->
30
31 void ModRefBarrierSetAssembler::arraycopy_prologue(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
32 Register src, Register dst, Register count) {
33 bool checkcast = (decorators & ARRAYCOPY_CHECKCAST) != 0;
34 bool disjoint = (decorators & ARRAYCOPY_DISJOINT) != 0;
35 bool obj_int = type == T_OBJECT LP64_ONLY(&& UseCompressedOops);
36
37 if (type == T_OBJECT || type == T_ARRAY) {
38 #ifdef _LP64
39 if (!checkcast) {
40 if (!obj_int) {
41 // Save count for barrier
42 __ movptr(r11, count);
43 } else if (disjoint) {
44 // Save dst in r11 in the disjoint case
45 __ movq(r11, dst);
46 }
47 }
48 #else
49 if (disjoint) {
50 __ mov(rdx, dst); // save 'to'
51 }
52 #endif
53 gen_write_ref_array_pre_barrier(masm, decorators, dst, count);
54 }
55 }
56
57 void ModRefBarrierSetAssembler::arraycopy_epilogue(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
58 Register src, Register dst, Register count) {
59 bool checkcast = (decorators & ARRAYCOPY_CHECKCAST) != 0;
60 bool disjoint = (decorators & ARRAYCOPY_DISJOINT) != 0;
61 bool obj_int = type == T_OBJECT LP64_ONLY(&& UseCompressedOops);
62 Register tmp = rax;
63
64 if (type == T_OBJECT || type == T_ARRAY) {
65 #ifdef _LP64
66 if (!checkcast) {
67 if (!obj_int) {
68 // Save count for barrier
69 count = r11;
70 } else if (disjoint) {
71 // Use the saved dst in the disjoint case
72 dst = r11;
73 }
74 } else {
75 tmp = rscratch1;
76 }
77 #else
78 if (disjoint) {
79 __ mov(dst, rdx); // restore 'to'
80 }
81 #endif
82 gen_write_ref_array_post_barrier(masm, decorators, dst, count, tmp);
83 }
84 }
85
86 void ModRefBarrierSetAssembler::store_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
87 Address dst, Register val, Register tmp1, Register tmp2) {
88 if (type == T_OBJECT || type == T_ARRAY) {
89 oop_store_at(masm, decorators, type, dst, val, tmp1, tmp2);
90 } else {
91 BarrierSetAssembler::store_at(masm, decorators, type, dst, val, tmp1, tmp2);
92 }
93 }
|