[maglev] Support DeleteProperty
Bug: v8:7700 Change-Id: If911ff32d42c7c907da88d52192bb839bf459d5b Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3803028 Auto-Submit: Victor Gomes <victorgomes@chromium.org> Commit-Queue: Leszek Swirski <leszeks@chromium.org> Reviewed-by: Leszek Swirski <leszeks@chromium.org> Cr-Commit-Position: refs/heads/main@{#82128}
This commit is contained in:
parent
bcd0fa556a
commit
7252b02332
@ -1448,8 +1448,22 @@ void MaglevGraphBuilder::VisitLogicalNot() {
|
||||
}
|
||||
|
||||
MAGLEV_UNIMPLEMENTED_BYTECODE(TypeOf)
|
||||
MAGLEV_UNIMPLEMENTED_BYTECODE(DeletePropertyStrict)
|
||||
MAGLEV_UNIMPLEMENTED_BYTECODE(DeletePropertySloppy)
|
||||
|
||||
void MaglevGraphBuilder::VisitDeletePropertyStrict() {
|
||||
ValueNode* object = LoadRegisterTagged(0);
|
||||
ValueNode* key = GetAccumulatorTagged();
|
||||
ValueNode* context = GetContext();
|
||||
SetAccumulator(AddNewNode<DeleteProperty>({context, object, key},
|
||||
LanguageMode::kStrict));
|
||||
}
|
||||
|
||||
void MaglevGraphBuilder::VisitDeletePropertySloppy() {
|
||||
ValueNode* object = LoadRegisterTagged(0);
|
||||
ValueNode* key = GetAccumulatorTagged();
|
||||
ValueNode* context = GetContext();
|
||||
SetAccumulator(AddNewNode<DeleteProperty>({context, object, key},
|
||||
LanguageMode::kSloppy));
|
||||
}
|
||||
|
||||
void MaglevGraphBuilder::VisitGetSuperConstructor() {
|
||||
ValueNode* active_function = GetAccumulatorTagged();
|
||||
|
@ -164,6 +164,7 @@ class MaglevGraphVerifier {
|
||||
CheckValueInputIs(node, 0, ValueRepresentation::kTagged);
|
||||
CheckValueInputIs(node, 1, ValueRepresentation::kTagged);
|
||||
break;
|
||||
case Opcode::kDeleteProperty:
|
||||
case Opcode::kHasProperty:
|
||||
case Opcode::kLoadNamedFromSuperGeneric:
|
||||
case Opcode::kSetNamedGeneric:
|
||||
|
@ -738,6 +738,29 @@ void Constant::PrintParams(std::ostream& os,
|
||||
os << "(" << object_ << ")";
|
||||
}
|
||||
|
||||
void DeleteProperty::AllocateVreg(MaglevVregAllocationState* vreg_state) {
|
||||
using D = CallInterfaceDescriptorFor<Builtin::kDeleteProperty>::type;
|
||||
UseFixed(context(), kContextRegister);
|
||||
UseFixed(object(), D::GetRegisterParameter(D::kObject));
|
||||
UseFixed(key(), D::GetRegisterParameter(D::kKey));
|
||||
DefineAsFixed(vreg_state, this, kReturnRegister0);
|
||||
}
|
||||
void DeleteProperty::GenerateCode(MaglevCodeGenState* code_gen_state,
|
||||
const ProcessingState& state) {
|
||||
using D = CallInterfaceDescriptorFor<Builtin::kDeleteProperty>::type;
|
||||
DCHECK_EQ(ToRegister(context()), kContextRegister);
|
||||
DCHECK_EQ(ToRegister(object()), D::GetRegisterParameter(D::kObject));
|
||||
DCHECK_EQ(ToRegister(key()), D::GetRegisterParameter(D::kKey));
|
||||
__ Move(D::GetRegisterParameter(D::kLanguageMode),
|
||||
Smi::FromInt(static_cast<int>(mode())));
|
||||
__ CallBuiltin(Builtin::kDeleteProperty);
|
||||
code_gen_state->DefineLazyDeoptPoint(lazy_deopt_info());
|
||||
}
|
||||
void DeleteProperty::PrintParams(std::ostream& os,
|
||||
MaglevGraphLabeller* graph_labeller) const {
|
||||
os << "(" << LanguageMode2String(mode()) << ")";
|
||||
}
|
||||
|
||||
void HasProperty::AllocateVreg(MaglevVregAllocationState* vreg_state) {
|
||||
using D = CallInterfaceDescriptorFor<Builtin::kKeyedHasIC>::type;
|
||||
UseFixed(context(), kContextRegister);
|
||||
|
@ -129,6 +129,7 @@ class CompactInterpreterFrameState;
|
||||
V(CreateClosure) \
|
||||
V(FastCreateClosure) \
|
||||
V(CreateRegExpLiteral) \
|
||||
V(DeleteProperty) \
|
||||
V(HasProperty) \
|
||||
V(InitialValue) \
|
||||
V(LoadTaggedField) \
|
||||
@ -1700,6 +1701,30 @@ class ToNumberOrNumeric : public FixedInputValueNodeT<2, ToNumberOrNumeric> {
|
||||
const Object::Conversion mode_;
|
||||
};
|
||||
|
||||
class DeleteProperty : public FixedInputValueNodeT<3, DeleteProperty> {
|
||||
using Base = FixedInputValueNodeT<3, DeleteProperty>;
|
||||
|
||||
public:
|
||||
explicit DeleteProperty(uint64_t bitfield, LanguageMode mode)
|
||||
: Base(bitfield), mode_(mode) {}
|
||||
|
||||
// The implementation currently calls runtime.
|
||||
static constexpr OpProperties kProperties = OpProperties::JSCall();
|
||||
|
||||
Input& context() { return Node::input(0); }
|
||||
Input& object() { return Node::input(1); }
|
||||
Input& key() { return Node::input(2); }
|
||||
|
||||
LanguageMode mode() const { return mode_; }
|
||||
|
||||
void AllocateVreg(MaglevVregAllocationState*);
|
||||
void GenerateCode(MaglevCodeGenState*, const ProcessingState&);
|
||||
void PrintParams(std::ostream&, MaglevGraphLabeller*) const;
|
||||
|
||||
private:
|
||||
const LanguageMode mode_;
|
||||
};
|
||||
|
||||
class HasProperty : public FixedInputValueNodeT<3, HasProperty> {
|
||||
using Base = FixedInputValueNodeT<3, HasProperty>;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user