52 bool obj_int = type == T_OBJECT LP64_ONLY(&& UseCompressedOops);
53 bool dest_uninitialized = (decorators & IS_DEST_UNINITIALIZED) != 0;
54
55 if (type == T_OBJECT || type == T_ARRAY) {
56 #ifdef _LP64
57 if (!checkcast) {
58 if (!obj_int) {
59 // Save count for barrier
60 __ movptr(r11, count);
61 } else if (disjoint) {
62 // Save dst in r11 in the disjoint case
63 __ movq(r11, dst);
64 }
65 }
66 #else
67 if (disjoint) {
68 __ mov(rdx, dst); // save 'to'
69 }
70 #endif
71
72 if (ShenandoahSATBBarrier && !dest_uninitialized && !ShenandoahHeap::heap()->heuristics()->can_do_traversal_gc()) {
73 Register thread = NOT_LP64(rax) LP64_ONLY(r15_thread);
74 assert_different_registers(dst, count, thread); // we don't care about src here?
75 #ifndef _LP64
76 __ push(thread);
77 __ get_thread(thread);
78 #endif
79
80 Label done;
81 // Short-circuit if count == 0.
82 __ testptr(count, count);
83 __ jcc(Assembler::zero, done);
84
85 // Avoid runtime call when not marking.
86 Address gc_state(thread, in_bytes(ShenandoahThreadLocalData::gc_state_offset()));
87 __ testb(gc_state, ShenandoahHeap::MARKING);
88 __ jcc(Assembler::zero, done);
89
90 __ pusha(); // push registers
91 #ifdef _LP64
92 if (count == c_rarg0) {
|
52 bool obj_int = type == T_OBJECT LP64_ONLY(&& UseCompressedOops);
53 bool dest_uninitialized = (decorators & IS_DEST_UNINITIALIZED) != 0;
54
55 if (type == T_OBJECT || type == T_ARRAY) {
56 #ifdef _LP64
57 if (!checkcast) {
58 if (!obj_int) {
59 // Save count for barrier
60 __ movptr(r11, count);
61 } else if (disjoint) {
62 // Save dst in r11 in the disjoint case
63 __ movq(r11, dst);
64 }
65 }
66 #else
67 if (disjoint) {
68 __ mov(rdx, dst); // save 'to'
69 }
70 #endif
71
72 if (ShenandoahSATBBarrier && !dest_uninitialized) {
73 Register thread = NOT_LP64(rax) LP64_ONLY(r15_thread);
74 assert_different_registers(dst, count, thread); // we don't care about src here?
75 #ifndef _LP64
76 __ push(thread);
77 __ get_thread(thread);
78 #endif
79
80 Label done;
81 // Short-circuit if count == 0.
82 __ testptr(count, count);
83 __ jcc(Assembler::zero, done);
84
85 // Avoid runtime call when not marking.
86 Address gc_state(thread, in_bytes(ShenandoahThreadLocalData::gc_state_offset()));
87 __ testb(gc_state, ShenandoahHeap::MARKING);
88 __ jcc(Assembler::zero, done);
89
90 __ pusha(); // push registers
91 #ifdef _LP64
92 if (count == c_rarg0) {
|