hotspot/src/share/vm/opto/matcher.cpp
changeset 21574 d47713227456
parent 20289 35d78de0c547
child 22851 4c4b6a45be43
equal deleted inserted replaced
21573:91bd0c56a751 21574:d47713227456
   462 
   462 
   463   // At first, start with the empty mask
   463   // At first, start with the empty mask
   464   C->FIRST_STACK_mask().Clear();
   464   C->FIRST_STACK_mask().Clear();
   465 
   465 
   466   // Add in the incoming argument area
   466   // Add in the incoming argument area
   467   OptoReg::Name init = OptoReg::add(_old_SP, C->out_preserve_stack_slots());
   467   OptoReg::Name init_in = OptoReg::add(_old_SP, C->out_preserve_stack_slots());
   468   for (i = init; i < _in_arg_limit; i = OptoReg::add(i,1))
   468   for (i = init_in; i < _in_arg_limit; i = OptoReg::add(i,1)) {
   469     C->FIRST_STACK_mask().Insert(i);
   469     C->FIRST_STACK_mask().Insert(i);
   470 
   470   }
   471   // Add in all bits past the outgoing argument area
   471   // Add in all bits past the outgoing argument area
   472   guarantee(RegMask::can_represent_arg(OptoReg::add(_out_arg_limit,-1)),
   472   guarantee(RegMask::can_represent_arg(OptoReg::add(_out_arg_limit,-1)),
   473             "must be able to represent all call arguments in reg mask");
   473             "must be able to represent all call arguments in reg mask");
   474   init = _out_arg_limit;
   474   OptoReg::Name init = _out_arg_limit;
   475   for (i = init; RegMask::can_represent(i); i = OptoReg::add(i,1))
   475   for (i = init; RegMask::can_represent(i); i = OptoReg::add(i,1)) {
   476     C->FIRST_STACK_mask().Insert(i);
   476     C->FIRST_STACK_mask().Insert(i);
   477 
   477   }
   478   // Finally, set the "infinite stack" bit.
   478   // Finally, set the "infinite stack" bit.
   479   C->FIRST_STACK_mask().set_AllStack();
   479   C->FIRST_STACK_mask().set_AllStack();
   480 
   480 
   481   // Make spill masks.  Registers for their class, plus FIRST_STACK_mask.
   481   // Make spill masks.  Registers for their class, plus FIRST_STACK_mask.
   482   RegMask aligned_stack_mask = C->FIRST_STACK_mask();
   482   RegMask aligned_stack_mask = C->FIRST_STACK_mask();
   504   if (Matcher::vector_size_supported(T_BYTE,4)) {
   504   if (Matcher::vector_size_supported(T_BYTE,4)) {
   505     *idealreg2spillmask[Op_VecS] = *idealreg2regmask[Op_VecS];
   505     *idealreg2spillmask[Op_VecS] = *idealreg2regmask[Op_VecS];
   506      idealreg2spillmask[Op_VecS]->OR(C->FIRST_STACK_mask());
   506      idealreg2spillmask[Op_VecS]->OR(C->FIRST_STACK_mask());
   507   }
   507   }
   508   if (Matcher::vector_size_supported(T_FLOAT,2)) {
   508   if (Matcher::vector_size_supported(T_FLOAT,2)) {
       
   509     // For VecD we need dual alignment and 8 bytes (2 slots) for spills.
       
   510     // RA guarantees such alignment since it is needed for Double and Long values.
   509     *idealreg2spillmask[Op_VecD] = *idealreg2regmask[Op_VecD];
   511     *idealreg2spillmask[Op_VecD] = *idealreg2regmask[Op_VecD];
   510      idealreg2spillmask[Op_VecD]->OR(aligned_stack_mask);
   512      idealreg2spillmask[Op_VecD]->OR(aligned_stack_mask);
   511   }
   513   }
   512   if (Matcher::vector_size_supported(T_FLOAT,4)) {
   514   if (Matcher::vector_size_supported(T_FLOAT,4)) {
       
   515     // For VecX we need quadro alignment and 16 bytes (4 slots) for spills.
       
   516     //
       
   517     // RA can use input arguments stack slots for spills but until RA
       
   518     // we don't know frame size and offset of input arg stack slots.
       
   519     //
       
   520     // Exclude last input arg stack slots to avoid spilling vectors there
       
   521     // otherwise vector spills could stomp over stack slots in caller frame.
       
   522     OptoReg::Name in = OptoReg::add(_in_arg_limit, -1);
       
   523     for (int k = 1; (in >= init_in) && (k < RegMask::SlotsPerVecX); k++) {
       
   524       aligned_stack_mask.Remove(in);
       
   525       in = OptoReg::add(in, -1);
       
   526     }
   513      aligned_stack_mask.clear_to_sets(RegMask::SlotsPerVecX);
   527      aligned_stack_mask.clear_to_sets(RegMask::SlotsPerVecX);
   514      assert(aligned_stack_mask.is_AllStack(), "should be infinite stack");
   528      assert(aligned_stack_mask.is_AllStack(), "should be infinite stack");
   515     *idealreg2spillmask[Op_VecX] = *idealreg2regmask[Op_VecX];
   529     *idealreg2spillmask[Op_VecX] = *idealreg2regmask[Op_VecX];
   516      idealreg2spillmask[Op_VecX]->OR(aligned_stack_mask);
   530      idealreg2spillmask[Op_VecX]->OR(aligned_stack_mask);
   517   }
   531   }
   518   if (Matcher::vector_size_supported(T_FLOAT,8)) {
   532   if (Matcher::vector_size_supported(T_FLOAT,8)) {
       
   533     // For VecY we need octo alignment and 32 bytes (8 slots) for spills.
       
   534     OptoReg::Name in = OptoReg::add(_in_arg_limit, -1);
       
   535     for (int k = 1; (in >= init_in) && (k < RegMask::SlotsPerVecY); k++) {
       
   536       aligned_stack_mask.Remove(in);
       
   537       in = OptoReg::add(in, -1);
       
   538     }
   519      aligned_stack_mask.clear_to_sets(RegMask::SlotsPerVecY);
   539      aligned_stack_mask.clear_to_sets(RegMask::SlotsPerVecY);
   520      assert(aligned_stack_mask.is_AllStack(), "should be infinite stack");
   540      assert(aligned_stack_mask.is_AllStack(), "should be infinite stack");
   521     *idealreg2spillmask[Op_VecY] = *idealreg2regmask[Op_VecY];
   541     *idealreg2spillmask[Op_VecY] = *idealreg2regmask[Op_VecY];
   522      idealreg2spillmask[Op_VecY]->OR(aligned_stack_mask);
   542      idealreg2spillmask[Op_VecY]->OR(aligned_stack_mask);
   523   }
   543   }