Commit eedb2961 authored by Milad Fa's avatar Milad Fa Committed by Commit Bot

PPC/s390: [runtime] Add new instance types for constructor functions

Port 624030e9

Original Commit Message:

    This will allow us optimize the protector cell checks in the fast path
    from checking against the function object in every context to just
    doing a range check against the instance type.

    This patch adds new instance types for constructor functions that
    require such protector cell checks.

R=gsathya@chromium.org, joransiu@ca.ibm.com, junyan@redhat.com, midawson@redhat.com
BUG=
LOG=N

Change-Id: If5918721117e87579a3c6a2a4ed6245bd033a88e
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2636840Reviewed-by: 's avatarJunliang Yan <junyan@redhat.com>
Reviewed-by: 's avatarMilad Fa <mfarazma@redhat.com>
Commit-Queue: Milad Fa <mfarazma@redhat.com>
Cr-Commit-Position: refs/heads/master@{#72173}
parent e16427fa
......@@ -2233,9 +2233,11 @@ void Builtins::Generate_Call(MacroAssembler* masm, ConvertReceiverMode mode) {
Label non_callable, non_smi;
__ JumpIfSmi(r4, &non_callable);
__ bind(&non_smi);
__ CompareObjectType(r4, r7, r8, JS_FUNCTION_TYPE);
__ LoadMap(r7, r4);
__ CompareInstanceTypeRange(r7, r8, FIRST_JS_FUNCTION_TYPE,
LAST_JS_FUNCTION_TYPE);
__ Jump(masm->isolate()->builtins()->CallFunction(mode),
RelocInfo::CODE_TARGET, eq);
RelocInfo::CODE_TARGET, le);
__ cmpi(r8, Operand(JS_BOUND_FUNCTION_TYPE));
__ Jump(BUILTIN_CODE(masm->isolate(), CallBoundFunction),
RelocInfo::CODE_TARGET, eq);
......@@ -2347,9 +2349,10 @@ void Builtins::Generate_Construct(MacroAssembler* masm) {
__ beq(&non_constructor, cr0);
// Dispatch based on instance type.
__ CompareInstanceType(r7, r8, JS_FUNCTION_TYPE);
__ CompareInstanceTypeRange(r7, r8, FIRST_JS_FUNCTION_TYPE,
LAST_JS_FUNCTION_TYPE);
__ Jump(BUILTIN_CODE(masm->isolate(), ConstructFunction),
RelocInfo::CODE_TARGET, eq);
RelocInfo::CODE_TARGET, le);
// Only dispatch to bound functions after checking whether they are
// constructors.
......
......@@ -2284,9 +2284,11 @@ void Builtins::Generate_Call(MacroAssembler* masm, ConvertReceiverMode mode) {
Label non_callable, non_smi;
__ JumpIfSmi(r3, &non_callable);
__ bind(&non_smi);
__ CompareObjectType(r3, r6, r7, JS_FUNCTION_TYPE);
__ LoadMap(r6, r3);
__ CompareInstanceTypeRange(r6, r7, FIRST_JS_FUNCTION_TYPE,
LAST_JS_FUNCTION_TYPE);
__ Jump(masm->isolate()->builtins()->CallFunction(mode),
RelocInfo::CODE_TARGET, eq);
RelocInfo::CODE_TARGET, le);
__ CmpS64(r7, Operand(JS_BOUND_FUNCTION_TYPE));
__ Jump(BUILTIN_CODE(masm->isolate(), CallBoundFunction),
RelocInfo::CODE_TARGET, eq);
......@@ -2397,9 +2399,10 @@ void Builtins::Generate_Construct(MacroAssembler* masm) {
__ beq(&non_constructor);
// Dispatch based on instance type.
__ CompareInstanceType(r6, r7, JS_FUNCTION_TYPE);
__ CompareInstanceTypeRange(r6, r7, FIRST_JS_FUNCTION_TYPE,
LAST_JS_FUNCTION_TYPE);
__ Jump(BUILTIN_CODE(masm->isolate(), ConstructFunction),
RelocInfo::CODE_TARGET, eq);
RelocInfo::CODE_TARGET, le);
// Only dispatch to bound functions after checking whether they are
// constructors.
......
......@@ -1627,6 +1627,18 @@ void MacroAssembler::CompareInstanceType(Register map, Register type_reg,
cmpi(type_reg, Operand(type));
}
void MacroAssembler::CompareInstanceTypeRange(Register map, Register type_reg,
InstanceType lower_limit,
InstanceType higher_limit) {
DCHECK_LT(lower_limit, higher_limit);
UseScratchRegisterScope temps(this);
Register scratch = temps.Acquire();
LoadHalfWord(type_reg, FieldMemOperand(map, Map::kInstanceTypeOffset));
mov(scratch, Operand(lower_limit));
sub(scratch, type_reg, scratch);
cmpli(scratch, Operand(higher_limit - lower_limit));
}
void MacroAssembler::CompareRoot(Register obj, RootIndex index) {
DCHECK(obj != r0);
LoadRoot(r0, index);
......@@ -1969,9 +1981,11 @@ void MacroAssembler::AssertFunction(Register object) {
TestIfSmi(object, r0);
Check(ne, AbortReason::kOperandIsASmiAndNotAFunction, cr0);
push(object);
CompareObjectType(object, object, object, JS_FUNCTION_TYPE);
LoadMap(object, object);
CompareInstanceTypeRange(object, object, FIRST_JS_FUNCTION_TYPE,
LAST_JS_FUNCTION_TYPE);
pop(object);
Check(eq, AbortReason::kOperandIsNotAFunction);
Check(le, AbortReason::kOperandIsNotAFunction);
}
}
......
......@@ -873,6 +873,14 @@ class V8_EXPORT_PRIVATE MacroAssembler : public TurboAssembler {
// sets the flags and leaves the object type in the type_reg register.
void CompareInstanceType(Register map, Register type_reg, InstanceType type);
// Compare instance type ranges for a map (lower_limit and higher_limit
// inclusive).
//
// Always use unsigned comparisons: ls for a positive result.
void CompareInstanceTypeRange(Register map, Register type_reg,
InstanceType lower_limit,
InstanceType higher_limit);
// Compare the object in a register to a value from the root list.
// Uses the ip register as scratch.
void CompareRoot(Register obj, RootIndex index);
......
......@@ -1762,6 +1762,18 @@ void MacroAssembler::CompareInstanceType(Register map, Register type_reg,
CmpS64(type_reg, Operand(type));
}
void MacroAssembler::CompareInstanceTypeRange(Register map, Register type_reg,
InstanceType lower_limit,
InstanceType higher_limit) {
DCHECK_LT(lower_limit, higher_limit);
UseScratchRegisterScope temps(this);
Register scratch = temps.Acquire();
LoadU16(type_reg, FieldMemOperand(map, Map::kInstanceTypeOffset));
mov(scratch, type_reg);
slgfi(scratch, Operand(lower_limit));
CmpU64(scratch, Operand(higher_limit - lower_limit));
}
void MacroAssembler::CompareRoot(Register obj, RootIndex index) {
int32_t offset = RootRegisterOffsetForRootIndex(index);
#ifdef V8_TARGET_BIG_ENDIAN
......@@ -2004,9 +2016,11 @@ void MacroAssembler::AssertFunction(Register object) {
TestIfSmi(object);
Check(ne, AbortReason::kOperandIsASmiAndNotAFunction, cr0);
push(object);
CompareObjectType(object, object, object, JS_FUNCTION_TYPE);
LoadMap(object, object);
CompareInstanceTypeRange(object, object, FIRST_JS_FUNCTION_TYPE,
LAST_JS_FUNCTION_TYPE);
pop(object);
Check(eq, AbortReason::kOperandIsNotAFunction);
Check(le, AbortReason::kOperandIsNotAFunction);
}
}
......
......@@ -1074,6 +1074,14 @@ class V8_EXPORT_PRIVATE MacroAssembler : public TurboAssembler {
// sets the flags and leaves the object type in the type_reg register.
void CompareInstanceType(Register map, Register type_reg, InstanceType type);
// Compare instance type ranges for a map (lower_limit and higher_limit
// inclusive).
//
// Always use unsigned comparisons: ls for a positive result.
void CompareInstanceTypeRange(Register map, Register type_reg,
InstanceType lower_limit,
InstanceType higher_limit);
// Compare the object in a register to a value from the root list.
// Uses the ip register as scratch.
void CompareRoot(Register obj, RootIndex index);
......
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