src/hotspot/share/c1/c1_LIRGenerator.cpp
changeset 49877 d84f06a0cae1
parent 49754 ee93c1087584
child 49906 4bb58f644e4e
child 56489 016b77c3734a
equal deleted inserted replaced
49876:ac916fea6ec7 49877:d84f06a0cae1
  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++) {