< prev index next >

src/hotspot/share/c1/c1_LIRGenerator.cpp

Print this page




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;


< prev index next >