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) { ...@@ -502,7 +502,7 @@ void Builtins::Generate_ResumeGeneratorTrampoline(MacroAssembler* masm) {
// Copy the function arguments from the generator object's register file. // Copy the function arguments from the generator object's register file.
__ LoadP(r6, FieldMemOperand(r7, JSFunction::kSharedFunctionInfoOffset)); __ LoadP(r6, FieldMemOperand(r7, JSFunction::kSharedFunctionInfoOffset));
__ LoadWordArith( __ LoadHalfWord(
r6, FieldMemOperand(r6, SharedFunctionInfo::kFormalParameterCountOffset)); r6, FieldMemOperand(r6, SharedFunctionInfo::kFormalParameterCountOffset));
__ LoadP(r5, FieldMemOperand( __ LoadP(r5, FieldMemOperand(
r4, JSGeneratorObject::kParametersAndRegistersOffset)); r4, JSGeneratorObject::kParametersAndRegistersOffset));
...@@ -2047,7 +2047,7 @@ void Builtins::Generate_CallOrConstructForwardVarargs(MacroAssembler* masm, ...@@ -2047,7 +2047,7 @@ void Builtins::Generate_CallOrConstructForwardVarargs(MacroAssembler* masm,
{ {
__ LoadP(r8, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset)); __ LoadP(r8, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset));
__ LoadP(r8, FieldMemOperand(r8, JSFunction::kSharedFunctionInfoOffset)); __ LoadP(r8, FieldMemOperand(r8, JSFunction::kSharedFunctionInfoOffset));
__ LoadWordArith( __ LoadHalfWord(
r8, r8,
FieldMemOperand(r8, SharedFunctionInfo::kFormalParameterCountOffset)); FieldMemOperand(r8, SharedFunctionInfo::kFormalParameterCountOffset));
__ mr(r7, fp); __ mr(r7, fp);
...@@ -2184,7 +2184,7 @@ void Builtins::Generate_CallFunction(MacroAssembler* masm, ...@@ -2184,7 +2184,7 @@ void Builtins::Generate_CallFunction(MacroAssembler* masm,
// -- cp : the function context. // -- cp : the function context.
// ----------------------------------- // -----------------------------------
__ LoadWordArith( __ LoadHalfWord(
r5, FieldMemOperand(r5, SharedFunctionInfo::kFormalParameterCountOffset)); r5, FieldMemOperand(r5, SharedFunctionInfo::kFormalParameterCountOffset));
ParameterCount actual(r3); ParameterCount actual(r3);
ParameterCount expected(r5); ParameterCount expected(r5);
...@@ -2512,10 +2512,10 @@ void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) { ...@@ -2512,10 +2512,10 @@ void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) {
Label invoke, dont_adapt_arguments, stack_overflow; Label invoke, dont_adapt_arguments, stack_overflow;
Label enough, too_few; Label enough, too_few;
__ cmpli(r5, Operand(SharedFunctionInfo::kDontAdaptArgumentsSentinel));
__ beq(&dont_adapt_arguments);
__ cmp(r3, r5); __ cmp(r3, r5);
__ blt(&too_few); __ blt(&too_few);
__ cmpi(r5, Operand(SharedFunctionInfo::kDontAdaptArgumentsSentinel));
__ beq(&dont_adapt_arguments);
{ // Enough parameters: actual >= expected { // Enough parameters: actual >= expected
__ bind(&enough); __ bind(&enough);
......
...@@ -502,7 +502,7 @@ void Builtins::Generate_ResumeGeneratorTrampoline(MacroAssembler* masm) { ...@@ -502,7 +502,7 @@ void Builtins::Generate_ResumeGeneratorTrampoline(MacroAssembler* masm) {
// Copy the function arguments from the generator object's register file. // Copy the function arguments from the generator object's register file.
__ LoadP(r5, FieldMemOperand(r6, JSFunction::kSharedFunctionInfoOffset)); __ LoadP(r5, FieldMemOperand(r6, JSFunction::kSharedFunctionInfoOffset));
__ LoadW( __ LoadLogicalHalfWordP(
r5, FieldMemOperand(r5, SharedFunctionInfo::kFormalParameterCountOffset)); r5, FieldMemOperand(r5, SharedFunctionInfo::kFormalParameterCountOffset));
__ LoadP(r4, FieldMemOperand( __ LoadP(r4, FieldMemOperand(
r3, JSGeneratorObject::kParametersAndRegistersOffset)); r3, JSGeneratorObject::kParametersAndRegistersOffset));
...@@ -2060,8 +2060,9 @@ void Builtins::Generate_CallOrConstructForwardVarargs(MacroAssembler* masm, ...@@ -2060,8 +2060,9 @@ void Builtins::Generate_CallOrConstructForwardVarargs(MacroAssembler* masm,
{ {
__ LoadP(r7, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset)); __ LoadP(r7, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset));
__ LoadP(r7, FieldMemOperand(r7, JSFunction::kSharedFunctionInfoOffset)); __ LoadP(r7, FieldMemOperand(r7, JSFunction::kSharedFunctionInfoOffset));
__ LoadW(r7, FieldMemOperand( __ LoadLogicalHalfWordP(
r7, SharedFunctionInfo::kFormalParameterCountOffset)); r7,
FieldMemOperand(r7, SharedFunctionInfo::kFormalParameterCountOffset));
__ LoadRR(r6, fp); __ LoadRR(r6, fp);
} }
__ b(&arguments_done); __ b(&arguments_done);
...@@ -2196,7 +2197,7 @@ void Builtins::Generate_CallFunction(MacroAssembler* masm, ...@@ -2196,7 +2197,7 @@ void Builtins::Generate_CallFunction(MacroAssembler* masm,
// -- cp : the function context. // -- cp : the function context.
// ----------------------------------- // -----------------------------------
__ LoadW( __ LoadLogicalHalfWordP(
r4, FieldMemOperand(r4, SharedFunctionInfo::kFormalParameterCountOffset)); r4, FieldMemOperand(r4, SharedFunctionInfo::kFormalParameterCountOffset));
ParameterCount actual(r2); ParameterCount actual(r2);
ParameterCount expected(r4); ParameterCount expected(r4);
...@@ -2525,10 +2526,10 @@ void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) { ...@@ -2525,10 +2526,10 @@ void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) {
Label invoke, dont_adapt_arguments, stack_overflow; Label invoke, dont_adapt_arguments, stack_overflow;
Label enough, too_few; Label enough, too_few;
__ CmpP(r2, r4); __ tmll(r4, Operand(SharedFunctionInfo::kDontAdaptArgumentsSentinel));
__ b(Condition(1), &dont_adapt_arguments);
__ CmpLogicalP(r2, r4);
__ blt(&too_few); __ blt(&too_few);
__ CmpP(r4, Operand(SharedFunctionInfo::kDontAdaptArgumentsSentinel));
__ beq(&dont_adapt_arguments);
{ // Enough parameters: actual >= expected { // Enough parameters: actual >= expected
__ bind(&enough); __ bind(&enough);
......
...@@ -37,13 +37,8 @@ void DebugCodegen::GenerateFrameDropperTrampoline(MacroAssembler* masm) { ...@@ -37,13 +37,8 @@ void DebugCodegen::GenerateFrameDropperTrampoline(MacroAssembler* masm) {
__ LoadP(r4, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset)); __ LoadP(r4, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset));
__ LeaveFrame(StackFrame::INTERNAL); __ LeaveFrame(StackFrame::INTERNAL);
__ LoadP(r3, FieldMemOperand(r4, JSFunction::kSharedFunctionInfoOffset)); __ LoadP(r3, FieldMemOperand(r4, JSFunction::kSharedFunctionInfoOffset));
#if V8_TARGET_ARCH_PPC64 __ lhz(r3,
__ lwz(r3, FieldMemOperand(
r3, SharedFunctionInfo::kFormalParameterCountOffset + 4));
#else
__ lwz(r3,
FieldMemOperand(r3, SharedFunctionInfo::kFormalParameterCountOffset)); FieldMemOperand(r3, SharedFunctionInfo::kFormalParameterCountOffset));
#endif
__ mr(r5, r3); __ mr(r5, r3);
ParameterCount dummy1(r5); ParameterCount dummy1(r5);
......
...@@ -39,13 +39,8 @@ void DebugCodegen::GenerateFrameDropperTrampoline(MacroAssembler* masm) { ...@@ -39,13 +39,8 @@ void DebugCodegen::GenerateFrameDropperTrampoline(MacroAssembler* masm) {
__ LoadP(r3, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset)); __ LoadP(r3, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset));
__ LeaveFrame(StackFrame::INTERNAL); __ LeaveFrame(StackFrame::INTERNAL);
__ LoadP(r2, FieldMemOperand(r3, JSFunction::kSharedFunctionInfoOffset)); __ LoadP(r2, FieldMemOperand(r3, JSFunction::kSharedFunctionInfoOffset));
#if V8_TARGET_ARCH_S390X __ LoadLogicalHalfWordP(
__ LoadW(r2, FieldMemOperand(
r2, SharedFunctionInfo::kFormalParameterCountOffset + 4));
#else
__ LoadP(
r2, FieldMemOperand(r2, SharedFunctionInfo::kFormalParameterCountOffset)); r2, FieldMemOperand(r2, SharedFunctionInfo::kFormalParameterCountOffset));
#endif
__ LoadRR(r4, r2); __ LoadRR(r4, r2);
ParameterCount dummy1(r4); ParameterCount dummy1(r4);
......
...@@ -1430,9 +1430,9 @@ void MacroAssembler::InvokeFunction(Register fun, Register new_target, ...@@ -1430,9 +1430,9 @@ void MacroAssembler::InvokeFunction(Register fun, Register new_target,
LoadP(temp_reg, FieldMemOperand(r4, JSFunction::kSharedFunctionInfoOffset)); LoadP(temp_reg, FieldMemOperand(r4, JSFunction::kSharedFunctionInfoOffset));
LoadP(cp, FieldMemOperand(r4, JSFunction::kContextOffset)); LoadP(cp, FieldMemOperand(r4, JSFunction::kContextOffset));
LoadWordArith(expected_reg, LoadHalfWord(expected_reg,
FieldMemOperand( FieldMemOperand(
temp_reg, SharedFunctionInfo::kFormalParameterCountOffset)); temp_reg, SharedFunctionInfo::kFormalParameterCountOffset));
ParameterCount expected(expected_reg); ParameterCount expected(expected_reg);
InvokeFunctionCode(fun, new_target, expected, actual, flag); InvokeFunctionCode(fun, new_target, expected, actual, flag);
...@@ -2731,6 +2731,7 @@ void MacroAssembler::LoadHalfWord(Register dst, const MemOperand& mem, ...@@ -2731,6 +2731,7 @@ void MacroAssembler::LoadHalfWord(Register dst, const MemOperand& mem,
int offset = mem.offset(); int offset = mem.offset();
if (!is_int16(offset)) { if (!is_int16(offset)) {
DCHECK_NE(scratch, no_reg);
LoadIntLiteral(scratch, offset); LoadIntLiteral(scratch, offset);
lhzx(dst, MemOperand(base, scratch)); lhzx(dst, MemOperand(base, scratch));
} else { } else {
......
...@@ -797,7 +797,8 @@ class MacroAssembler : public TurboAssembler { ...@@ -797,7 +797,8 @@ class MacroAssembler : public TurboAssembler {
void LoadWord(Register dst, const MemOperand& mem, Register scratch); void LoadWord(Register dst, const MemOperand& mem, Register scratch);
void StoreWord(Register src, 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, void LoadHalfWordArith(Register dst, const MemOperand& mem,
Register scratch = no_reg); Register scratch = no_reg);
void StoreHalfWord(Register src, const MemOperand& mem, Register scratch); void StoreHalfWord(Register src, const MemOperand& mem, Register scratch);
......
...@@ -1293,8 +1293,8 @@ void MacroAssembler::InvokePrologue(const ParameterCount& expected, ...@@ -1293,8 +1293,8 @@ void MacroAssembler::InvokePrologue(const ParameterCount& expected,
// passed in registers. // passed in registers.
// ARM has some sanity checks as per below, considering add them for S390 // ARM has some sanity checks as per below, considering add them for S390
// DCHECK(actual.is_immediate() || actual.reg() == r2); DCHECK(actual.is_immediate() || actual.reg() == r2);
// DCHECK(expected.is_immediate() || expected.reg() == r4); DCHECK(expected.is_immediate() || expected.reg() == r4);
if (expected.is_immediate()) { if (expected.is_immediate()) {
DCHECK(actual.is_immediate()); DCHECK(actual.is_immediate());
...@@ -1444,9 +1444,10 @@ void MacroAssembler::InvokeFunction(Register fun, Register new_target, ...@@ -1444,9 +1444,10 @@ void MacroAssembler::InvokeFunction(Register fun, Register new_target,
Register temp_reg = r6; Register temp_reg = r6;
LoadP(temp_reg, FieldMemOperand(r3, JSFunction::kSharedFunctionInfoOffset)); LoadP(temp_reg, FieldMemOperand(r3, JSFunction::kSharedFunctionInfoOffset));
LoadP(cp, FieldMemOperand(r3, JSFunction::kContextOffset)); LoadP(cp, FieldMemOperand(r3, JSFunction::kContextOffset));
LoadW(expected_reg, LoadLogicalHalfWordP(
FieldMemOperand(temp_reg, expected_reg,
SharedFunctionInfo::kFormalParameterCountOffset)); FieldMemOperand(temp_reg,
SharedFunctionInfo::kFormalParameterCountOffset));
ParameterCount expected(expected_reg); ParameterCount expected(expected_reg);
InvokeFunctionCode(fun, new_target, expected, actual, flag); 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