2535 return res; 2536 } 2537 2538 2539 void LIRGenerator::do_TableSwitch(TableSwitch* x) { 2540 LIRItem tag(x->tag(), this); 2541 tag.load_item(); 2542 set_no_result(x); 2543 2544 if (x->is_safepoint()) { 2545 __ safepoint(safepoint_poll_register(), state_for(x, x->state_before())); 2546 } 2547 2548 // move values into phi locations 2549 move_to_phi(x->state()); 2550 2551 int lo_key = x->lo_key(); 2552 int hi_key = x->hi_key(); 2553 int len = x->length(); 2554 LIR_Opr value = tag.result(); 2555 if (UseTableRanges) { 2556 do_SwitchRanges(create_lookup_ranges(x), value, x->default_sux()); 2557 } else { 2558 for (int i = 0; i < len; i++) { 2559 __ cmp(lir_cond_equal, value, i + lo_key); 2560 __ branch(lir_cond_equal, T_INT, x->sux_at(i)); 2561 } 2562 __ jump(x->default_sux()); 2563 } 2564 } 2565 2566 2567 void LIRGenerator::do_LookupSwitch(LookupSwitch* x) { 2568 LIRItem tag(x->tag(), this); 2569 tag.load_item(); 2570 set_no_result(x); 2571 2572 if (x->is_safepoint()) { 2573 __ safepoint(safepoint_poll_register(), state_for(x, x->state_before())); 2574 } 2575 2576 // move values into phi locations 2577 move_to_phi(x->state()); 2578 2579 LIR_Opr value = tag.result(); 2580 if (UseTableRanges) { 2581 do_SwitchRanges(create_lookup_ranges(x), value, x->default_sux()); 2582 } else { 2583 int len = x->length(); 2584 for (int i = 0; i < len; i++) { 2585 __ cmp(lir_cond_equal, value, x->key_at(i)); 2586 __ branch(lir_cond_equal, T_INT, x->sux_at(i)); 2587 } 2588 __ jump(x->default_sux()); 2589 } 2590 } 2591 2592 2593 void LIRGenerator::do_Goto(Goto* x) { 2594 set_no_result(x); 2595 2596 if (block()->next()->as_OsrEntry()) { 2597 // need to free up storage used for OSR entry point 2598 LIR_Opr osrBuffer = block()->next()->operand(); 2599 BasicTypeList signature; | 2535 return res; 2536 } 2537 2538 2539 void LIRGenerator::do_TableSwitch(TableSwitch* x) { 2540 LIRItem tag(x->tag(), this); 2541 tag.load_item(); 2542 set_no_result(x); 2543 2544 if (x->is_safepoint()) { 2545 __ safepoint(safepoint_poll_register(), state_for(x, x->state_before())); 2546 } 2547 2548 // move values into phi locations 2549 move_to_phi(x->state()); 2550 2551 int lo_key = x->lo_key(); 2552 int hi_key = x->hi_key(); 2553 int len = x->length(); 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 2585 if (UseTableRanges) { 2586 do_SwitchRanges(create_lookup_ranges(x), value, x->default_sux()); 2587 } else { 2588 for (int i = 0; i < len; i++) { 2589 __ cmp(lir_cond_equal, value, i + lo_key); 2590 __ branch(lir_cond_equal, T_INT, x->sux_at(i)); 2591 } 2592 __ jump(x->default_sux()); 2593 } 2594 } 2595 2596 2597 void LIRGenerator::do_LookupSwitch(LookupSwitch* x) { 2598 LIRItem tag(x->tag(), this); 2599 tag.load_item(); 2600 set_no_result(x); 2601 2602 if (x->is_safepoint()) { 2603 __ safepoint(safepoint_poll_register(), state_for(x, x->state_before())); 2604 } 2605 2606 // move values into phi locations 2607 move_to_phi(x->state()); 2608 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 2641 if (UseTableRanges) { 2642 do_SwitchRanges(create_lookup_ranges(x), value, x->default_sux()); 2643 } else { 2644 int len = x->length(); 2645 for (int i = 0; i < len; i++) { 2646 __ cmp(lir_cond_equal, value, x->key_at(i)); 2647 __ branch(lir_cond_equal, T_INT, x->sux_at(i)); 2648 } 2649 __ jump(x->default_sux()); 2650 } 2651 } 2652 2653 2654 void LIRGenerator::do_Goto(Goto* x) { 2655 set_no_result(x); 2656 2657 if (block()->next()->as_OsrEntry()) { 2658 // need to free up storage used for OSR entry point 2659 LIR_Opr osrBuffer = block()->next()->operand(); 2660 BasicTypeList signature; |