< prev index next >

src/cpu/x86/vm/sharedRuntime_x86_64.cpp

Print this page




 501       }
 502       break;
 503     case T_DOUBLE:
 504       assert((i + 1) < total_args_passed && sig_bt[i + 1] == T_VOID, "expecting half");
 505       if (fp_args < Argument::n_float_register_parameters_j) {
 506         regs[i].set2(FP_ArgReg[fp_args++]->as_VMReg());
 507       } else {
 508         regs[i].set2(VMRegImpl::stack2reg(stk_args));
 509         stk_args += 2;
 510       }
 511       break;
 512     default:
 513       ShouldNotReachHere();
 514       break;
 515     }
 516   }
 517 
 518   return round_to(stk_args, 2);
 519 }
 520 

















































































 521 // Patch the callers callsite with entry to compiled code if it exists.
 522 static void patch_callers_callsite(MacroAssembler *masm) {
 523   Label L;
 524   __ cmpptr(Address(rbx, in_bytes(Method::code_offset())), (int32_t)NULL_WORD);
 525   __ jcc(Assembler::equal, L);
 526 
 527   // Save the current stack pointer
 528   __ mov(r13, rsp);
 529   // Schedule the branch target address early.
 530   // Call into the VM to patch the caller, then jump to compiled callee
 531   // rax isn't live so capture return address while we easily can
 532   __ movptr(rax, Address(rsp, 0));
 533 
 534   // align stack so push_CPU_state doesn't fault
 535   __ andptr(rsp, -(StackAlignmentInBytes));
 536   __ push_CPU_state();
 537   __ vzeroupper();
 538   // VM needs caller's callsite
 539   // VM needs target method
 540   // This needs to be a long call since we will relocate this adapter to




 501       }
 502       break;
 503     case T_DOUBLE:
 504       assert((i + 1) < total_args_passed && sig_bt[i + 1] == T_VOID, "expecting half");
 505       if (fp_args < Argument::n_float_register_parameters_j) {
 506         regs[i].set2(FP_ArgReg[fp_args++]->as_VMReg());
 507       } else {
 508         regs[i].set2(VMRegImpl::stack2reg(stk_args));
 509         stk_args += 2;
 510       }
 511       break;
 512     default:
 513       ShouldNotReachHere();
 514       break;
 515     }
 516   }
 517 
 518   return round_to(stk_args, 2);
 519 }
 520 
 521 // Same as java_calling_convention() but for multiple return
 522 // values. There's no way to store them on the stack so if we don't
 523 // have enough registers, multiple values can't be returned.
 524 const uint SharedRuntime::java_return_convention_max_int = Argument::n_int_register_parameters_j+1;
 525 const uint SharedRuntime::java_return_convention_max_float = Argument::n_float_register_parameters_j;
 526 int SharedRuntime::java_return_convention(const BasicType *sig_bt,
 527                                           VMRegPair *regs,
 528                                           int total_args_passed) {
 529   // Create the mapping between argument positions and
 530   // registers.
 531   static const Register INT_ArgReg[java_return_convention_max_int] = {
 532     rax, j_rarg5, j_rarg4, j_rarg3, j_rarg2, j_rarg1, j_rarg0
 533   };
 534   static const XMMRegister FP_ArgReg[java_return_convention_max_float] = {
 535     j_farg0, j_farg1, j_farg2, j_farg3,
 536     j_farg4, j_farg5, j_farg6, j_farg7
 537   };
 538 
 539 
 540   uint int_args = 0;
 541   uint fp_args = 0;
 542 
 543   for (int i = 0; i < total_args_passed; i++) {
 544     switch (sig_bt[i]) {
 545     case T_BOOLEAN:
 546     case T_CHAR:
 547     case T_BYTE:
 548     case T_SHORT:
 549     case T_INT:
 550       if (int_args < Argument::n_int_register_parameters_j+1) {
 551         regs[i].set1(INT_ArgReg[int_args]->as_VMReg());
 552         int_args++;
 553       } else {
 554         return -1;
 555       }
 556       break;
 557     case T_VOID:
 558       // halves of T_LONG or T_DOUBLE
 559       assert(i != 0 && (sig_bt[i - 1] == T_LONG || sig_bt[i - 1] == T_DOUBLE), "expecting half");
 560       regs[i].set_bad();
 561       break;
 562     case T_LONG:
 563       assert(sig_bt[i + 1] == T_VOID, "expecting half");
 564       // fall through
 565     case T_OBJECT:
 566     case T_ARRAY:
 567     case T_ADDRESS:
 568     case T_METADATA:
 569       if (int_args < Argument::n_int_register_parameters_j+1) {
 570         regs[i].set2(INT_ArgReg[int_args]->as_VMReg());
 571         int_args++;
 572       } else {
 573         return -1;
 574       }
 575       break;
 576     case T_FLOAT:
 577       if (fp_args < Argument::n_float_register_parameters_j) {
 578         regs[i].set1(FP_ArgReg[fp_args]->as_VMReg());
 579         fp_args++;
 580       } else {
 581         return -1;
 582       }
 583       break;
 584     case T_DOUBLE:
 585       assert(sig_bt[i + 1] == T_VOID, "expecting half");
 586       if (fp_args < Argument::n_float_register_parameters_j) {
 587         regs[i].set2(FP_ArgReg[fp_args]->as_VMReg());
 588         fp_args++;
 589       } else {
 590         return -1;
 591       }
 592       break;
 593     default:
 594       ShouldNotReachHere();
 595       break;
 596     }
 597   }
 598 
 599   return int_args + fp_args;
 600 }
 601 
 602 // Patch the callers callsite with entry to compiled code if it exists.
 603 static void patch_callers_callsite(MacroAssembler *masm) {
 604   Label L;
 605   __ cmpptr(Address(rbx, in_bytes(Method::code_offset())), (int32_t)NULL_WORD);
 606   __ jcc(Assembler::equal, L);
 607 
 608   // Save the current stack pointer
 609   __ mov(r13, rsp);
 610   // Schedule the branch target address early.
 611   // Call into the VM to patch the caller, then jump to compiled callee
 612   // rax isn't live so capture return address while we easily can
 613   __ movptr(rax, Address(rsp, 0));
 614 
 615   // align stack so push_CPU_state doesn't fault
 616   __ andptr(rsp, -(StackAlignmentInBytes));
 617   __ push_CPU_state();
 618   __ vzeroupper();
 619   // VM needs caller's callsite
 620   // VM needs target method
 621   // This needs to be a long call since we will relocate this adapter to


< prev index next >