< prev index next >

src/hotspot/cpu/aarch64/interpreterRT_aarch64.cpp

Print this page




 238       __ bind(L);
 239       _num_int_args++;
 240       break;
 241     }
 242  default:
 243    {
 244       __ add(r0, from(), Interpreter::local_offset_in_bytes(offset()));
 245       __ ldr(temp(), r0);
 246       Label L;
 247       __ cbnz(temp(), L);
 248       __ mov(r0, zr);
 249       __ bind(L);
 250       __ str(r0, Address(to(), _stack_offset));
 251       _stack_offset += wordSize;
 252       _num_int_args++;
 253       break;
 254    }
 255   }
 256 }
 257 




 258 void InterpreterRuntime::SignatureHandlerGenerator::generate(uint64_t fingerprint) {
 259   // generate code to handle arguments
 260   iterate(fingerprint);
 261 
 262   // set the call format
 263   // n.b. allow extra 1 for the JNI_Env in c_rarg0
 264   unsigned int call_format = ((_num_int_args + 1) << 6) | (_num_fp_args << 2);
 265 
 266   switch (method()->result_type()) {
 267   case T_VOID:
 268     call_format |= MacroAssembler::ret_type_void;
 269     break;
 270   case T_FLOAT:
 271     call_format |= MacroAssembler::ret_type_float;
 272     break;
 273   case T_DOUBLE:
 274     call_format |= MacroAssembler::ret_type_double;
 275     break;
 276   default:
 277     call_format |= MacroAssembler::ret_type_integral;


 329       *_int_args++ = from_obj;
 330       _num_int_args++;
 331     } else {
 332       *_to++ = from_obj;
 333       _num_int_args++;
 334     }
 335   }
 336 
 337   virtual void pass_object()
 338   {
 339     intptr_t *from_addr = (intptr_t*)(_from + Interpreter::local_offset_in_bytes(0));
 340     _from -= Interpreter::stackElementSize;
 341 
 342     if (_num_int_args < Argument::n_int_register_parameters_c-1) {
 343       *_int_args++ = (*from_addr == 0) ? NULL : (intptr_t)from_addr;
 344       _num_int_args++;
 345     } else {
 346       *_to++ = (*from_addr == 0) ? NULL : (intptr_t) from_addr;
 347       _num_int_args++;
 348     }





 349   }
 350 
 351   virtual void pass_float()
 352   {
 353     jint from_obj = *(jint*)(_from+Interpreter::local_offset_in_bytes(0));
 354     _from -= Interpreter::stackElementSize;
 355 
 356     if (_num_fp_args < Argument::n_float_register_parameters_c) {
 357       *_fp_args++ = from_obj;
 358       _num_fp_args++;
 359     } else {
 360       *_to++ = from_obj;
 361       _num_fp_args++;
 362     }
 363   }
 364 
 365   virtual void pass_double()
 366   {
 367     intptr_t from_obj = *(intptr_t*)(_from+Interpreter::local_offset_in_bytes(1));
 368     _from -= 2*Interpreter::stackElementSize;




 238       __ bind(L);
 239       _num_int_args++;
 240       break;
 241     }
 242  default:
 243    {
 244       __ add(r0, from(), Interpreter::local_offset_in_bytes(offset()));
 245       __ ldr(temp(), r0);
 246       Label L;
 247       __ cbnz(temp(), L);
 248       __ mov(r0, zr);
 249       __ bind(L);
 250       __ str(r0, Address(to(), _stack_offset));
 251       _stack_offset += wordSize;
 252       _num_int_args++;
 253       break;
 254    }
 255   }
 256 }
 257 
 258 void InterpreterRuntime::SignatureHandlerGenerator::pass_valuetype() {
 259    pass_object();
 260 }
 261 
 262 void InterpreterRuntime::SignatureHandlerGenerator::generate(uint64_t fingerprint) {
 263   // generate code to handle arguments
 264   iterate(fingerprint);
 265 
 266   // set the call format
 267   // n.b. allow extra 1 for the JNI_Env in c_rarg0
 268   unsigned int call_format = ((_num_int_args + 1) << 6) | (_num_fp_args << 2);
 269 
 270   switch (method()->result_type()) {
 271   case T_VOID:
 272     call_format |= MacroAssembler::ret_type_void;
 273     break;
 274   case T_FLOAT:
 275     call_format |= MacroAssembler::ret_type_float;
 276     break;
 277   case T_DOUBLE:
 278     call_format |= MacroAssembler::ret_type_double;
 279     break;
 280   default:
 281     call_format |= MacroAssembler::ret_type_integral;


 333       *_int_args++ = from_obj;
 334       _num_int_args++;
 335     } else {
 336       *_to++ = from_obj;
 337       _num_int_args++;
 338     }
 339   }
 340 
 341   virtual void pass_object()
 342   {
 343     intptr_t *from_addr = (intptr_t*)(_from + Interpreter::local_offset_in_bytes(0));
 344     _from -= Interpreter::stackElementSize;
 345 
 346     if (_num_int_args < Argument::n_int_register_parameters_c-1) {
 347       *_int_args++ = (*from_addr == 0) ? NULL : (intptr_t)from_addr;
 348       _num_int_args++;
 349     } else {
 350       *_to++ = (*from_addr == 0) ? NULL : (intptr_t) from_addr;
 351       _num_int_args++;
 352     }
 353   }
 354 
 355   virtual void pass_valuetype() {
 356     // values are handled with oops, like objects
 357     pass_object();
 358   }
 359 
 360   virtual void pass_float()
 361   {
 362     jint from_obj = *(jint*)(_from+Interpreter::local_offset_in_bytes(0));
 363     _from -= Interpreter::stackElementSize;
 364 
 365     if (_num_fp_args < Argument::n_float_register_parameters_c) {
 366       *_fp_args++ = from_obj;
 367       _num_fp_args++;
 368     } else {
 369       *_to++ = from_obj;
 370       _num_fp_args++;
 371     }
 372   }
 373 
 374   virtual void pass_double()
 375   {
 376     intptr_t from_obj = *(intptr_t*)(_from+Interpreter::local_offset_in_bytes(1));
 377     _from -= 2*Interpreter::stackElementSize;


< prev index next >