G1BarrierSet_merge
37 #include "utilities/macros.hpp"
38
39 #define __ _masm->
40
41 // Misc helpers
42
43 // Do an oop store like *(base + index + offset) = val
44 // index can be noreg,
45 static void do_oop_store(InterpreterMacroAssembler* _masm,
46 Register base,
47 Register index,
48 int offset,
49 Register val,
50 Register tmp,
51 BarrierSet::Name barrier,
52 bool precise) {
53 assert(tmp != val && tmp != base && tmp != index, "register collision");
54 assert(index == noreg || offset == 0, "only one offset");
55 switch (barrier) {
56 #if INCLUDE_ALL_GCS
57 case BarrierSet::G1SATBCTLogging:
58 {
59 // Load and record the previous value.
60 __ g1_write_barrier_pre(base, index, offset,
61 noreg /* pre_val */,
62 tmp, true /*preserve_o_regs*/);
63
64 // G1 barrier needs uncompressed oop for region cross check.
65 Register new_val = val;
66 if (UseCompressedOops && val != G0) {
67 new_val = tmp;
68 __ mov(val, new_val);
69 }
70
71 if (index == noreg ) {
72 assert(Assembler::is_simm13(offset), "fix this code");
73 __ store_heap_oop(val, base, offset);
74 } else {
75 __ store_heap_oop(val, base, index);
76 }
|
37 #include "utilities/macros.hpp"
38
39 #define __ _masm->
40
41 // Misc helpers
42
43 // Do an oop store like *(base + index + offset) = val
44 // index can be noreg,
45 static void do_oop_store(InterpreterMacroAssembler* _masm,
46 Register base,
47 Register index,
48 int offset,
49 Register val,
50 Register tmp,
51 BarrierSet::Name barrier,
52 bool precise) {
53 assert(tmp != val && tmp != base && tmp != index, "register collision");
54 assert(index == noreg || offset == 0, "only one offset");
55 switch (barrier) {
56 #if INCLUDE_ALL_GCS
57 case BarrierSet::G1BarrierSet:
58 {
59 // Load and record the previous value.
60 __ g1_write_barrier_pre(base, index, offset,
61 noreg /* pre_val */,
62 tmp, true /*preserve_o_regs*/);
63
64 // G1 barrier needs uncompressed oop for region cross check.
65 Register new_val = val;
66 if (UseCompressedOops && val != G0) {
67 new_val = tmp;
68 __ mov(val, new_val);
69 }
70
71 if (index == noreg ) {
72 assert(Assembler::is_simm13(offset), "fix this code");
73 __ store_heap_oop(val, base, offset);
74 } else {
75 __ store_heap_oop(val, base, index);
76 }
|