src/share/vm/opto/loopTransform.cpp
Print this page
rev 5186 : 8024342: PPC64 (part 111): Support for C calling conventions that require 64-bit ints.
Summary: Some platforms, as ppc and s390x/zArch require that 32-bit ints are passed as 64-bit values to C functions. This change adds support to adapt the signature and to issue proper casts to c2-compiled stubs. The functions are used in generate_native_wrapper(). Adapt signature in PhaseIdealLoop::intrinsify_fill().
*** 2690,2714 ****
} else if (t == T_DOUBLE) {
store_value = new (C) MoveD2LNode(store_value);
_igvn.register_new_node_with_optimizer(store_value);
}
Node* mem_phi = store->in(MemNode::Memory);
Node* result_ctrl;
Node* result_mem;
const TypeFunc* call_type = OptoRuntime::array_fill_Type();
CallLeafNode *call = new (C) CallLeafNoFPNode(call_type, fill,
fill_name, TypeAryPtr::get_array_body_type(t));
! call->init_req(TypeFunc::Parms+0, from);
! call->init_req(TypeFunc::Parms+1, store_value);
#ifdef _LP64
len = new (C) ConvI2LNode(len);
_igvn.register_new_node_with_optimizer(len);
#endif
! call->init_req(TypeFunc::Parms+2, len);
#ifdef _LP64
! call->init_req(TypeFunc::Parms+3, C->top());
#endif
call->init_req( TypeFunc::Control, head->init_control());
call->init_req( TypeFunc::I_O , C->top() ) ; // does no i/o
call->init_req( TypeFunc::Memory , mem_phi->in(LoopNode::EntryControl) );
call->init_req( TypeFunc::ReturnAdr, C->start()->proj_out(TypeFunc::ReturnAdr) );
--- 2690,2725 ----
} else if (t == T_DOUBLE) {
store_value = new (C) MoveD2LNode(store_value);
_igvn.register_new_node_with_optimizer(store_value);
}
+ if (SharedRuntime::c_calling_convention_requires_ints_as_longs() &&
+ // see StubRoutines::select_fill_function for types. FLOAT has been converted to INT
+ (t == T_FLOAT || t == T_INT || t == T_SHORT || t == T_CHAR || t == T_BOOLEAN || t == T_BYTE)) {
+ store_value = new (C) ConvI2LNode(store_value);
+ _igvn.register_new_node_with_optimizer(store_value);
+ }
+
Node* mem_phi = store->in(MemNode::Memory);
Node* result_ctrl;
Node* result_mem;
const TypeFunc* call_type = OptoRuntime::array_fill_Type();
CallLeafNode *call = new (C) CallLeafNoFPNode(call_type, fill,
fill_name, TypeAryPtr::get_array_body_type(t));
! uint cnt = 0;
! call->init_req(TypeFunc::Parms + cnt++, from);
! call->init_req(TypeFunc::Parms + cnt++, store_value);
! if (SharedRuntime::c_calling_convention_requires_ints_as_longs()) {
! call->init_req(TypeFunc::Parms + cnt++, C->top());
! }
#ifdef _LP64
len = new (C) ConvI2LNode(len);
_igvn.register_new_node_with_optimizer(len);
#endif
! call->init_req(TypeFunc::Parms + cnt++, len);
#ifdef _LP64
! call->init_req(TypeFunc::Parms + cnt++, C->top());
#endif
call->init_req( TypeFunc::Control, head->init_control());
call->init_req( TypeFunc::I_O , C->top() ) ; // does no i/o
call->init_req( TypeFunc::Memory , mem_phi->in(LoopNode::EntryControl) );
call->init_req( TypeFunc::ReturnAdr, C->start()->proj_out(TypeFunc::ReturnAdr) );