1283 |
1283 |
1284 bool MachConstantBaseNode::requires_postalloc_expand() const { return true; } |
1284 bool MachConstantBaseNode::requires_postalloc_expand() const { return true; } |
1285 void MachConstantBaseNode::postalloc_expand(GrowableArray <Node *> *nodes, PhaseRegAlloc *ra_) { |
1285 void MachConstantBaseNode::postalloc_expand(GrowableArray <Node *> *nodes, PhaseRegAlloc *ra_) { |
1286 Compile *C = ra_->C; |
1286 Compile *C = ra_->C; |
1287 |
1287 |
1288 iRegPdstOper *op_dst = new (C) iRegPdstOper(); |
1288 iRegPdstOper *op_dst = new iRegPdstOper(); |
1289 MachNode *m1 = new (C) loadToc_hiNode(); |
1289 MachNode *m1 = new loadToc_hiNode(); |
1290 MachNode *m2 = new (C) loadToc_loNode(); |
1290 MachNode *m2 = new loadToc_loNode(); |
1291 |
1291 |
1292 m1->add_req(NULL); |
1292 m1->add_req(NULL); |
1293 m2->add_req(NULL, m1); |
1293 m2->add_req(NULL, m1); |
1294 m1->_opnds[0] = op_dst; |
1294 m1->_opnds[0] = op_dst; |
1295 m2->_opnds[0] = op_dst; |
1295 m2->_opnds[0] = op_dst; |
2230 /* TODO: PPC port |
2230 /* TODO: PPC port |
2231 // Make a new machine dependent decode node (with its operands). |
2231 // Make a new machine dependent decode node (with its operands). |
2232 MachTypeNode *Matcher::make_decode_node(Compile *C) { |
2232 MachTypeNode *Matcher::make_decode_node(Compile *C) { |
2233 assert(Universe::narrow_oop_base() == NULL && Universe::narrow_oop_shift() == 0, |
2233 assert(Universe::narrow_oop_base() == NULL && Universe::narrow_oop_shift() == 0, |
2234 "This method is only implemented for unscaled cOops mode so far"); |
2234 "This method is only implemented for unscaled cOops mode so far"); |
2235 MachTypeNode *decode = new (C) decodeN_unscaledNode(); |
2235 MachTypeNode *decode = new decodeN_unscaledNode(); |
2236 decode->set_opnd_array(0, new (C) iRegPdstOper()); |
2236 decode->set_opnd_array(0, new iRegPdstOper()); |
2237 decode->set_opnd_array(1, new (C) iRegNsrcOper()); |
2237 decode->set_opnd_array(1, new iRegNsrcOper()); |
2238 return decode; |
2238 return decode; |
2239 } |
2239 } |
2240 */ |
2240 */ |
2241 // Threshold size for cleararray. |
2241 // Threshold size for cleararray. |
2242 const int Matcher::init_array_short_size = 8 * BytesPerLong; |
2242 const int Matcher::init_array_short_size = 8 * BytesPerLong; |
2598 loadConLNodesTuple nodes; |
2598 loadConLNodesTuple nodes; |
2599 |
2599 |
2600 const bool large_constant_pool = true; // TODO: PPC port C->cfg()->_consts_size > 4000; |
2600 const bool large_constant_pool = true; // TODO: PPC port C->cfg()->_consts_size > 4000; |
2601 if (large_constant_pool) { |
2601 if (large_constant_pool) { |
2602 // Create new nodes. |
2602 // Create new nodes. |
2603 loadConL_hiNode *m1 = new (C) loadConL_hiNode(); |
2603 loadConL_hiNode *m1 = new loadConL_hiNode(); |
2604 loadConL_loNode *m2 = new (C) loadConL_loNode(); |
2604 loadConL_loNode *m2 = new loadConL_loNode(); |
2605 |
2605 |
2606 // inputs for new nodes |
2606 // inputs for new nodes |
2607 m1->add_req(NULL, toc); |
2607 m1->add_req(NULL, toc); |
2608 m2->add_req(NULL, m1); |
2608 m2->add_req(NULL, m1); |
2609 |
2609 |
2610 // operands for new nodes |
2610 // operands for new nodes |
2611 m1->_opnds[0] = new (C) iRegLdstOper(); // dst |
2611 m1->_opnds[0] = new iRegLdstOper(); // dst |
2612 m1->_opnds[1] = immSrc; // src |
2612 m1->_opnds[1] = immSrc; // src |
2613 m1->_opnds[2] = new (C) iRegPdstOper(); // toc |
2613 m1->_opnds[2] = new iRegPdstOper(); // toc |
2614 m2->_opnds[0] = new (C) iRegLdstOper(); // dst |
2614 m2->_opnds[0] = new iRegLdstOper(); // dst |
2615 m2->_opnds[1] = immSrc; // src |
2615 m2->_opnds[1] = immSrc; // src |
2616 m2->_opnds[2] = new (C) iRegLdstOper(); // base |
2616 m2->_opnds[2] = new iRegLdstOper(); // base |
2617 |
2617 |
2618 // Initialize ins_attrib TOC fields. |
2618 // Initialize ins_attrib TOC fields. |
2619 m1->_const_toc_offset = -1; |
2619 m1->_const_toc_offset = -1; |
2620 m2->_const_toc_offset_hi_node = m1; |
2620 m2->_const_toc_offset_hi_node = m1; |
2621 |
2621 |
2631 nodes._large_lo = m2; |
2631 nodes._large_lo = m2; |
2632 nodes._small = NULL; |
2632 nodes._small = NULL; |
2633 nodes._last = nodes._large_lo; |
2633 nodes._last = nodes._large_lo; |
2634 assert(m2->bottom_type()->isa_long(), "must be long"); |
2634 assert(m2->bottom_type()->isa_long(), "must be long"); |
2635 } else { |
2635 } else { |
2636 loadConLNode *m2 = new (C) loadConLNode(); |
2636 loadConLNode *m2 = new loadConLNode(); |
2637 |
2637 |
2638 // inputs for new nodes |
2638 // inputs for new nodes |
2639 m2->add_req(NULL, toc); |
2639 m2->add_req(NULL, toc); |
2640 |
2640 |
2641 // operands for new nodes |
2641 // operands for new nodes |
2642 m2->_opnds[0] = new (C) iRegLdstOper(); // dst |
2642 m2->_opnds[0] = new iRegLdstOper(); // dst |
2643 m2->_opnds[1] = immSrc; // src |
2643 m2->_opnds[1] = immSrc; // src |
2644 m2->_opnds[2] = new (C) iRegPdstOper(); // toc |
2644 m2->_opnds[2] = new iRegPdstOper(); // toc |
2645 |
2645 |
2646 // Initialize ins_attrib instruction offset. |
2646 // Initialize ins_attrib instruction offset. |
2647 m2->_cbuf_insts_offset = -1; |
2647 m2->_cbuf_insts_offset = -1; |
2648 |
2648 |
2649 // register allocation for new nodes |
2649 // register allocation for new nodes |
2748 // expand. |
2748 // expand. |
2749 enc_class postalloc_expand_load_ptr_constant(iRegPdst dst, immP src, iRegLdst toc) %{ |
2749 enc_class postalloc_expand_load_ptr_constant(iRegPdst dst, immP src, iRegLdst toc) %{ |
2750 const bool large_constant_pool = true; // TODO: PPC port C->cfg()->_consts_size > 4000; |
2750 const bool large_constant_pool = true; // TODO: PPC port C->cfg()->_consts_size > 4000; |
2751 if (large_constant_pool) { |
2751 if (large_constant_pool) { |
2752 // Create new nodes. |
2752 // Create new nodes. |
2753 loadConP_hiNode *m1 = new (C) loadConP_hiNode(); |
2753 loadConP_hiNode *m1 = new loadConP_hiNode(); |
2754 loadConP_loNode *m2 = new (C) loadConP_loNode(); |
2754 loadConP_loNode *m2 = new loadConP_loNode(); |
2755 |
2755 |
2756 // inputs for new nodes |
2756 // inputs for new nodes |
2757 m1->add_req(NULL, n_toc); |
2757 m1->add_req(NULL, n_toc); |
2758 m2->add_req(NULL, m1); |
2758 m2->add_req(NULL, m1); |
2759 |
2759 |
2760 // operands for new nodes |
2760 // operands for new nodes |
2761 m1->_opnds[0] = new (C) iRegPdstOper(); // dst |
2761 m1->_opnds[0] = new iRegPdstOper(); // dst |
2762 m1->_opnds[1] = op_src; // src |
2762 m1->_opnds[1] = op_src; // src |
2763 m1->_opnds[2] = new (C) iRegPdstOper(); // toc |
2763 m1->_opnds[2] = new iRegPdstOper(); // toc |
2764 m2->_opnds[0] = new (C) iRegPdstOper(); // dst |
2764 m2->_opnds[0] = new iRegPdstOper(); // dst |
2765 m2->_opnds[1] = op_src; // src |
2765 m2->_opnds[1] = op_src; // src |
2766 m2->_opnds[2] = new (C) iRegLdstOper(); // base |
2766 m2->_opnds[2] = new iRegLdstOper(); // base |
2767 |
2767 |
2768 // Initialize ins_attrib TOC fields. |
2768 // Initialize ins_attrib TOC fields. |
2769 m1->_const_toc_offset = -1; |
2769 m1->_const_toc_offset = -1; |
2770 m2->_const_toc_offset_hi_node = m1; |
2770 m2->_const_toc_offset_hi_node = m1; |
2771 |
2771 |
2775 |
2775 |
2776 nodes->push(m1); |
2776 nodes->push(m1); |
2777 nodes->push(m2); |
2777 nodes->push(m2); |
2778 assert(m2->bottom_type()->isa_ptr(), "must be ptr"); |
2778 assert(m2->bottom_type()->isa_ptr(), "must be ptr"); |
2779 } else { |
2779 } else { |
2780 loadConPNode *m2 = new (C) loadConPNode(); |
2780 loadConPNode *m2 = new loadConPNode(); |
2781 |
2781 |
2782 // inputs for new nodes |
2782 // inputs for new nodes |
2783 m2->add_req(NULL, n_toc); |
2783 m2->add_req(NULL, n_toc); |
2784 |
2784 |
2785 // operands for new nodes |
2785 // operands for new nodes |
2786 m2->_opnds[0] = new (C) iRegPdstOper(); // dst |
2786 m2->_opnds[0] = new iRegPdstOper(); // dst |
2787 m2->_opnds[1] = op_src; // src |
2787 m2->_opnds[1] = op_src; // src |
2788 m2->_opnds[2] = new (C) iRegPdstOper(); // toc |
2788 m2->_opnds[2] = new iRegPdstOper(); // toc |
2789 |
2789 |
2790 // Register allocation for new nodes. |
2790 // Register allocation for new nodes. |
2791 ra_->set_pair(m2->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); |
2791 ra_->set_pair(m2->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); |
2792 |
2792 |
2793 nodes->push(m2); |
2793 nodes->push(m2); |
2800 enc_class postalloc_expand_load_float_constant(regF dst, immF src, iRegLdst toc) %{ |
2800 enc_class postalloc_expand_load_float_constant(regF dst, immF src, iRegLdst toc) %{ |
2801 bool large_constant_pool = true; // TODO: PPC port C->cfg()->_consts_size > 4000; |
2801 bool large_constant_pool = true; // TODO: PPC port C->cfg()->_consts_size > 4000; |
2802 |
2802 |
2803 MachNode *m2; |
2803 MachNode *m2; |
2804 if (large_constant_pool) { |
2804 if (large_constant_pool) { |
2805 m2 = new (C) loadConFCompNode(); |
2805 m2 = new loadConFCompNode(); |
2806 } else { |
2806 } else { |
2807 m2 = new (C) loadConFNode(); |
2807 m2 = new loadConFNode(); |
2808 } |
2808 } |
2809 // inputs for new nodes |
2809 // inputs for new nodes |
2810 m2->add_req(NULL, n_toc); |
2810 m2->add_req(NULL, n_toc); |
2811 |
2811 |
2812 // operands for new nodes |
2812 // operands for new nodes |
2813 m2->_opnds[0] = op_dst; |
2813 m2->_opnds[0] = op_dst; |
2814 m2->_opnds[1] = op_src; |
2814 m2->_opnds[1] = op_src; |
2815 m2->_opnds[2] = new (C) iRegPdstOper(); // constanttablebase |
2815 m2->_opnds[2] = new iRegPdstOper(); // constanttablebase |
2816 |
2816 |
2817 // register allocation for new nodes |
2817 // register allocation for new nodes |
2818 ra_->set_pair(m2->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); |
2818 ra_->set_pair(m2->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); |
2819 nodes->push(m2); |
2819 nodes->push(m2); |
2820 %} |
2820 %} |
2824 enc_class postalloc_expand_load_double_constant(regD dst, immD src, iRegLdst toc) %{ |
2824 enc_class postalloc_expand_load_double_constant(regD dst, immD src, iRegLdst toc) %{ |
2825 bool large_constant_pool = true; // TODO: PPC port C->cfg()->_consts_size > 4000; |
2825 bool large_constant_pool = true; // TODO: PPC port C->cfg()->_consts_size > 4000; |
2826 |
2826 |
2827 MachNode *m2; |
2827 MachNode *m2; |
2828 if (large_constant_pool) { |
2828 if (large_constant_pool) { |
2829 m2 = new (C) loadConDCompNode(); |
2829 m2 = new loadConDCompNode(); |
2830 } else { |
2830 } else { |
2831 m2 = new (C) loadConDNode(); |
2831 m2 = new loadConDNode(); |
2832 } |
2832 } |
2833 // inputs for new nodes |
2833 // inputs for new nodes |
2834 m2->add_req(NULL, n_toc); |
2834 m2->add_req(NULL, n_toc); |
2835 |
2835 |
2836 // operands for new nodes |
2836 // operands for new nodes |
2837 m2->_opnds[0] = op_dst; |
2837 m2->_opnds[0] = op_dst; |
2838 m2->_opnds[1] = op_src; |
2838 m2->_opnds[1] = op_src; |
2839 m2->_opnds[2] = new (C) iRegPdstOper(); // constanttablebase |
2839 m2->_opnds[2] = new iRegPdstOper(); // constanttablebase |
2840 |
2840 |
2841 // register allocation for new nodes |
2841 // register allocation for new nodes |
2842 ra_->set_pair(m2->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); |
2842 ra_->set_pair(m2->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); |
2843 nodes->push(m2); |
2843 nodes->push(m2); |
2844 %} |
2844 %} |
2916 |
2916 |
2917 enc_class postalloc_expand_encode_oop(iRegNdst dst, iRegPdst src, flagsReg crx) %{ |
2917 enc_class postalloc_expand_encode_oop(iRegNdst dst, iRegPdst src, flagsReg crx) %{ |
2918 |
2918 |
2919 if (VM_Version::has_isel()) { |
2919 if (VM_Version::has_isel()) { |
2920 // use isel instruction with Power 7 |
2920 // use isel instruction with Power 7 |
2921 cmpP_reg_imm16Node *n_compare = new (C) cmpP_reg_imm16Node(); |
2921 cmpP_reg_imm16Node *n_compare = new cmpP_reg_imm16Node(); |
2922 encodeP_subNode *n_sub_base = new (C) encodeP_subNode(); |
2922 encodeP_subNode *n_sub_base = new encodeP_subNode(); |
2923 encodeP_shiftNode *n_shift = new (C) encodeP_shiftNode(); |
2923 encodeP_shiftNode *n_shift = new encodeP_shiftNode(); |
2924 cond_set_0_oopNode *n_cond_set = new (C) cond_set_0_oopNode(); |
2924 cond_set_0_oopNode *n_cond_set = new cond_set_0_oopNode(); |
2925 |
2925 |
2926 n_compare->add_req(n_region, n_src); |
2926 n_compare->add_req(n_region, n_src); |
2927 n_compare->_opnds[0] = op_crx; |
2927 n_compare->_opnds[0] = op_crx; |
2928 n_compare->_opnds[1] = op_src; |
2928 n_compare->_opnds[1] = op_src; |
2929 n_compare->_opnds[2] = new (C) immL16Oper(0); |
2929 n_compare->_opnds[2] = new immL16Oper(0); |
2930 |
2930 |
2931 n_sub_base->add_req(n_region, n_src); |
2931 n_sub_base->add_req(n_region, n_src); |
2932 n_sub_base->_opnds[0] = op_dst; |
2932 n_sub_base->_opnds[0] = op_dst; |
2933 n_sub_base->_opnds[1] = op_src; |
2933 n_sub_base->_opnds[1] = op_src; |
2934 n_sub_base->_bottom_type = _bottom_type; |
2934 n_sub_base->_bottom_type = _bottom_type; |
2954 nodes->push(n_shift); |
2954 nodes->push(n_shift); |
2955 nodes->push(n_cond_set); |
2955 nodes->push(n_cond_set); |
2956 |
2956 |
2957 } else { |
2957 } else { |
2958 // before Power 7 |
2958 // before Power 7 |
2959 moveRegNode *n_move = new (C) moveRegNode(); |
2959 moveRegNode *n_move = new moveRegNode(); |
2960 cmpP_reg_imm16Node *n_compare = new (C) cmpP_reg_imm16Node(); |
2960 cmpP_reg_imm16Node *n_compare = new cmpP_reg_imm16Node(); |
2961 encodeP_shiftNode *n_shift = new (C) encodeP_shiftNode(); |
2961 encodeP_shiftNode *n_shift = new encodeP_shiftNode(); |
2962 cond_sub_baseNode *n_sub_base = new (C) cond_sub_baseNode(); |
2962 cond_sub_baseNode *n_sub_base = new cond_sub_baseNode(); |
2963 |
2963 |
2964 n_move->add_req(n_region, n_src); |
2964 n_move->add_req(n_region, n_src); |
2965 n_move->_opnds[0] = op_dst; |
2965 n_move->_opnds[0] = op_dst; |
2966 n_move->_opnds[1] = op_src; |
2966 n_move->_opnds[1] = op_src; |
2967 ra_->set_oop(n_move, true); // Until here, 'n_move' still produces an oop. |
2967 ra_->set_oop(n_move, true); // Until here, 'n_move' still produces an oop. |
2969 n_compare->add_req(n_region, n_src); |
2969 n_compare->add_req(n_region, n_src); |
2970 n_compare->add_prec(n_move); |
2970 n_compare->add_prec(n_move); |
2971 |
2971 |
2972 n_compare->_opnds[0] = op_crx; |
2972 n_compare->_opnds[0] = op_crx; |
2973 n_compare->_opnds[1] = op_src; |
2973 n_compare->_opnds[1] = op_src; |
2974 n_compare->_opnds[2] = new (C) immL16Oper(0); |
2974 n_compare->_opnds[2] = new immL16Oper(0); |
2975 |
2975 |
2976 n_sub_base->add_req(n_region, n_compare, n_src); |
2976 n_sub_base->add_req(n_region, n_compare, n_src); |
2977 n_sub_base->_opnds[0] = op_dst; |
2977 n_sub_base->_opnds[0] = op_dst; |
2978 n_sub_base->_opnds[1] = op_crx; |
2978 n_sub_base->_opnds[1] = op_crx; |
2979 n_sub_base->_opnds[2] = op_src; |
2979 n_sub_base->_opnds[2] = op_src; |
2998 assert(!(ra_->is_oop(this)), "sanity"); // This is not supposed to be GC'ed. |
2998 assert(!(ra_->is_oop(this)), "sanity"); // This is not supposed to be GC'ed. |
2999 %} |
2999 %} |
3000 |
3000 |
3001 enc_class postalloc_expand_encode_oop_not_null(iRegNdst dst, iRegPdst src) %{ |
3001 enc_class postalloc_expand_encode_oop_not_null(iRegNdst dst, iRegPdst src) %{ |
3002 |
3002 |
3003 encodeP_subNode *n1 = new (C) encodeP_subNode(); |
3003 encodeP_subNode *n1 = new encodeP_subNode(); |
3004 n1->add_req(n_region, n_src); |
3004 n1->add_req(n_region, n_src); |
3005 n1->_opnds[0] = op_dst; |
3005 n1->_opnds[0] = op_dst; |
3006 n1->_opnds[1] = op_src; |
3006 n1->_opnds[1] = op_src; |
3007 n1->_bottom_type = _bottom_type; |
3007 n1->_bottom_type = _bottom_type; |
3008 |
3008 |
3009 encodeP_shiftNode *n2 = new (C) encodeP_shiftNode(); |
3009 encodeP_shiftNode *n2 = new encodeP_shiftNode(); |
3010 n2->add_req(n_region, n1); |
3010 n2->add_req(n_region, n1); |
3011 n2->_opnds[0] = op_dst; |
3011 n2->_opnds[0] = op_dst; |
3012 n2->_opnds[1] = op_dst; |
3012 n2->_opnds[1] = op_dst; |
3013 n2->_bottom_type = _bottom_type; |
3013 n2->_bottom_type = _bottom_type; |
3014 ra_->set_pair(n1->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); |
3014 ra_->set_pair(n1->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); |
3018 nodes->push(n2); |
3018 nodes->push(n2); |
3019 assert(!(ra_->is_oop(this)), "sanity"); // This is not supposed to be GC'ed. |
3019 assert(!(ra_->is_oop(this)), "sanity"); // This is not supposed to be GC'ed. |
3020 %} |
3020 %} |
3021 |
3021 |
3022 enc_class postalloc_expand_decode_oop(iRegPdst dst, iRegNsrc src, flagsReg crx) %{ |
3022 enc_class postalloc_expand_decode_oop(iRegPdst dst, iRegNsrc src, flagsReg crx) %{ |
3023 decodeN_shiftNode *n_shift = new (C) decodeN_shiftNode(); |
3023 decodeN_shiftNode *n_shift = new decodeN_shiftNode(); |
3024 cmpN_reg_imm0Node *n_compare = new (C) cmpN_reg_imm0Node(); |
3024 cmpN_reg_imm0Node *n_compare = new cmpN_reg_imm0Node(); |
3025 |
3025 |
3026 n_compare->add_req(n_region, n_src); |
3026 n_compare->add_req(n_region, n_src); |
3027 n_compare->_opnds[0] = op_crx; |
3027 n_compare->_opnds[0] = op_crx; |
3028 n_compare->_opnds[1] = op_src; |
3028 n_compare->_opnds[1] = op_src; |
3029 n_compare->_opnds[2] = new (C) immN_0Oper(TypeNarrowOop::NULL_PTR); |
3029 n_compare->_opnds[2] = new immN_0Oper(TypeNarrowOop::NULL_PTR); |
3030 |
3030 |
3031 n_shift->add_req(n_region, n_src); |
3031 n_shift->add_req(n_region, n_src); |
3032 n_shift->_opnds[0] = op_dst; |
3032 n_shift->_opnds[0] = op_dst; |
3033 n_shift->_opnds[1] = op_src; |
3033 n_shift->_opnds[1] = op_src; |
3034 n_shift->_bottom_type = _bottom_type; |
3034 n_shift->_bottom_type = _bottom_type; |
3035 |
3035 |
3036 if (VM_Version::has_isel()) { |
3036 if (VM_Version::has_isel()) { |
3037 // use isel instruction with Power 7 |
3037 // use isel instruction with Power 7 |
3038 |
3038 |
3039 decodeN_addNode *n_add_base = new (C) decodeN_addNode(); |
3039 decodeN_addNode *n_add_base = new decodeN_addNode(); |
3040 n_add_base->add_req(n_region, n_shift); |
3040 n_add_base->add_req(n_region, n_shift); |
3041 n_add_base->_opnds[0] = op_dst; |
3041 n_add_base->_opnds[0] = op_dst; |
3042 n_add_base->_opnds[1] = op_dst; |
3042 n_add_base->_opnds[1] = op_dst; |
3043 n_add_base->_bottom_type = _bottom_type; |
3043 n_add_base->_bottom_type = _bottom_type; |
3044 |
3044 |
3045 cond_set_0_ptrNode *n_cond_set = new (C) cond_set_0_ptrNode(); |
3045 cond_set_0_ptrNode *n_cond_set = new cond_set_0_ptrNode(); |
3046 n_cond_set->add_req(n_region, n_compare, n_add_base); |
3046 n_cond_set->add_req(n_region, n_compare, n_add_base); |
3047 n_cond_set->_opnds[0] = op_dst; |
3047 n_cond_set->_opnds[0] = op_dst; |
3048 n_cond_set->_opnds[1] = op_crx; |
3048 n_cond_set->_opnds[1] = op_crx; |
3049 n_cond_set->_opnds[2] = op_dst; |
3049 n_cond_set->_opnds[2] = op_dst; |
3050 n_cond_set->_bottom_type = _bottom_type; |
3050 n_cond_set->_bottom_type = _bottom_type; |
3084 nodes->push(n_add_base); |
3084 nodes->push(n_add_base); |
3085 } |
3085 } |
3086 %} |
3086 %} |
3087 |
3087 |
3088 enc_class postalloc_expand_decode_oop_not_null(iRegPdst dst, iRegNsrc src) %{ |
3088 enc_class postalloc_expand_decode_oop_not_null(iRegPdst dst, iRegNsrc src) %{ |
3089 decodeN_shiftNode *n1 = new (C) decodeN_shiftNode(); |
3089 decodeN_shiftNode *n1 = new decodeN_shiftNode(); |
3090 n1->add_req(n_region, n_src); |
3090 n1->add_req(n_region, n_src); |
3091 n1->_opnds[0] = op_dst; |
3091 n1->_opnds[0] = op_dst; |
3092 n1->_opnds[1] = op_src; |
3092 n1->_opnds[1] = op_src; |
3093 n1->_bottom_type = _bottom_type; |
3093 n1->_bottom_type = _bottom_type; |
3094 |
3094 |
3095 decodeN_addNode *n2 = new (C) decodeN_addNode(); |
3095 decodeN_addNode *n2 = new decodeN_addNode(); |
3096 n2->add_req(n_region, n1); |
3096 n2->add_req(n_region, n1); |
3097 n2->_opnds[0] = op_dst; |
3097 n2->_opnds[0] = op_dst; |
3098 n2->_opnds[1] = op_dst; |
3098 n2->_opnds[1] = op_dst; |
3099 n2->_bottom_type = _bottom_type; |
3099 n2->_bottom_type = _bottom_type; |
3100 ra_->set_pair(n1->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); |
3100 ra_->set_pair(n1->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); |
3386 // expand. |
3386 // expand. |
3387 enc_class postalloc_expand_load_replF_constant(iRegLdst dst, immF src, iRegLdst toc) %{ |
3387 enc_class postalloc_expand_load_replF_constant(iRegLdst dst, immF src, iRegLdst toc) %{ |
3388 // Create new nodes. |
3388 // Create new nodes. |
3389 |
3389 |
3390 // Make an operand with the bit pattern to load as float. |
3390 // Make an operand with the bit pattern to load as float. |
3391 immLOper *op_repl = new (C) immLOper((jlong)replicate_immF(op_src->constantF())); |
3391 immLOper *op_repl = new immLOper((jlong)replicate_immF(op_src->constantF())); |
3392 |
3392 |
3393 loadConLNodesTuple loadConLNodes = |
3393 loadConLNodesTuple loadConLNodes = |
3394 loadConLNodesTuple_create(C, ra_, n_toc, op_repl, |
3394 loadConLNodesTuple_create(C, ra_, n_toc, op_repl, |
3395 ra_->get_reg_second(this), ra_->get_reg_first(this)); |
3395 ra_->get_reg_second(this), ra_->get_reg_first(this)); |
3396 |
3396 |
3609 // postalloc expand emitter for virtual calls. |
3609 // postalloc expand emitter for virtual calls. |
3610 enc_class postalloc_expand_java_dynamic_call_sched(method meth, iRegLdst toc) %{ |
3610 enc_class postalloc_expand_java_dynamic_call_sched(method meth, iRegLdst toc) %{ |
3611 |
3611 |
3612 // Create the nodes for loading the IC from the TOC. |
3612 // Create the nodes for loading the IC from the TOC. |
3613 loadConLNodesTuple loadConLNodes_IC = |
3613 loadConLNodesTuple loadConLNodes_IC = |
3614 loadConLNodesTuple_create(C, ra_, n_toc, new (C) immLOper((jlong)Universe::non_oop_word()), |
3614 loadConLNodesTuple_create(C, ra_, n_toc, new immLOper((jlong)Universe::non_oop_word()), |
3615 OptoReg::Name(R19_H_num), OptoReg::Name(R19_num)); |
3615 OptoReg::Name(R19_H_num), OptoReg::Name(R19_num)); |
3616 |
3616 |
3617 // Create the call node. |
3617 // Create the call node. |
3618 CallDynamicJavaDirectSchedNode *call = new (C) CallDynamicJavaDirectSchedNode(); |
3618 CallDynamicJavaDirectSchedNode *call = new CallDynamicJavaDirectSchedNode(); |
3619 call->_method_handle_invoke = _method_handle_invoke; |
3619 call->_method_handle_invoke = _method_handle_invoke; |
3620 call->_vtable_index = _vtable_index; |
3620 call->_vtable_index = _vtable_index; |
3621 call->_method = _method; |
3621 call->_method = _method; |
3622 call->_bci = _bci; |
3622 call->_bci = _bci; |
3623 call->_optimized_virtual = _optimized_virtual; |
3623 call->_optimized_virtual = _optimized_virtual; |
3763 enc_class postalloc_expand_java_to_runtime_call(method meth, iRegLdst toc) %{ |
3763 enc_class postalloc_expand_java_to_runtime_call(method meth, iRegLdst toc) %{ |
3764 loadConLNodesTuple loadConLNodes_Entry; |
3764 loadConLNodesTuple loadConLNodes_Entry; |
3765 #if defined(ABI_ELFv2) |
3765 #if defined(ABI_ELFv2) |
3766 jlong entry_address = (jlong) this->entry_point(); |
3766 jlong entry_address = (jlong) this->entry_point(); |
3767 assert(entry_address, "need address here"); |
3767 assert(entry_address, "need address here"); |
3768 loadConLNodes_Entry = loadConLNodesTuple_create(C, ra_, n_toc, new (C) immLOper(entry_address), |
3768 loadConLNodes_Entry = loadConLNodesTuple_create(C, ra_, n_toc, new immLOper(entry_address), |
3769 OptoReg::Name(R12_H_num), OptoReg::Name(R12_num)); |
3769 OptoReg::Name(R12_H_num), OptoReg::Name(R12_num)); |
3770 #else |
3770 #else |
3771 // Get the struct that describes the function we are about to call. |
3771 // Get the struct that describes the function we are about to call. |
3772 FunctionDescriptor* fd = (FunctionDescriptor*) this->entry_point(); |
3772 FunctionDescriptor* fd = (FunctionDescriptor*) this->entry_point(); |
3773 assert(fd, "need fd here"); |
3773 assert(fd, "need fd here"); |
3775 // new nodes |
3775 // new nodes |
3776 loadConLNodesTuple loadConLNodes_Env; |
3776 loadConLNodesTuple loadConLNodes_Env; |
3777 loadConLNodesTuple loadConLNodes_Toc; |
3777 loadConLNodesTuple loadConLNodes_Toc; |
3778 |
3778 |
3779 // Create nodes and operands for loading the entry point. |
3779 // Create nodes and operands for loading the entry point. |
3780 loadConLNodes_Entry = loadConLNodesTuple_create(C, ra_, n_toc, new (C) immLOper(entry_address), |
3780 loadConLNodes_Entry = loadConLNodesTuple_create(C, ra_, n_toc, new immLOper(entry_address), |
3781 OptoReg::Name(R12_H_num), OptoReg::Name(R12_num)); |
3781 OptoReg::Name(R12_H_num), OptoReg::Name(R12_num)); |
3782 |
3782 |
3783 |
3783 |
3784 // Create nodes and operands for loading the env pointer. |
3784 // Create nodes and operands for loading the env pointer. |
3785 if (fd->env() != NULL) { |
3785 if (fd->env() != NULL) { |
3786 loadConLNodes_Env = loadConLNodesTuple_create(C, ra_, n_toc, new (C) immLOper((jlong) fd->env()), |
3786 loadConLNodes_Env = loadConLNodesTuple_create(C, ra_, n_toc, new immLOper((jlong) fd->env()), |
3787 OptoReg::Name(R11_H_num), OptoReg::Name(R11_num)); |
3787 OptoReg::Name(R11_H_num), OptoReg::Name(R11_num)); |
3788 } else { |
3788 } else { |
3789 loadConLNodes_Env._large_hi = NULL; |
3789 loadConLNodes_Env._large_hi = NULL; |
3790 loadConLNodes_Env._large_lo = NULL; |
3790 loadConLNodes_Env._large_lo = NULL; |
3791 loadConLNodes_Env._small = NULL; |
3791 loadConLNodes_Env._small = NULL; |
3792 loadConLNodes_Env._last = new (C) loadConL16Node(); |
3792 loadConLNodes_Env._last = new loadConL16Node(); |
3793 loadConLNodes_Env._last->_opnds[0] = new (C) iRegLdstOper(); |
3793 loadConLNodes_Env._last->_opnds[0] = new iRegLdstOper(); |
3794 loadConLNodes_Env._last->_opnds[1] = new (C) immL16Oper(0); |
3794 loadConLNodes_Env._last->_opnds[1] = new immL16Oper(0); |
3795 ra_->set_pair(loadConLNodes_Env._last->_idx, OptoReg::Name(R11_H_num), OptoReg::Name(R11_num)); |
3795 ra_->set_pair(loadConLNodes_Env._last->_idx, OptoReg::Name(R11_H_num), OptoReg::Name(R11_num)); |
3796 } |
3796 } |
3797 |
3797 |
3798 // Create nodes and operands for loading the Toc point. |
3798 // Create nodes and operands for loading the Toc point. |
3799 loadConLNodes_Toc = loadConLNodesTuple_create(C, ra_, n_toc, new (C) immLOper((jlong) fd->toc()), |
3799 loadConLNodes_Toc = loadConLNodesTuple_create(C, ra_, n_toc, new immLOper((jlong) fd->toc()), |
3800 OptoReg::Name(R2_H_num), OptoReg::Name(R2_num)); |
3800 OptoReg::Name(R2_H_num), OptoReg::Name(R2_num)); |
3801 #endif // ABI_ELFv2 |
3801 #endif // ABI_ELFv2 |
3802 // mtctr node |
3802 // mtctr node |
3803 MachNode *mtctr = new (C) CallLeafDirect_mtctrNode(); |
3803 MachNode *mtctr = new CallLeafDirect_mtctrNode(); |
3804 |
3804 |
3805 assert(loadConLNodes_Entry._last != NULL, "entry must exist"); |
3805 assert(loadConLNodes_Entry._last != NULL, "entry must exist"); |
3806 mtctr->add_req(0, loadConLNodes_Entry._last); |
3806 mtctr->add_req(0, loadConLNodes_Entry._last); |
3807 |
3807 |
3808 mtctr->_opnds[0] = new (C) iRegLdstOper(); |
3808 mtctr->_opnds[0] = new iRegLdstOper(); |
3809 mtctr->_opnds[1] = new (C) iRegLdstOper(); |
3809 mtctr->_opnds[1] = new iRegLdstOper(); |
3810 |
3810 |
3811 // call node |
3811 // call node |
3812 MachCallLeafNode *call = new (C) CallLeafDirectNode(); |
3812 MachCallLeafNode *call = new CallLeafDirectNode(); |
3813 |
3813 |
3814 call->_opnds[0] = _opnds[0]; |
3814 call->_opnds[0] = _opnds[0]; |
3815 call->_opnds[1] = new (C) methodOper((intptr_t) entry_address); // May get set later. |
3815 call->_opnds[1] = new methodOper((intptr_t) entry_address); // May get set later. |
3816 |
3816 |
3817 // Make the new call node look like the old one. |
3817 // Make the new call node look like the old one. |
3818 call->_name = _name; |
3818 call->_name = _name; |
3819 call->_tf = _tf; |
3819 call->_tf = _tf; |
3820 call->_entry_point = _entry_point; |
3820 call->_entry_point = _entry_point; |
6048 match(Set dst src); |
6048 match(Set dst src); |
6049 ins_cost(DEFAULT_COST*2); |
6049 ins_cost(DEFAULT_COST*2); |
6050 |
6050 |
6051 format %{ "LoadN $dst, $src \t// postalloc expanded" %} // mask |
6051 format %{ "LoadN $dst, $src \t// postalloc expanded" %} // mask |
6052 postalloc_expand %{ |
6052 postalloc_expand %{ |
6053 MachNode *m1 = new (C) loadConN_hiNode(); |
6053 MachNode *m1 = new loadConN_hiNode(); |
6054 MachNode *m2 = new (C) loadConN_loNode(); |
6054 MachNode *m2 = new loadConN_loNode(); |
6055 MachNode *m3 = new (C) clearMs32bNode(); |
6055 MachNode *m3 = new clearMs32bNode(); |
6056 m1->add_req(NULL); |
6056 m1->add_req(NULL); |
6057 m2->add_req(NULL, m1); |
6057 m2->add_req(NULL, m1); |
6058 m3->add_req(NULL, m2); |
6058 m3->add_req(NULL, m2); |
6059 m1->_opnds[0] = op_dst; |
6059 m1->_opnds[0] = op_dst; |
6060 m1->_opnds[1] = op_src; |
6060 m1->_opnds[1] = op_src; |
6115 ins_cost(DEFAULT_COST*2); |
6115 ins_cost(DEFAULT_COST*2); |
6116 |
6116 |
6117 format %{ "LoadN $dst, $src \t// postalloc expanded" %} // mask |
6117 format %{ "LoadN $dst, $src \t// postalloc expanded" %} // mask |
6118 postalloc_expand %{ |
6118 postalloc_expand %{ |
6119 // Load high bits into register. Sign extended. |
6119 // Load high bits into register. Sign extended. |
6120 MachNode *m1 = new (C) loadConNKlass_hiNode(); |
6120 MachNode *m1 = new loadConNKlass_hiNode(); |
6121 m1->add_req(NULL); |
6121 m1->add_req(NULL); |
6122 m1->_opnds[0] = op_dst; |
6122 m1->_opnds[0] = op_dst; |
6123 m1->_opnds[1] = op_src; |
6123 m1->_opnds[1] = op_src; |
6124 ra_->set_pair(m1->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); |
6124 ra_->set_pair(m1->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); |
6125 nodes->push(m1); |
6125 nodes->push(m1); |
6126 |
6126 |
6127 MachNode *m2 = m1; |
6127 MachNode *m2 = m1; |
6128 if (!Assembler::is_uimm((jlong)Klass::encode_klass((Klass *)op_src->constant()), 31)) { |
6128 if (!Assembler::is_uimm((jlong)Klass::encode_klass((Klass *)op_src->constant()), 31)) { |
6129 // Value might be 1-extended. Mask out these bits. |
6129 // Value might be 1-extended. Mask out these bits. |
6130 m2 = new (C) clearMs32bNode(); |
6130 m2 = new clearMs32bNode(); |
6131 m2->add_req(NULL, m1); |
6131 m2->add_req(NULL, m1); |
6132 m2->_opnds[0] = op_dst; |
6132 m2->_opnds[0] = op_dst; |
6133 m2->_opnds[1] = op_dst; |
6133 m2->_opnds[1] = op_dst; |
6134 ra_->set_pair(m2->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); |
6134 ra_->set_pair(m2->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); |
6135 nodes->push(m2); |
6135 nodes->push(m2); |
6136 } |
6136 } |
6137 |
6137 |
6138 MachNode *m3 = new (C) loadConNKlass_loNode(); |
6138 MachNode *m3 = new loadConNKlass_loNode(); |
6139 m3->add_req(NULL, m2); |
6139 m3->add_req(NULL, m2); |
6140 m3->_opnds[0] = op_dst; |
6140 m3->_opnds[0] = op_dst; |
6141 m3->_opnds[1] = op_src; |
6141 m3->_opnds[1] = op_src; |
6142 m3->_opnds[2] = op_dst; |
6142 m3->_opnds[2] = op_dst; |
6143 ra_->set_pair(m3->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); |
6143 ra_->set_pair(m3->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); |
6985 match(Set dst (EncodePKlass (Binary base src))); |
6985 match(Set dst (EncodePKlass (Binary base src))); |
6986 predicate(false); |
6986 predicate(false); |
6987 |
6987 |
6988 format %{ "EncodePKlass $dst, $src\t// $src != Null, postalloc expanded" %} |
6988 format %{ "EncodePKlass $dst, $src\t// $src != Null, postalloc expanded" %} |
6989 postalloc_expand %{ |
6989 postalloc_expand %{ |
6990 encodePKlass_sub_baseNode *n1 = new (C) encodePKlass_sub_baseNode(); |
6990 encodePKlass_sub_baseNode *n1 = new encodePKlass_sub_baseNode(); |
6991 n1->add_req(n_region, n_base, n_src); |
6991 n1->add_req(n_region, n_base, n_src); |
6992 n1->_opnds[0] = op_dst; |
6992 n1->_opnds[0] = op_dst; |
6993 n1->_opnds[1] = op_base; |
6993 n1->_opnds[1] = op_base; |
6994 n1->_opnds[2] = op_src; |
6994 n1->_opnds[2] = op_src; |
6995 n1->_bottom_type = _bottom_type; |
6995 n1->_bottom_type = _bottom_type; |
6996 |
6996 |
6997 encodePKlass_shiftNode *n2 = new (C) encodePKlass_shiftNode(); |
6997 encodePKlass_shiftNode *n2 = new encodePKlass_shiftNode(); |
6998 n2->add_req(n_region, n1); |
6998 n2->add_req(n_region, n1); |
6999 n2->_opnds[0] = op_dst; |
6999 n2->_opnds[0] = op_dst; |
7000 n2->_opnds[1] = op_dst; |
7000 n2->_opnds[1] = op_dst; |
7001 n2->_bottom_type = _bottom_type; |
7001 n2->_bottom_type = _bottom_type; |
7002 ra_->set_pair(n1->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); |
7002 ra_->set_pair(n1->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); |
7062 //effect(kill src); // We need a register for the immediate result after shifting. |
7062 //effect(kill src); // We need a register for the immediate result after shifting. |
7063 predicate(false); |
7063 predicate(false); |
7064 |
7064 |
7065 format %{ "DecodeNKlass $dst = $base + ($src << 3) \t// $src != NULL, postalloc expanded" %} |
7065 format %{ "DecodeNKlass $dst = $base + ($src << 3) \t// $src != NULL, postalloc expanded" %} |
7066 postalloc_expand %{ |
7066 postalloc_expand %{ |
7067 decodeNKlass_add_baseNode *n1 = new (C) decodeNKlass_add_baseNode(); |
7067 decodeNKlass_add_baseNode *n1 = new decodeNKlass_add_baseNode(); |
7068 n1->add_req(n_region, n_base, n_src); |
7068 n1->add_req(n_region, n_base, n_src); |
7069 n1->_opnds[0] = op_dst; |
7069 n1->_opnds[0] = op_dst; |
7070 n1->_opnds[1] = op_base; |
7070 n1->_opnds[1] = op_base; |
7071 n1->_opnds[2] = op_src; |
7071 n1->_opnds[2] = op_src; |
7072 n1->_bottom_type = _bottom_type; |
7072 n1->_bottom_type = _bottom_type; |
7073 |
7073 |
7074 decodeNKlass_shiftNode *n2 = new (C) decodeNKlass_shiftNode(); |
7074 decodeNKlass_shiftNode *n2 = new decodeNKlass_shiftNode(); |
7075 n2->add_req(n_region, n1); |
7075 n2->add_req(n_region, n1); |
7076 n2->_opnds[0] = op_dst; |
7076 n2->_opnds[0] = op_dst; |
7077 n2->_opnds[1] = op_dst; |
7077 n2->_opnds[1] = op_dst; |
7078 n2->_bottom_type = _bottom_type; |
7078 n2->_bottom_type = _bottom_type; |
7079 |
7079 |
9771 // | \ | | / |
9771 // | \ | | / |
9772 // dst=cmovI_bso_stackSlotL |
9772 // dst=cmovI_bso_stackSlotL |
9773 // |
9773 // |
9774 |
9774 |
9775 // Create new nodes. |
9775 // Create new nodes. |
9776 MachNode *m1 = new (C) loadConI16Node(); |
9776 MachNode *m1 = new loadConI16Node(); |
9777 MachNode *m2 = new (C) cmovI_bso_stackSlotLNode(); |
9777 MachNode *m2 = new cmovI_bso_stackSlotLNode(); |
9778 |
9778 |
9779 // inputs for new nodes |
9779 // inputs for new nodes |
9780 m1->add_req(n_region); |
9780 m1->add_req(n_region); |
9781 m2->add_req(n_region, n_crx, n_mem); |
9781 m2->add_req(n_region, n_crx, n_mem); |
9782 |
9782 |
9783 // precedences for new nodes |
9783 // precedences for new nodes |
9784 m2->add_prec(m1); |
9784 m2->add_prec(m1); |
9785 |
9785 |
9786 // operands for new nodes |
9786 // operands for new nodes |
9787 m1->_opnds[0] = op_dst; |
9787 m1->_opnds[0] = op_dst; |
9788 m1->_opnds[1] = new (C) immI16Oper(0); |
9788 m1->_opnds[1] = new immI16Oper(0); |
9789 |
9789 |
9790 m2->_opnds[0] = op_dst; |
9790 m2->_opnds[0] = op_dst; |
9791 m2->_opnds[1] = op_crx; |
9791 m2->_opnds[1] = op_crx; |
9792 m2->_opnds[2] = op_mem; |
9792 m2->_opnds[2] = op_mem; |
9793 |
9793 |
9940 // | \ | | / |
9940 // | \ | | / |
9941 // dst=cmovL_bso_stackSlotL |
9941 // dst=cmovL_bso_stackSlotL |
9942 // |
9942 // |
9943 |
9943 |
9944 // Create new nodes. |
9944 // Create new nodes. |
9945 MachNode *m1 = new (C) loadConL16Node(); |
9945 MachNode *m1 = new loadConL16Node(); |
9946 MachNode *m2 = new (C) cmovL_bso_stackSlotLNode(); |
9946 MachNode *m2 = new cmovL_bso_stackSlotLNode(); |
9947 |
9947 |
9948 // inputs for new nodes |
9948 // inputs for new nodes |
9949 m1->add_req(n_region); |
9949 m1->add_req(n_region); |
9950 m2->add_req(n_region, n_crx, n_mem); |
9950 m2->add_req(n_region, n_crx, n_mem); |
9951 m2->add_prec(m1); |
9951 m2->add_prec(m1); |
9952 |
9952 |
9953 // operands for new nodes |
9953 // operands for new nodes |
9954 m1->_opnds[0] = op_dst; |
9954 m1->_opnds[0] = op_dst; |
9955 m1->_opnds[1] = new (C) immL16Oper(0); |
9955 m1->_opnds[1] = new immL16Oper(0); |
9956 m2->_opnds[0] = op_dst; |
9956 m2->_opnds[0] = op_dst; |
9957 m2->_opnds[1] = op_crx; |
9957 m2->_opnds[1] = op_crx; |
9958 m2->_opnds[2] = op_mem; |
9958 m2->_opnds[2] = op_mem; |
9959 |
9959 |
9960 // registers for new nodes |
9960 // registers for new nodes |
10286 // | \ | |
10286 // | \ | |
10287 // dst=cmovI_conIvalueMinus1_conIvalue1 |
10287 // dst=cmovI_conIvalueMinus1_conIvalue1 |
10288 // |
10288 // |
10289 |
10289 |
10290 // Create new nodes. |
10290 // Create new nodes. |
10291 MachNode *m1 = new (C) loadConI16Node(); |
10291 MachNode *m1 = new loadConI16Node(); |
10292 MachNode *m2 = new (C) cmovI_conIvalueMinus1_conIvalue1Node(); |
10292 MachNode *m2 = new cmovI_conIvalueMinus1_conIvalue1Node(); |
10293 |
10293 |
10294 // inputs for new nodes |
10294 // inputs for new nodes |
10295 m1->add_req(n_region); |
10295 m1->add_req(n_region); |
10296 m2->add_req(n_region, n_crx); |
10296 m2->add_req(n_region, n_crx); |
10297 m2->add_prec(m1); |
10297 m2->add_prec(m1); |
10298 |
10298 |
10299 // operands for new nodes |
10299 // operands for new nodes |
10300 m1->_opnds[0] = op_dst; |
10300 m1->_opnds[0] = op_dst; |
10301 m1->_opnds[1] = new (C) immI16Oper(0); |
10301 m1->_opnds[1] = new immI16Oper(0); |
10302 m2->_opnds[0] = op_dst; |
10302 m2->_opnds[0] = op_dst; |
10303 m2->_opnds[1] = op_crx; |
10303 m2->_opnds[1] = op_crx; |
10304 |
10304 |
10305 // registers for new nodes |
10305 // registers for new nodes |
10306 ra_->set_pair(m1->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); // dst |
10306 ra_->set_pair(m1->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); // dst |