src/share/vm/opto/loopTransform.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File 7047954 Sdiff src/share/vm/opto

src/share/vm/opto/loopTransform.cpp

Print this page




2667   }
2668 
2669   // Build a call to the fill routine
2670   const char* fill_name;
2671   address fill = StubRoutines::select_fill_function(t, aligned, fill_name);
2672   assert(fill != NULL, "what?");
2673 
2674   // Convert float/double to int/long for fill routines
2675   if (t == T_FLOAT) {
2676     store_value = new (C, 2) MoveF2INode(store_value);
2677     _igvn.register_new_node_with_optimizer(store_value);
2678   } else if (t == T_DOUBLE) {
2679     store_value = new (C, 2) MoveD2LNode(store_value);
2680     _igvn.register_new_node_with_optimizer(store_value);
2681   }
2682 
2683   Node* mem_phi = store->in(MemNode::Memory);
2684   Node* result_ctrl;
2685   Node* result_mem;
2686   const TypeFunc* call_type = OptoRuntime::array_fill_Type();


2687   int size = call_type->domain()->cnt();
2688   CallLeafNode *call = new (C, size) CallLeafNoFPNode(call_type, fill,
2689                                                       fill_name, TypeAryPtr::get_array_body_type(t));
2690   call->init_req(TypeFunc::Parms+0, from);
2691   call->init_req(TypeFunc::Parms+1, store_value);
2692 #ifdef _LP64
2693   len = new (C, 2) ConvI2LNode(len);
2694   _igvn.register_new_node_with_optimizer(len);
2695 #endif
2696   call->init_req(TypeFunc::Parms+2, len);
2697 #ifdef _LP64
2698   call->init_req(TypeFunc::Parms+3, C->top());
2699 #endif
2700   call->init_req( TypeFunc::Control, head->init_control());
2701   call->init_req( TypeFunc::I_O    , C->top() )        ;   // does no i/o
2702   call->init_req( TypeFunc::Memory ,  mem_phi->in(LoopNode::EntryControl) );
2703   call->init_req( TypeFunc::ReturnAdr, C->start()->proj_out(TypeFunc::ReturnAdr) );
2704   call->init_req( TypeFunc::FramePtr, C->start()->proj_out(TypeFunc::FramePtr) );
2705   _igvn.register_new_node_with_optimizer(call);
2706   result_ctrl = new (C, 1) ProjNode(call,TypeFunc::Control);
2707   _igvn.register_new_node_with_optimizer(result_ctrl);
2708   result_mem = new (C, 1) ProjNode(call,TypeFunc::Memory);
2709   _igvn.register_new_node_with_optimizer(result_mem);




2667   }
2668 
2669   // Build a call to the fill routine
2670   const char* fill_name;
2671   address fill = StubRoutines::select_fill_function(t, aligned, fill_name);
2672   assert(fill != NULL, "what?");
2673 
2674   // Convert float/double to int/long for fill routines
2675   if (t == T_FLOAT) {
2676     store_value = new (C, 2) MoveF2INode(store_value);
2677     _igvn.register_new_node_with_optimizer(store_value);
2678   } else if (t == T_DOUBLE) {
2679     store_value = new (C, 2) MoveD2LNode(store_value);
2680     _igvn.register_new_node_with_optimizer(store_value);
2681   }
2682 
2683   Node* mem_phi = store->in(MemNode::Memory);
2684   Node* result_ctrl;
2685   Node* result_mem;
2686   const TypeFunc* call_type = OptoRuntime::array_fill_Type();
2687   const TypeAryPtr* adr_type = store->as_Mem()->adr_type()->isa_aryptr();
2688   assert(adr_type != NULL && adr_type->offset() == Type::OffsetBot, "");
2689   int size = call_type->domain()->cnt();
2690   CallLeafNode *call = new (C, size) CallLeafNoFPNode(call_type, fill,
2691                                                       fill_name, adr_type);
2692   call->init_req(TypeFunc::Parms+0, from);
2693   call->init_req(TypeFunc::Parms+1, store_value);
2694 #ifdef _LP64
2695   len = new (C, 2) ConvI2LNode(len);
2696   _igvn.register_new_node_with_optimizer(len);
2697 #endif
2698   call->init_req(TypeFunc::Parms+2, len);
2699 #ifdef _LP64
2700   call->init_req(TypeFunc::Parms+3, C->top());
2701 #endif
2702   call->init_req( TypeFunc::Control, head->init_control());
2703   call->init_req( TypeFunc::I_O    , C->top() )        ;   // does no i/o
2704   call->init_req( TypeFunc::Memory ,  mem_phi->in(LoopNode::EntryControl) );
2705   call->init_req( TypeFunc::ReturnAdr, C->start()->proj_out(TypeFunc::ReturnAdr) );
2706   call->init_req( TypeFunc::FramePtr, C->start()->proj_out(TypeFunc::FramePtr) );
2707   _igvn.register_new_node_with_optimizer(call);
2708   result_ctrl = new (C, 1) ProjNode(call,TypeFunc::Control);
2709   _igvn.register_new_node_with_optimizer(result_ctrl);
2710   result_mem = new (C, 1) ProjNode(call,TypeFunc::Memory);
2711   _igvn.register_new_node_with_optimizer(result_mem);


src/share/vm/opto/loopTransform.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File