Commit 035dbdd9 authored by Junliang Yan's avatar Junliang Yan Committed by Commit Bot

PPC/s390: [sfi] Compress function arg counts to 16 bit

Port 53d4dfc3

Original Commit Message:

    Compress the parameter count (and function length) stored in
    SharedFunctionInfo to a uint16_t. This limits us to 2^16 - 1 parameters
    per function, minus one for the "don't adapt arguments" sentinel value,
    which is one fewer than Code::kMaxArguments was already. Anyway, 65534
    arguments should be enough for anyone!

    This drops SFI size by 4 bytes.

R=leszeks@chromium.org, joransiu@ca.ibm.com, michael_dawson@ca.ibm.com
BUG=
LOG=N

Change-Id: I23db04fd41ad577949cd8d45bab82c77019d9350
Reviewed-on: https://chromium-review.googlesource.com/1081450Reviewed-by: 's avatarJoran Siu <joransiu@ca.ibm.com>
Commit-Queue: Junliang Yan <jyan@ca.ibm.com>
Cr-Commit-Position: refs/heads/master@{#53464}
parent 88a61057
......@@ -502,7 +502,7 @@ void Builtins::Generate_ResumeGeneratorTrampoline(MacroAssembler* masm) {
// Copy the function arguments from the generator object's register file.
__ LoadP(r6, FieldMemOperand(r7, JSFunction::kSharedFunctionInfoOffset));
__ LoadWordArith(
__ LoadHalfWord(
r6, FieldMemOperand(r6, SharedFunctionInfo::kFormalParameterCountOffset));
__ LoadP(r5, FieldMemOperand(
r4, JSGeneratorObject::kParametersAndRegistersOffset));
......@@ -2047,7 +2047,7 @@ void Builtins::Generate_CallOrConstructForwardVarargs(MacroAssembler* masm,
{
__ LoadP(r8, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset));
__ LoadP(r8, FieldMemOperand(r8, JSFunction::kSharedFunctionInfoOffset));
__ LoadWordArith(
__ LoadHalfWord(
r8,
FieldMemOperand(r8, SharedFunctionInfo::kFormalParameterCountOffset));
__ mr(r7, fp);
......@@ -2184,7 +2184,7 @@ void Builtins::Generate_CallFunction(MacroAssembler* masm,
// -- cp : the function context.
// -----------------------------------
__ LoadWordArith(
__ LoadHalfWord(
r5, FieldMemOperand(r5, SharedFunctionInfo::kFormalParameterCountOffset));
ParameterCount actual(r3);
ParameterCount expected(r5);
......@@ -2512,10 +2512,10 @@ void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) {
Label invoke, dont_adapt_arguments, stack_overflow;
Label enough, too_few;
__ cmpli(r5, Operand(SharedFunctionInfo::kDontAdaptArgumentsSentinel));
__ beq(&dont_adapt_arguments);
__ cmp(r3, r5);
__ blt(&too_few);
__ cmpi(r5, Operand(SharedFunctionInfo::kDontAdaptArgumentsSentinel));
__ beq(&dont_adapt_arguments);
{ // Enough parameters: actual >= expected
__ bind(&enough);
......
......@@ -502,7 +502,7 @@ void Builtins::Generate_ResumeGeneratorTrampoline(MacroAssembler* masm) {
// Copy the function arguments from the generator object's register file.
__ LoadP(r5, FieldMemOperand(r6, JSFunction::kSharedFunctionInfoOffset));
__ LoadW(
__ LoadLogicalHalfWordP(
r5, FieldMemOperand(r5, SharedFunctionInfo::kFormalParameterCountOffset));
__ LoadP(r4, FieldMemOperand(
r3, JSGeneratorObject::kParametersAndRegistersOffset));
......@@ -2060,8 +2060,9 @@ void Builtins::Generate_CallOrConstructForwardVarargs(MacroAssembler* masm,
{
__ LoadP(r7, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset));
__ LoadP(r7, FieldMemOperand(r7, JSFunction::kSharedFunctionInfoOffset));
__ LoadW(r7, FieldMemOperand(
r7, SharedFunctionInfo::kFormalParameterCountOffset));
__ LoadLogicalHalfWordP(
r7,
FieldMemOperand(r7, SharedFunctionInfo::kFormalParameterCountOffset));
__ LoadRR(r6, fp);
}
__ b(&arguments_done);
......@@ -2196,7 +2197,7 @@ void Builtins::Generate_CallFunction(MacroAssembler* masm,
// -- cp : the function context.
// -----------------------------------
__ LoadW(
__ LoadLogicalHalfWordP(
r4, FieldMemOperand(r4, SharedFunctionInfo::kFormalParameterCountOffset));
ParameterCount actual(r2);
ParameterCount expected(r4);
......@@ -2525,10 +2526,10 @@ void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) {
Label invoke, dont_adapt_arguments, stack_overflow;
Label enough, too_few;
__ CmpP(r2, r4);
__ tmll(r4, Operand(SharedFunctionInfo::kDontAdaptArgumentsSentinel));
__ b(Condition(1), &dont_adapt_arguments);
__ CmpLogicalP(r2, r4);
__ blt(&too_few);
__ CmpP(r4, Operand(SharedFunctionInfo::kDontAdaptArgumentsSentinel));
__ beq(&dont_adapt_arguments);
{ // Enough parameters: actual >= expected
__ bind(&enough);
......
......@@ -37,13 +37,8 @@ void DebugCodegen::GenerateFrameDropperTrampoline(MacroAssembler* masm) {
__ LoadP(r4, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset));
__ LeaveFrame(StackFrame::INTERNAL);
__ LoadP(r3, FieldMemOperand(r4, JSFunction::kSharedFunctionInfoOffset));
#if V8_TARGET_ARCH_PPC64
__ lwz(r3, FieldMemOperand(
r3, SharedFunctionInfo::kFormalParameterCountOffset + 4));
#else
__ lwz(r3,
__ lhz(r3,
FieldMemOperand(r3, SharedFunctionInfo::kFormalParameterCountOffset));
#endif
__ mr(r5, r3);
ParameterCount dummy1(r5);
......
......@@ -39,13 +39,8 @@ void DebugCodegen::GenerateFrameDropperTrampoline(MacroAssembler* masm) {
__ LoadP(r3, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset));
__ LeaveFrame(StackFrame::INTERNAL);
__ LoadP(r2, FieldMemOperand(r3, JSFunction::kSharedFunctionInfoOffset));
#if V8_TARGET_ARCH_S390X
__ LoadW(r2, FieldMemOperand(
r2, SharedFunctionInfo::kFormalParameterCountOffset + 4));
#else
__ LoadP(
__ LoadLogicalHalfWordP(
r2, FieldMemOperand(r2, SharedFunctionInfo::kFormalParameterCountOffset));
#endif
__ LoadRR(r4, r2);
ParameterCount dummy1(r4);
......
......@@ -1430,9 +1430,9 @@ void MacroAssembler::InvokeFunction(Register fun, Register new_target,
LoadP(temp_reg, FieldMemOperand(r4, JSFunction::kSharedFunctionInfoOffset));
LoadP(cp, FieldMemOperand(r4, JSFunction::kContextOffset));
LoadWordArith(expected_reg,
FieldMemOperand(
temp_reg, SharedFunctionInfo::kFormalParameterCountOffset));
LoadHalfWord(expected_reg,
FieldMemOperand(
temp_reg, SharedFunctionInfo::kFormalParameterCountOffset));
ParameterCount expected(expected_reg);
InvokeFunctionCode(fun, new_target, expected, actual, flag);
......@@ -2731,6 +2731,7 @@ void MacroAssembler::LoadHalfWord(Register dst, const MemOperand& mem,
int offset = mem.offset();
if (!is_int16(offset)) {
DCHECK_NE(scratch, no_reg);
LoadIntLiteral(scratch, offset);
lhzx(dst, MemOperand(base, scratch));
} else {
......
......@@ -797,7 +797,8 @@ class MacroAssembler : public TurboAssembler {
void LoadWord(Register dst, const MemOperand& mem, Register scratch);
void StoreWord(Register src, const MemOperand& mem, Register scratch);
void LoadHalfWord(Register dst, const MemOperand& mem, Register scratch);
void LoadHalfWord(Register dst, const MemOperand& mem,
Register scratch = no_reg);
void LoadHalfWordArith(Register dst, const MemOperand& mem,
Register scratch = no_reg);
void StoreHalfWord(Register src, const MemOperand& mem, Register scratch);
......
......@@ -1293,8 +1293,8 @@ void MacroAssembler::InvokePrologue(const ParameterCount& expected,
// passed in registers.
// ARM has some sanity checks as per below, considering add them for S390
// DCHECK(actual.is_immediate() || actual.reg() == r2);
// DCHECK(expected.is_immediate() || expected.reg() == r4);
DCHECK(actual.is_immediate() || actual.reg() == r2);
DCHECK(expected.is_immediate() || expected.reg() == r4);
if (expected.is_immediate()) {
DCHECK(actual.is_immediate());
......@@ -1444,9 +1444,10 @@ void MacroAssembler::InvokeFunction(Register fun, Register new_target,
Register temp_reg = r6;
LoadP(temp_reg, FieldMemOperand(r3, JSFunction::kSharedFunctionInfoOffset));
LoadP(cp, FieldMemOperand(r3, JSFunction::kContextOffset));
LoadW(expected_reg,
FieldMemOperand(temp_reg,
SharedFunctionInfo::kFormalParameterCountOffset));
LoadLogicalHalfWordP(
expected_reg,
FieldMemOperand(temp_reg,
SharedFunctionInfo::kFormalParameterCountOffset));
ParameterCount expected(expected_reg);
InvokeFunctionCode(fun, new_target, expected, actual, flag);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment