src/cpu/ppc/vm/sharedRuntime_ppc.cpp

Print this page

        

*** 732,746 **** case T_SHORT: case T_INT: // We must cast ints to longs and use full 64 bit stack slots // here. We do the cast in GraphKit::gen_stub() and just guard // here against loosing that change. - Unimplemented(); // TODO: PPC port - /* assert(SharedRuntime::c_calling_convention_requires_ints_as_longs(), "argument of type int should be promoted to type long"); - */ guarantee(i > 0 && sig_bt[i-1] == T_LONG, "argument of type (bt) should have been promoted to type (T_LONG,bt) for bt in " "{T_BOOLEAN, T_CHAR, T_BYTE, T_SHORT, T_INT}"); // Do not count halves. regs[i].set_bad(); --- 732,743 ----
*** 828,837 **** --- 825,902 ---- return round_to(stk, 2); } #endif // COMPILER2 + // Do we need to convert ints to longs for c calls? + bool SharedRuntime::c_calling_convention_requires_ints_as_longs() { + return true; + } + + // This is platform independent, but only needed on PPC64 so far. + static int convert_ints_to_longints_argcnt(int in_args_count, BasicType* in_sig_bt) { + assert(SharedRuntime::c_calling_convention_requires_ints_as_longs(), ""); + + int argcnt = in_args_count; + for (int in = 0; in < in_args_count; in++) { + BasicType bt = in_sig_bt[in]; + switch (bt) { + case T_BOOLEAN: + case T_CHAR: + case T_BYTE: + case T_SHORT: + case T_INT: + argcnt++; + break; + default: + break; + } + } + + return argcnt; + } + + // This is platform independent, but only needed on PPC64 so far. + static void convert_ints_to_longints(int i2l_argcnt, int& in_args_count, + BasicType*& in_sig_bt, VMRegPair*& in_regs) { + assert(SharedRuntime::c_calling_convention_requires_ints_as_longs(), ""); + + VMRegPair *new_in_regs = NEW_RESOURCE_ARRAY(VMRegPair, i2l_argcnt); + BasicType *new_in_sig_bt = NEW_RESOURCE_ARRAY(BasicType, i2l_argcnt); + + int argcnt = 0; + for (int in = 0; in < in_args_count; in++, argcnt++) { + BasicType bt = in_sig_bt[in]; + VMRegPair reg = in_regs[in]; + switch (bt) { + case T_BOOLEAN: + case T_CHAR: + case T_BYTE: + case T_SHORT: + case T_INT: + // convert (bt) to (T_LONG,bt) + new_in_sig_bt[argcnt ] = T_LONG; + new_in_sig_bt[argcnt+1] = bt; + assert(reg.first()->is_valid() && !reg.second()->is_valid(), ""); + new_in_regs[argcnt ].set2(reg.first()); + new_in_regs[argcnt+1].set_bad(); + argcnt++; + break; + default: + // no conversion needed + new_in_sig_bt[argcnt] = bt; + new_in_regs[argcnt] = reg; + break; + } + } + assert(argcnt == i2l_argcnt, "must match"); + + in_regs = new_in_regs; + in_sig_bt = new_in_sig_bt; + in_args_count = i2l_argcnt; + } + static address gen_c2i_adapter(MacroAssembler *masm, int total_args_passed, int comp_args_on_stack, const BasicType *sig_bt, const VMRegPair *regs,