comparison src/cpu/x86/vm/sharedRuntime_x86_64.cpp @ 165:437d03ea40b1

6703888: Compressed Oops: use the 32-bits gap after klass in a object Summary: Use the gap also for a narrow oop field and a boxing object value. Reviewed-by: coleenp, never
author kvn
date Wed, 21 May 2008 16:31:35 -0700
parents 018d5b58dd4f
children d1605aabd0a1
comparison
equal deleted inserted replaced
164:c436414a719e 165:437d03ea40b1
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);