199 break;
200 #endif // INCLUDE_ALL_GCS
201 case BarrierSet::CardTableForRS:
202 case BarrierSet::CardTableExtension:
203 {
204 if (val == noreg) {
205 __ store_heap_oop_null(obj);
206 } else {
207 __ store_heap_oop(obj, val);
208 // flatten object address if needed
209 if (!precise || (obj.index() == noreg && obj.disp() == 0)) {
210 __ store_check(obj.base());
211 } else {
212 __ lea(rdx, obj);
213 __ store_check(rdx);
214 }
215 }
216 }
217 break;
218 case BarrierSet::ModRef:
219 if (val == noreg) {
220 __ store_heap_oop_null(obj);
221 } else {
222 __ store_heap_oop(obj, val);
223 }
224 break;
225 default :
226 ShouldNotReachHere();
227
228 }
229 }
230
231 Address TemplateTable::at_bcp(int offset) {
232 assert(_desc->uses_bcp(), "inconsistent uses_bcp information");
233 return Address(rbcp, offset);
234 }
235
236
237 void TemplateTable::patch_bytecode(Bytecodes::Code bc, Register bc_reg,
238 Register temp_reg, bool load_bc_into_bc_reg/*=true*/,
|
199 break;
200 #endif // INCLUDE_ALL_GCS
201 case BarrierSet::CardTableForRS:
202 case BarrierSet::CardTableExtension:
203 {
204 if (val == noreg) {
205 __ store_heap_oop_null(obj);
206 } else {
207 __ store_heap_oop(obj, val);
208 // flatten object address if needed
209 if (!precise || (obj.index() == noreg && obj.disp() == 0)) {
210 __ store_check(obj.base());
211 } else {
212 __ lea(rdx, obj);
213 __ store_check(rdx);
214 }
215 }
216 }
217 break;
218 case BarrierSet::ModRef:
219 case BarrierSet::Epsilon:
220 if (val == noreg) {
221 __ store_heap_oop_null(obj);
222 } else {
223 __ store_heap_oop(obj, val);
224 }
225 break;
226 default :
227 ShouldNotReachHere();
228
229 }
230 }
231
232 Address TemplateTable::at_bcp(int offset) {
233 assert(_desc->uses_bcp(), "inconsistent uses_bcp information");
234 return Address(rbcp, offset);
235 }
236
237
238 void TemplateTable::patch_bytecode(Bytecodes::Code bc, Register bc_reg,
239 Register temp_reg, bool load_bc_into_bc_reg/*=true*/,
|