hotspot/src/cpu/ppc/vm/ppc.ad
changeset 24923 9631f7d691dc
parent 24349 d8f40e5b392d
child 25374 d7fb2af5d53c
equal deleted inserted replaced
24922:9139bd899e16 24923:9631f7d691dc
  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;
  3062       nodes->push(n_add_base);
  3062       nodes->push(n_add_base);
  3063       nodes->push(n_cond_set);
  3063       nodes->push(n_cond_set);
  3064 
  3064 
  3065     } else {
  3065     } else {
  3066       // before Power 7
  3066       // before Power 7
  3067       cond_add_baseNode *n_add_base = new (C) cond_add_baseNode();
  3067       cond_add_baseNode *n_add_base = new cond_add_baseNode();
  3068 
  3068 
  3069       n_add_base->add_req(n_region, n_compare, n_shift);
  3069       n_add_base->add_req(n_region, n_compare, n_shift);
  3070       n_add_base->_opnds[0] = op_dst;
  3070       n_add_base->_opnds[0] = op_dst;
  3071       n_add_base->_opnds[1] = op_crx;
  3071       n_add_base->_opnds[1] = op_crx;
  3072       n_add_base->_opnds[2] = op_dst;
  3072       n_add_base->_opnds[2] = op_dst;
  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
 10621     //      |   \
 10621     //      |   \
 10622     //      crx=cmov_bns_less
 10622     //      crx=cmov_bns_less
 10623     //
 10623     //
 10624 
 10624 
 10625     // Create new nodes.
 10625     // Create new nodes.
 10626     MachNode *m1 = new (C) cmpFUnordered_reg_regNode();
 10626     MachNode *m1 = new cmpFUnordered_reg_regNode();
 10627     MachNode *m2 = new (C) cmov_bns_lessNode();
 10627     MachNode *m2 = new cmov_bns_lessNode();
 10628 
 10628 
 10629     // inputs for new nodes
 10629     // inputs for new nodes
 10630     m1->add_req(n_region, n_src1, n_src2);
 10630     m1->add_req(n_region, n_src1, n_src2);
 10631     m2->add_req(n_region);
 10631     m2->add_req(n_region);
 10632     m2->add_prec(m1);
 10632     m2->add_prec(m1);
 10696     //      |   \
 10696     //      |   \
 10697     //      crx=cmov_bns_less
 10697     //      crx=cmov_bns_less
 10698     //
 10698     //
 10699 
 10699 
 10700     // create new nodes
 10700     // create new nodes
 10701     MachNode *m1 = new (C) cmpDUnordered_reg_regNode();
 10701     MachNode *m1 = new cmpDUnordered_reg_regNode();
 10702     MachNode *m2 = new (C) cmov_bns_lessNode();
 10702     MachNode *m2 = new cmov_bns_lessNode();
 10703 
 10703 
 10704     // inputs for new nodes
 10704     // inputs for new nodes
 10705     m1->add_req(n_region, n_src1, n_src2);
 10705     m1->add_req(n_region, n_src1, n_src2);
 10706     m2->add_req(n_region);
 10706     m2->add_req(n_region);
 10707     m2->add_prec(m1);
 10707     m2->add_prec(m1);