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