src/cpu/mips/vm/templateTable_mips_64.cpp

changeset 8001
76b73e112cb7
parent 7998
367db633bbea
child 8003
8363e2ada4b5
equal deleted inserted replaced
8000:1510f9dcc0fa 8001:76b73e112cb7
97 97
98 // we use S0 as bcp, be sure you have bcp in S0 before you call any of the Template generator 98 // we use S0 as bcp, be sure you have bcp in S0 before you call any of the Template generator
99 Address TemplateTable::at_bcp(int offset) { 99 Address TemplateTable::at_bcp(int offset) {
100 assert(_desc->uses_bcp(), "inconsistent uses_bcp information"); 100 assert(_desc->uses_bcp(), "inconsistent uses_bcp information");
101 return Address(BCP, offset); 101 return Address(BCP, offset);
102 }
103
104 // Miscelaneous helper routines
105 // Store an oop (or NULL) at the address described by obj.
106 // If val == noreg this means store a NULL
107
108 static void do_oop_store(InterpreterMacroAssembler* _masm,
109 Address obj,
110 Register val,
111 BarrierSet::Name barrier,
112 bool precise) {
113 assert(val == noreg || val == V0, "parameter is just for looks");
114 switch (barrier) {
115 #if INCLUDE_ALL_GCS
116 // case BarrierSet::G1SATBCT:
117 // case BarrierSet::G1SATBCTLogging:
118 // {
119 // // flatten object address if needed
120 // if (obj.index() == noreg && obj.disp() == 0) {
121 // if (obj.base() != rdx) {
122 // __ movq(rdx, obj.base());
123 // }
124 // } else {
125 // __ leaq(rdx, obj);
126 // }
127 // __ g1_write_barrier_pre(rdx /* obj */,
128 // rbx /* pre_val */,
129 // r15_thread /* thread */,
130 // r8 /* tmp */,
131 // val != noreg /* tosca_live */,
132 // false /* expand_call */);
133 // if (val == noreg) {
134 // __ store_heap_oop_null(Address(rdx, 0));
135 // } else {
136 // // G1 barrier needs uncompressed oop for region cross check.
137 // Register new_val = val;
138 // if (UseCompressedOops) {
139 // new_val = rbx;
140 // __ movptr(new_val, val);
141 // }
142 // __ store_heap_oop(Address(rdx, 0), val);
143 // __ g1_write_barrier_post(rdx /* store_adr */,
144 // new_val /* new_val */,
145 // r15_thread /* thread */,
146 // r8 /* tmp */,
147 // rbx /* tmp2 */);
148 // }
149 // }
150 break;
151 #endif // INCLUDE_ALL_GCS
152 case BarrierSet::CardTableModRef:
153 case BarrierSet::CardTableExtension:
154 {
155 if (val == noreg) {
156 __ store_heap_oop_null(obj);
157 } else {
158 __ store_heap_oop(obj, val);
159 // flatten object address if needed
160 if (!precise || (obj.index() == noreg && obj.disp() == 0)) {
161 __ store_check(obj.base());
162 } else {
163 //__ leaq(rdx, obj);
164 //__ store_check(rdx);
165 }
166 }
167 }
168 break;
169 case BarrierSet::ModRef:
170 case BarrierSet::Other:
171 if (val == noreg) {
172 __ store_heap_oop_null(obj);
173 } else {
174 __ store_heap_oop(obj, val);
175 }
176 break;
177 default :
178 ShouldNotReachHere();
179
180 }
102 } 181 }
103 182
104 // bytecode folding 183 // bytecode folding
105 void TemplateTable::patch_bytecode(Bytecodes::Code bc, Register bc_reg, 184 void TemplateTable::patch_bytecode(Bytecodes::Code bc, Register bc_reg,
106 Register tmp_reg, bool load_bc_into_bc_reg/*=true*/, 185 Register tmp_reg, bool load_bc_into_bc_reg/*=true*/,

mercurial