comparison src/cpu/x86/vm/sharedRuntime_x86_64.cpp @ 14416:6a936747b569

8024344: PPC64 (part 112): C argument in register AND stack slot. Summary: On PPC, the first 13 floating point arguments to C calls are passed in floating point registers. Also, all but the first 8 arguments are passed on the stack. So there can be floating point arguments that are passed on the stack and in a register. We duplicate the regs datastructure in c_calling_convention() to represent this. Reviewed-by: kvn, cjplummer
author goetz
date Thu, 12 Sep 2013 13:51:13 -0700
parents e7f5651d459c
children 1174c8abbdb6
comparison
equal deleted inserted replaced
14415:666e6ce3976c 14416:6a936747b569
887 return AdapterHandlerLibrary::new_entry(fingerprint, i2c_entry, c2i_entry, c2i_unverified_entry); 887 return AdapterHandlerLibrary::new_entry(fingerprint, i2c_entry, c2i_entry, c2i_unverified_entry);
888 } 888 }
889 889
890 int SharedRuntime::c_calling_convention(const BasicType *sig_bt, 890 int SharedRuntime::c_calling_convention(const BasicType *sig_bt,
891 VMRegPair *regs, 891 VMRegPair *regs,
892 VMRegPair *regs2,
892 int total_args_passed) { 893 int total_args_passed) {
894 assert(regs2 == NULL, "not needed on x86");
893 // We return the amount of VMRegImpl stack slots we need to reserve for all 895 // We return the amount of VMRegImpl stack slots we need to reserve for all
894 // the arguments NOT counting out_preserve_stack_slots. 896 // the arguments NOT counting out_preserve_stack_slots.
895 897
896 // NOTE: These arrays will have to change when c1 is ported 898 // NOTE: These arrays will have to change when c1 is ported
897 #ifdef _WIN64 899 #ifdef _WIN64
1855 } 1857 }
1856 1858
1857 // Now figure out where the args must be stored and how much stack space 1859 // Now figure out where the args must be stored and how much stack space
1858 // they require. 1860 // they require.
1859 int out_arg_slots; 1861 int out_arg_slots;
1860 out_arg_slots = c_calling_convention(out_sig_bt, out_regs, total_c_args); 1862 out_arg_slots = c_calling_convention(out_sig_bt, out_regs, NULL, total_c_args);
1861 1863
1862 // Compute framesize for the wrapper. We need to handlize all oops in 1864 // Compute framesize for the wrapper. We need to handlize all oops in
1863 // incoming registers 1865 // incoming registers
1864 1866
1865 // Calculate the total number of stack slots we will need. 1867 // Calculate the total number of stack slots we will need.
2759 // Now figure out where the args must be stored and how much stack space 2761 // Now figure out where the args must be stored and how much stack space
2760 // they require (neglecting out_preserve_stack_slots but space for storing 2762 // they require (neglecting out_preserve_stack_slots but space for storing
2761 // the 1st six register arguments). It's weird see int_stk_helper. 2763 // the 1st six register arguments). It's weird see int_stk_helper.
2762 2764
2763 int out_arg_slots; 2765 int out_arg_slots;
2764 out_arg_slots = c_calling_convention(out_sig_bt, out_regs, total_c_args); 2766 out_arg_slots = c_calling_convention(out_sig_bt, out_regs, NULL, total_c_args);
2765 2767
2766 // Calculate the total number of stack slots we will need. 2768 // Calculate the total number of stack slots we will need.
2767 2769
2768 // First count the abi requirement plus all of the outgoing args 2770 // First count the abi requirement plus all of the outgoing args
2769 int stack_slots = SharedRuntime::out_preserve_stack_slots() + out_arg_slots; 2771 int stack_slots = SharedRuntime::out_preserve_stack_slots() + out_arg_slots;