2550 |
2550 |
2551 int lo_key = x->lo_key(); |
2551 int lo_key = x->lo_key(); |
2552 int hi_key = x->hi_key(); |
2552 int hi_key = x->hi_key(); |
2553 int len = x->length(); |
2553 int len = x->length(); |
2554 LIR_Opr value = tag.result(); |
2554 LIR_Opr value = tag.result(); |
|
2555 |
|
2556 if (compilation()->env()->comp_level() == CompLevel_full_profile && UseSwitchProfiling) { |
|
2557 ciMethod* method = x->state()->scope()->method(); |
|
2558 ciMethodData* md = method->method_data_or_null(); |
|
2559 ciProfileData* data = md->bci_to_data(x->state()->bci()); |
|
2560 assert(data->is_MultiBranchData(), "bad profile data?"); |
|
2561 int default_count_offset = md->byte_offset_of_slot(data, MultiBranchData::default_count_offset()); |
|
2562 LIR_Opr md_reg = new_register(T_METADATA); |
|
2563 __ metadata2reg(md->constant_encoding(), md_reg); |
|
2564 LIR_Opr data_offset_reg = new_pointer_register(); |
|
2565 LIR_Opr tmp_reg = new_pointer_register(); |
|
2566 |
|
2567 __ move(LIR_OprFact::intptrConst(default_count_offset), data_offset_reg); |
|
2568 for (int i = 0; i < len; i++) { |
|
2569 int count_offset = md->byte_offset_of_slot(data, MultiBranchData::case_count_offset(i)); |
|
2570 __ cmp(lir_cond_equal, value, i + lo_key); |
|
2571 __ move(data_offset_reg, tmp_reg); |
|
2572 __ cmove(lir_cond_equal, |
|
2573 LIR_OprFact::intptrConst(count_offset), |
|
2574 tmp_reg, |
|
2575 data_offset_reg, T_INT); |
|
2576 } |
|
2577 |
|
2578 LIR_Opr data_reg = new_pointer_register(); |
|
2579 LIR_Address* data_addr = new LIR_Address(md_reg, data_offset_reg, data_reg->type()); |
|
2580 __ move(data_addr, data_reg); |
|
2581 __ add(data_reg, LIR_OprFact::intptrConst(1), data_reg); |
|
2582 __ move(data_reg, data_addr); |
|
2583 } |
|
2584 |
2555 if (UseTableRanges) { |
2585 if (UseTableRanges) { |
2556 do_SwitchRanges(create_lookup_ranges(x), value, x->default_sux()); |
2586 do_SwitchRanges(create_lookup_ranges(x), value, x->default_sux()); |
2557 } else { |
2587 } else { |
2558 for (int i = 0; i < len; i++) { |
2588 for (int i = 0; i < len; i++) { |
2559 __ cmp(lir_cond_equal, value, i + lo_key); |
2589 __ cmp(lir_cond_equal, value, i + lo_key); |
2575 |
2605 |
2576 // move values into phi locations |
2606 // move values into phi locations |
2577 move_to_phi(x->state()); |
2607 move_to_phi(x->state()); |
2578 |
2608 |
2579 LIR_Opr value = tag.result(); |
2609 LIR_Opr value = tag.result(); |
|
2610 int len = x->length(); |
|
2611 |
|
2612 if (compilation()->env()->comp_level() == CompLevel_full_profile && UseSwitchProfiling) { |
|
2613 ciMethod* method = x->state()->scope()->method(); |
|
2614 ciMethodData* md = method->method_data_or_null(); |
|
2615 ciProfileData* data = md->bci_to_data(x->state()->bci()); |
|
2616 assert(data->is_MultiBranchData(), "bad profile data?"); |
|
2617 int default_count_offset = md->byte_offset_of_slot(data, MultiBranchData::default_count_offset()); |
|
2618 LIR_Opr md_reg = new_register(T_METADATA); |
|
2619 __ metadata2reg(md->constant_encoding(), md_reg); |
|
2620 LIR_Opr data_offset_reg = new_pointer_register(); |
|
2621 LIR_Opr tmp_reg = new_pointer_register(); |
|
2622 |
|
2623 __ move(LIR_OprFact::intptrConst(default_count_offset), data_offset_reg); |
|
2624 for (int i = 0; i < len; i++) { |
|
2625 int count_offset = md->byte_offset_of_slot(data, MultiBranchData::case_count_offset(i)); |
|
2626 __ cmp(lir_cond_equal, value, x->key_at(i)); |
|
2627 __ move(data_offset_reg, tmp_reg); |
|
2628 __ cmove(lir_cond_equal, |
|
2629 LIR_OprFact::intptrConst(count_offset), |
|
2630 tmp_reg, |
|
2631 data_offset_reg, T_INT); |
|
2632 } |
|
2633 |
|
2634 LIR_Opr data_reg = new_pointer_register(); |
|
2635 LIR_Address* data_addr = new LIR_Address(md_reg, data_offset_reg, data_reg->type()); |
|
2636 __ move(data_addr, data_reg); |
|
2637 __ add(data_reg, LIR_OprFact::intptrConst(1), data_reg); |
|
2638 __ move(data_reg, data_addr); |
|
2639 } |
|
2640 |
2580 if (UseTableRanges) { |
2641 if (UseTableRanges) { |
2581 do_SwitchRanges(create_lookup_ranges(x), value, x->default_sux()); |
2642 do_SwitchRanges(create_lookup_ranges(x), value, x->default_sux()); |
2582 } else { |
2643 } else { |
2583 int len = x->length(); |
2644 int len = x->length(); |
2584 for (int i = 0; i < len; i++) { |
2645 for (int i = 0; i < len; i++) { |