< prev index next >

src/hotspot/share/c1/c1_LIRGenerator.cpp

Print this page




2287     }
2288     if (res->length() == 0 || res->last() != range)  res->append(range);
2289   }
2290   return res;
2291 }
2292 
2293 
2294 void LIRGenerator::do_TableSwitch(TableSwitch* x) {
2295   LIRItem tag(x->tag(), this);
2296   tag.load_item();
2297   set_no_result(x);
2298 
2299   if (x->is_safepoint()) {
2300     __ safepoint(safepoint_poll_register(), state_for(x, x->state_before()));
2301   }
2302 
2303   // move values into phi locations
2304   move_to_phi(x->state());
2305 
2306   int lo_key = x->lo_key();
2307   int hi_key = x->hi_key();
2308   int len = x->length();

2309   LIR_Opr value = tag.result();
2310 
2311   if (compilation()->env()->comp_level() == CompLevel_full_profile && UseSwitchProfiling) {
2312     ciMethod* method = x->state()->scope()->method();
2313     ciMethodData* md = method->method_data_or_null();
2314     ciProfileData* data = md->bci_to_data(x->state()->bci());
2315     assert(data->is_MultiBranchData(), "bad profile data?");
2316     int default_count_offset = md->byte_offset_of_slot(data, MultiBranchData::default_count_offset());
2317     LIR_Opr md_reg = new_register(T_METADATA);
2318     __ metadata2reg(md->constant_encoding(), md_reg);
2319     LIR_Opr data_offset_reg = new_pointer_register();
2320     LIR_Opr tmp_reg = new_pointer_register();
2321 
2322     __ move(LIR_OprFact::intptrConst(default_count_offset), data_offset_reg);
2323     for (int i = 0; i < len; i++) {
2324       int count_offset = md->byte_offset_of_slot(data, MultiBranchData::case_count_offset(i));
2325       __ cmp(lir_cond_equal, value, i + lo_key);
2326       __ move(data_offset_reg, tmp_reg);
2327       __ cmove(lir_cond_equal,
2328                LIR_OprFact::intptrConst(count_offset),




2287     }
2288     if (res->length() == 0 || res->last() != range)  res->append(range);
2289   }
2290   return res;
2291 }
2292 
2293 
2294 void LIRGenerator::do_TableSwitch(TableSwitch* x) {
2295   LIRItem tag(x->tag(), this);
2296   tag.load_item();
2297   set_no_result(x);
2298 
2299   if (x->is_safepoint()) {
2300     __ safepoint(safepoint_poll_register(), state_for(x, x->state_before()));
2301   }
2302 
2303   // move values into phi locations
2304   move_to_phi(x->state());
2305 
2306   int lo_key = x->lo_key();

2307   int len = x->length();
2308   assert(lo_key <= (lo_key + (len - 1)), "integer overflow");
2309   LIR_Opr value = tag.result();
2310 
2311   if (compilation()->env()->comp_level() == CompLevel_full_profile && UseSwitchProfiling) {
2312     ciMethod* method = x->state()->scope()->method();
2313     ciMethodData* md = method->method_data_or_null();
2314     ciProfileData* data = md->bci_to_data(x->state()->bci());
2315     assert(data->is_MultiBranchData(), "bad profile data?");
2316     int default_count_offset = md->byte_offset_of_slot(data, MultiBranchData::default_count_offset());
2317     LIR_Opr md_reg = new_register(T_METADATA);
2318     __ metadata2reg(md->constant_encoding(), md_reg);
2319     LIR_Opr data_offset_reg = new_pointer_register();
2320     LIR_Opr tmp_reg = new_pointer_register();
2321 
2322     __ move(LIR_OprFact::intptrConst(default_count_offset), data_offset_reg);
2323     for (int i = 0; i < len; i++) {
2324       int count_offset = md->byte_offset_of_slot(data, MultiBranchData::case_count_offset(i));
2325       __ cmp(lir_cond_equal, value, i + lo_key);
2326       __ move(data_offset_reg, tmp_reg);
2327       __ cmove(lir_cond_equal,
2328                LIR_OprFact::intptrConst(count_offset),


< prev index next >