1948 |
1948 |
1949 int i=0; |
1949 int i=0; |
1950 int total_strings = 0; |
1950 int total_strings = 0; |
1951 int first_arg_to_pass = 0; |
1951 int first_arg_to_pass = 0; |
1952 int total_c_args = 0; |
1952 int total_c_args = 0; |
1953 int box_offset = java_lang_boxing_object::value_offset_in_bytes(); |
|
1954 |
1953 |
1955 // Skip the receiver as dtrace doesn't want to see it |
1954 // Skip the receiver as dtrace doesn't want to see it |
1956 if( !method->is_static() ) { |
1955 if( !method->is_static() ) { |
1957 in_sig_bt[i++] = T_OBJECT; |
1956 in_sig_bt[i++] = T_OBJECT; |
1958 first_arg_to_pass = 1; |
1957 first_arg_to_pass = 1; |
2195 __ movptr(Address(rsp, reg2offset_out(dst.first())), |
2194 __ movptr(Address(rsp, reg2offset_out(dst.first())), |
2196 (int32_t)NULL_WORD); |
2195 (int32_t)NULL_WORD); |
2197 __ testq(in_reg, in_reg); |
2196 __ testq(in_reg, in_reg); |
2198 __ jcc(Assembler::zero, skipUnbox); |
2197 __ jcc(Assembler::zero, skipUnbox); |
2199 |
2198 |
|
2199 BasicType bt = out_sig_bt[c_arg]; |
|
2200 int box_offset = java_lang_boxing_object::value_offset_in_bytes(bt); |
2200 Address src1(in_reg, box_offset); |
2201 Address src1(in_reg, box_offset); |
2201 if ( out_sig_bt[c_arg] == T_LONG ) { |
2202 if ( bt == T_LONG ) { |
2202 __ movq(in_reg, src1); |
2203 __ movq(in_reg, src1); |
2203 __ movq(stack_dst, in_reg); |
2204 __ movq(stack_dst, in_reg); |
2204 assert(out_sig_bt[c_arg+1] == T_VOID, "must be"); |
2205 assert(out_sig_bt[c_arg+1] == T_VOID, "must be"); |
2205 ++c_arg; // skip over T_VOID to keep the loop indices in sync |
2206 ++c_arg; // skip over T_VOID to keep the loop indices in sync |
2206 } else { |
2207 } else { |
2458 if (out_sig_bt[c_arg] == T_INT || out_sig_bt[c_arg] == T_LONG) { |
2459 if (out_sig_bt[c_arg] == T_INT || out_sig_bt[c_arg] == T_LONG) { |
2459 // need to unbox a one-word value |
2460 // need to unbox a one-word value |
2460 Label skip; |
2461 Label skip; |
2461 __ testq(r, r); |
2462 __ testq(r, r); |
2462 __ jcc(Assembler::equal, skip); |
2463 __ jcc(Assembler::equal, skip); |
|
2464 BasicType bt = out_sig_bt[c_arg]; |
|
2465 int box_offset = java_lang_boxing_object::value_offset_in_bytes(bt); |
2463 Address src1(r, box_offset); |
2466 Address src1(r, box_offset); |
2464 if ( out_sig_bt[c_arg] == T_LONG ) { |
2467 if ( bt == T_LONG ) { |
2465 __ movq(r, src1); |
2468 __ movq(r, src1); |
2466 } else { |
2469 } else { |
2467 __ movl(r, src1); |
2470 __ movl(r, src1); |
2468 } |
2471 } |
2469 __ bind(skip); |
2472 __ bind(skip); |