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 #ifndef SERIALGC
57 case BarrierSet::G1SATBCT:
58 case BarrierSet::G1SATBCTLogging:
59 {
60 // Load and record the previous value.
61 __ g1_write_barrier_pre(base, index, offset,
62 noreg /* pre_val */,
63 tmp, true /*preserve_o_regs*/);
64
65 if (index == noreg ) {
66 assert(Assembler::is_simm13(offset), "fix this code");
67 __ store_heap_oop(val, base, offset);
68 } else {
69 __ store_heap_oop(val, base, index);
70 }
71
72 // No need for post barrier if storing NULL
73 if (val != G0) {
74 if (precise) {
75 if (index == noreg) {
76 __ add(base, offset, base);
77 } else {
78 __ add(base, index, base);
79 }
80 }
81 __ g1_write_barrier_post(base, val, tmp);
82 }
83 }
84 break;
85 #endif // SERIALGC
86 case BarrierSet::CardTableModRef:
87 case BarrierSet::CardTableExtension:
88 {
89 if (index == noreg ) {
90 assert(Assembler::is_simm13(offset), "fix this code");
91 __ store_heap_oop(val, base, offset);
92 } else {
93 __ store_heap_oop(val, base, index);
94 }
95 // No need for post barrier if storing NULL
96 if (val != G0) {
97 if (precise) {
98 if (index == noreg) {
99 __ add(base, offset, base);
100 } else {
101 __ add(base, index, base);
|
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 #ifndef SERIALGC
57 case BarrierSet::G1SATBCT:
58 case BarrierSet::G1SATBCTLogging:
59 {
60 // Load and record the previous value.
61 __ g1_write_barrier_pre(base, index, offset,
62 noreg /* pre_val */,
63 tmp, true /*preserve_o_regs*/);
64
65 // G1 barrier needs uncompressed oop for region cross check.
66 Register new_val = val;
67 if (UseCompressedOops && val != G0) {
68 new_val = tmp;
69 __ mov(val, new_val);
70 }
71
72 if (index == noreg ) {
73 assert(Assembler::is_simm13(offset), "fix this code");
74 __ store_heap_oop(val, base, offset);
75 } else {
76 __ store_heap_oop(val, base, index);
77 }
78
79 // No need for post barrier if storing NULL
80 if (val != G0) {
81 if (precise) {
82 if (index == noreg) {
83 __ add(base, offset, base);
84 } else {
85 __ add(base, index, base);
86 }
87 }
88 __ g1_write_barrier_post(base, new_val, tmp);
89 }
90 }
91 break;
92 #endif // SERIALGC
93 case BarrierSet::CardTableModRef:
94 case BarrierSet::CardTableExtension:
95 {
96 if (index == noreg ) {
97 assert(Assembler::is_simm13(offset), "fix this code");
98 __ store_heap_oop(val, base, offset);
99 } else {
100 __ store_heap_oop(val, base, index);
101 }
102 // No need for post barrier if storing NULL
103 if (val != G0) {
104 if (precise) {
105 if (index == noreg) {
106 __ add(base, offset, base);
107 } else {
108 __ add(base, index, base);
|