< prev index next >

src/hotspot/share/opto/matcher.cpp

Print this page

        

*** 421,431 **** rms[TypeFunc::ReturnAdr] = ret_adr; rms[TypeFunc::FramePtr ] = fp; return rms; } ! #define NOF_STACK_MASKS (3*6+5) // Create the initial stack mask used by values spilling to the stack. // Disallow any debug info in outgoing argument areas by setting the // initial mask accordingly. void Matcher::init_first_stack_mask() { --- 421,431 ---- rms[TypeFunc::ReturnAdr] = ret_adr; rms[TypeFunc::FramePtr ] = fp; return rms; } ! #define NOF_STACK_MASKS (3*11) // Create the initial stack mask used by values spilling to the stack. // Disallow any debug info in outgoing argument areas by setting the // initial mask accordingly. void Matcher::init_first_stack_mask() {
*** 463,472 **** --- 463,484 ---- idealreg2spillmask [Op_VecD] = &rms[19]; idealreg2spillmask [Op_VecX] = &rms[20]; idealreg2spillmask [Op_VecY] = &rms[21]; idealreg2spillmask [Op_VecZ] = &rms[22]; + idealreg2debugmask [Op_VecS] = &rms[23]; + idealreg2debugmask [Op_VecD] = &rms[24]; + idealreg2debugmask [Op_VecX] = &rms[25]; + idealreg2debugmask [Op_VecY] = &rms[26]; + idealreg2debugmask [Op_VecZ] = &rms[27]; + + idealreg2mhdebugmask[Op_VecS] = &rms[28]; + idealreg2mhdebugmask[Op_VecD] = &rms[29]; + idealreg2mhdebugmask[Op_VecX] = &rms[30]; + idealreg2mhdebugmask[Op_VecY] = &rms[31]; + idealreg2mhdebugmask[Op_VecZ] = &rms[32]; + OptoReg::Name i; // At first, start with the empty mask C->FIRST_STACK_mask().Clear();
*** 509,525 **** --- 521,543 ---- idealreg2spillmask[Op_RegD]->OR(aligned_stack_mask); if (Matcher::vector_size_supported(T_BYTE,4)) { *idealreg2spillmask[Op_VecS] = *idealreg2regmask[Op_VecS]; idealreg2spillmask[Op_VecS]->OR(C->FIRST_STACK_mask()); + } else { + *idealreg2spillmask[Op_VecS] = RegMask::Empty; } + if (Matcher::vector_size_supported(T_FLOAT,2)) { // For VecD we need dual alignment and 8 bytes (2 slots) for spills. // RA guarantees such alignment since it is needed for Double and Long values. *idealreg2spillmask[Op_VecD] = *idealreg2regmask[Op_VecD]; idealreg2spillmask[Op_VecD]->OR(aligned_stack_mask); + } else { + *idealreg2spillmask[Op_VecD] = RegMask::Empty; } + if (Matcher::vector_size_supported(T_FLOAT,4)) { // For VecX we need quadro alignment and 16 bytes (4 slots) for spills. // // RA can use input arguments stack slots for spills but until RA // we don't know frame size and offset of input arg stack slots.
*** 533,543 **** --- 551,564 ---- } aligned_stack_mask.clear_to_sets(RegMask::SlotsPerVecX); assert(aligned_stack_mask.is_AllStack(), "should be infinite stack"); *idealreg2spillmask[Op_VecX] = *idealreg2regmask[Op_VecX]; idealreg2spillmask[Op_VecX]->OR(aligned_stack_mask); + } else { + *idealreg2spillmask[Op_VecX] = RegMask::Empty; } + if (Matcher::vector_size_supported(T_FLOAT,8)) { // For VecY we need octo alignment and 32 bytes (8 slots) for spills. OptoReg::Name in = OptoReg::add(_in_arg_limit, -1); for (int k = 1; (in >= init_in) && (k < RegMask::SlotsPerVecY); k++) { aligned_stack_mask.Remove(in);
*** 545,555 **** --- 566,579 ---- } aligned_stack_mask.clear_to_sets(RegMask::SlotsPerVecY); assert(aligned_stack_mask.is_AllStack(), "should be infinite stack"); *idealreg2spillmask[Op_VecY] = *idealreg2regmask[Op_VecY]; idealreg2spillmask[Op_VecY]->OR(aligned_stack_mask); + } else { + *idealreg2spillmask[Op_VecY] = RegMask::Empty; } + if (Matcher::vector_size_supported(T_FLOAT,16)) { // For VecZ we need enough alignment and 64 bytes (16 slots) for spills. OptoReg::Name in = OptoReg::add(_in_arg_limit, -1); for (int k = 1; (in >= init_in) && (k < RegMask::SlotsPerVecZ); k++) { aligned_stack_mask.Remove(in);
*** 557,567 **** --- 581,594 ---- } aligned_stack_mask.clear_to_sets(RegMask::SlotsPerVecZ); assert(aligned_stack_mask.is_AllStack(), "should be infinite stack"); *idealreg2spillmask[Op_VecZ] = *idealreg2regmask[Op_VecZ]; idealreg2spillmask[Op_VecZ]->OR(aligned_stack_mask); + } else { + *idealreg2spillmask[Op_VecZ] = RegMask::Empty; } + if (UseFPUForSpilling) { // This mask logic assumes that the spill operations are // symmetric and that the registers involved are the same size. // On sparc for instance we may have to use 64 bit moves will // kill 2 registers when used with F0-F31.
*** 591,607 **** --- 618,646 ---- *idealreg2debugmask [Op_RegL]= *idealreg2spillmask[Op_RegL]; *idealreg2debugmask [Op_RegF]= *idealreg2spillmask[Op_RegF]; *idealreg2debugmask [Op_RegD]= *idealreg2spillmask[Op_RegD]; *idealreg2debugmask [Op_RegP]= *idealreg2spillmask[Op_RegP]; + *idealreg2debugmask [Op_VecS]= *idealreg2spillmask[Op_VecS]; + *idealreg2debugmask [Op_VecD]= *idealreg2spillmask[Op_VecD]; + *idealreg2debugmask [Op_VecX]= *idealreg2spillmask[Op_VecX]; + *idealreg2debugmask [Op_VecY]= *idealreg2spillmask[Op_VecY]; + *idealreg2debugmask [Op_VecZ]= *idealreg2spillmask[Op_VecZ]; + *idealreg2mhdebugmask[Op_RegN]= *idealreg2spillmask[Op_RegN]; *idealreg2mhdebugmask[Op_RegI]= *idealreg2spillmask[Op_RegI]; *idealreg2mhdebugmask[Op_RegL]= *idealreg2spillmask[Op_RegL]; *idealreg2mhdebugmask[Op_RegF]= *idealreg2spillmask[Op_RegF]; *idealreg2mhdebugmask[Op_RegD]= *idealreg2spillmask[Op_RegD]; *idealreg2mhdebugmask[Op_RegP]= *idealreg2spillmask[Op_RegP]; + *idealreg2mhdebugmask[Op_VecS]= *idealreg2spillmask[Op_VecS]; + *idealreg2mhdebugmask[Op_VecD]= *idealreg2spillmask[Op_VecD]; + *idealreg2mhdebugmask[Op_VecX]= *idealreg2spillmask[Op_VecX]; + *idealreg2mhdebugmask[Op_VecY]= *idealreg2spillmask[Op_VecY]; + *idealreg2mhdebugmask[Op_VecZ]= *idealreg2spillmask[Op_VecZ]; + // Prevent stub compilations from attempting to reference // callee-saved registers from debug info bool exclude_soe = !Compile::current()->is_method_compilation(); for( i=OptoReg::Name(0); i<OptoReg::Name(_last_Mach_Reg); i = OptoReg::add(i,1) ) {
*** 613,629 **** --- 652,678 ---- idealreg2debugmask [Op_RegI]->Remove(i); // Exclude save-on-call idealreg2debugmask [Op_RegL]->Remove(i); // registers from debug idealreg2debugmask [Op_RegF]->Remove(i); // masks idealreg2debugmask [Op_RegD]->Remove(i); idealreg2debugmask [Op_RegP]->Remove(i); + idealreg2debugmask [Op_VecS]->Remove(i); + idealreg2debugmask [Op_VecD]->Remove(i); + idealreg2debugmask [Op_VecX]->Remove(i); + idealreg2debugmask [Op_VecY]->Remove(i); + idealreg2debugmask [Op_VecZ]->Remove(i); idealreg2mhdebugmask[Op_RegN]->Remove(i); idealreg2mhdebugmask[Op_RegI]->Remove(i); idealreg2mhdebugmask[Op_RegL]->Remove(i); idealreg2mhdebugmask[Op_RegF]->Remove(i); idealreg2mhdebugmask[Op_RegD]->Remove(i); idealreg2mhdebugmask[Op_RegP]->Remove(i); + idealreg2mhdebugmask[Op_VecS]->Remove(i); + idealreg2mhdebugmask[Op_VecD]->Remove(i); + idealreg2mhdebugmask[Op_VecX]->Remove(i); + idealreg2mhdebugmask[Op_VecY]->Remove(i); + idealreg2mhdebugmask[Op_VecZ]->Remove(i); } } // Subtract the register we use to save the SP for MethodHandle // invokes to from the debug mask.
*** 632,641 **** --- 681,695 ---- idealreg2mhdebugmask[Op_RegI]->SUBTRACT(save_mask); idealreg2mhdebugmask[Op_RegL]->SUBTRACT(save_mask); idealreg2mhdebugmask[Op_RegF]->SUBTRACT(save_mask); idealreg2mhdebugmask[Op_RegD]->SUBTRACT(save_mask); idealreg2mhdebugmask[Op_RegP]->SUBTRACT(save_mask); + idealreg2mhdebugmask[Op_VecS]->SUBTRACT(save_mask); + idealreg2mhdebugmask[Op_VecD]->SUBTRACT(save_mask); + idealreg2mhdebugmask[Op_VecX]->SUBTRACT(save_mask); + idealreg2mhdebugmask[Op_VecY]->SUBTRACT(save_mask); + idealreg2mhdebugmask[Op_VecZ]->SUBTRACT(save_mask); } //---------------------------is_save_on_entry---------------------------------- bool Matcher::is_save_on_entry( int reg ) { return
*** 1924,1934 **** VectorNode::is_vector_shift_count(m) && m->in(1)->is_Con(); } return false; } - bool Matcher::clone_node(Node* n, Node* m, Matcher::MStack& mstack) { // Must clone all producers of flags, or we will not match correctly. // Suppose a compare setting int-flags is shared (e.g., a switch-tree) // then it will match into an ideal Op_RegFlags. Alas, the fp-flags // are also there, so we may match a float-branch to int-flags and --- 1978,1987 ----
*** 2262,2280 **** --- 2315,2353 ---- n->set_req(2, pair); n->set_req(1, n->in(3)); n->del_req(3); break; } + case Op_VectorBlend: + case Op_VectorInsert: { + Node* pair = new BinaryNode(n->in(1), n->in(2)); + n->set_req(1, pair); + n->set_req(2, n->in(3)); + n->del_req(3); + break; + } + case Op_StoreVectorScatter: { + Node* pair = new BinaryNode(n->in(MemNode::ValueIn), n->in(MemNode::ValueIn+1)); + n->set_req(MemNode::ValueIn, pair); + n->del_req(MemNode::ValueIn+1); + break; + } case Op_MulAddS2I: { Node* pair1 = new BinaryNode(n->in(1), n->in(2)); Node* pair2 = new BinaryNode(n->in(3), n->in(4)); n->set_req(1, pair1); n->set_req(2, pair2); n->del_req(4); n->del_req(3); break; } + case Op_VectorMaskCmp: { + n->set_req(1, new BinaryNode(n->in(1), n->in(2))); + n->set_req(2, n->in(3)); + n->del_req(3); + break; + } default: break; } }
< prev index next >