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);
|