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),
|