src/cpu/ppc/vm/interpreter_ppc.cpp

Print this page




 280   __ lwa(intSlot, 0, arg_java);
 281   __ std(intSlot, 0, arg_c);
 282   __ addi(arg_java, arg_java, -BytesPerWord);
 283   __ addi(arg_c, arg_c, BytesPerWord);
 284   __ cmplwi(CCR0, argcnt, max_int_register_arguments);
 285   __ blt(CCR0, move_intSlot_to_ARG);
 286   __ b(loop_start);
 287 
 288   __ bind(do_long);
 289   __ ld(intSlot, -BytesPerWord, arg_java);
 290   __ std(intSlot, 0, arg_c);
 291   __ addi(arg_java, arg_java, - 2 * BytesPerWord);
 292   __ addi(arg_c, arg_c, BytesPerWord);
 293   __ cmplwi(CCR0, argcnt, max_int_register_arguments);
 294   __ blt(CCR0, move_intSlot_to_ARG);
 295   __ b(loop_start);
 296 
 297   __ bind(do_float);
 298   __ lfs(floatSlot, 0, arg_java);
 299 #if defined(LINUX)





 300   __ stfs(floatSlot, 4, arg_c);

 301 #elif defined(AIX)


 302   __ stfs(floatSlot, 0, arg_c);
 303 #else
 304 #error "unknown OS"
 305 #endif
 306   __ addi(arg_java, arg_java, -BytesPerWord);
 307   __ addi(arg_c, arg_c, BytesPerWord);
 308   __ cmplwi(CCR0, fpcnt, max_fp_register_arguments);
 309   __ blt(CCR0, move_floatSlot_to_FARG);
 310   __ b(loop_start);
 311 
 312   __ bind(do_double);
 313   __ lfd(floatSlot, - BytesPerWord, arg_java);
 314   __ stfd(floatSlot, 0, arg_c);
 315   __ addi(arg_java, arg_java, - 2 * BytesPerWord);
 316   __ addi(arg_c, arg_c, BytesPerWord);
 317   __ cmplwi(CCR0, fpcnt, max_fp_register_arguments);
 318   __ blt(CCR0, move_floatSlot_to_FARG);
 319   __ b(loop_start);
 320 
 321   __ bind(loop_end);




 280   __ lwa(intSlot, 0, arg_java);
 281   __ std(intSlot, 0, arg_c);
 282   __ addi(arg_java, arg_java, -BytesPerWord);
 283   __ addi(arg_c, arg_c, BytesPerWord);
 284   __ cmplwi(CCR0, argcnt, max_int_register_arguments);
 285   __ blt(CCR0, move_intSlot_to_ARG);
 286   __ b(loop_start);
 287 
 288   __ bind(do_long);
 289   __ ld(intSlot, -BytesPerWord, arg_java);
 290   __ std(intSlot, 0, arg_c);
 291   __ addi(arg_java, arg_java, - 2 * BytesPerWord);
 292   __ addi(arg_c, arg_c, BytesPerWord);
 293   __ cmplwi(CCR0, argcnt, max_int_register_arguments);
 294   __ blt(CCR0, move_intSlot_to_ARG);
 295   __ b(loop_start);
 296 
 297   __ bind(do_float);
 298   __ lfs(floatSlot, 0, arg_java);
 299 #if defined(LINUX)
 300   // Linux uses ELF ABI. Both original ELF and ELFv2 ABIs have float
 301   // in the least significant word of an argument slot.
 302 #if defined(VM_LITTLE_ENDIAN)
 303   __ stfs(floatSlot, 0, arg_c);
 304 #else
 305   __ stfs(floatSlot, 4, arg_c);
 306 #endif
 307 #elif defined(AIX)
 308   // Although AIX runs on big endian CPU, float is in most significant
 309   // word of an argument slot.
 310   __ stfs(floatSlot, 0, arg_c);
 311 #else
 312 #error "unknown OS"
 313 #endif
 314   __ addi(arg_java, arg_java, -BytesPerWord);
 315   __ addi(arg_c, arg_c, BytesPerWord);
 316   __ cmplwi(CCR0, fpcnt, max_fp_register_arguments);
 317   __ blt(CCR0, move_floatSlot_to_FARG);
 318   __ b(loop_start);
 319 
 320   __ bind(do_double);
 321   __ lfd(floatSlot, - BytesPerWord, arg_java);
 322   __ stfd(floatSlot, 0, arg_c);
 323   __ addi(arg_java, arg_java, - 2 * BytesPerWord);
 324   __ addi(arg_c, arg_c, BytesPerWord);
 325   __ cmplwi(CCR0, fpcnt, max_fp_register_arguments);
 326   __ blt(CCR0, move_floatSlot_to_FARG);
 327   __ b(loop_start);
 328 
 329   __ bind(loop_end);