Get rid of the HInstanceSize instruction.
R=mstarzinger@chromium.org Review URL: https://codereview.chromium.org/25666006 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@17116 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
067a266426
commit
eace510108
@ -1082,12 +1082,6 @@ LInstruction* LChunkBuilder::DoInstanceOfKnownGlobal(
|
||||
}
|
||||
|
||||
|
||||
LInstruction* LChunkBuilder::DoInstanceSize(HInstanceSize* instr) {
|
||||
LOperand* object = UseRegisterAtStart(instr->object());
|
||||
return DefineAsRegister(new(zone()) LInstanceSize(object));
|
||||
}
|
||||
|
||||
|
||||
LInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) {
|
||||
LOperand* receiver = UseRegisterAtStart(instr->receiver());
|
||||
LOperand* function = UseRegisterAtStart(instr->function());
|
||||
|
@ -105,7 +105,6 @@ class LCodeGen;
|
||||
V(InnerAllocatedObject) \
|
||||
V(InstanceOf) \
|
||||
V(InstanceOfKnownGlobal) \
|
||||
V(InstanceSize) \
|
||||
V(InstructionGap) \
|
||||
V(Integer32ToDouble) \
|
||||
V(Integer32ToSmi) \
|
||||
@ -1148,19 +1147,6 @@ class LInstanceOfKnownGlobal V8_FINAL : public LTemplateInstruction<1, 2, 1> {
|
||||
};
|
||||
|
||||
|
||||
class LInstanceSize V8_FINAL : public LTemplateInstruction<1, 1, 0> {
|
||||
public:
|
||||
explicit LInstanceSize(LOperand* object) {
|
||||
inputs_[0] = object;
|
||||
}
|
||||
|
||||
LOperand* object() { return inputs_[0]; }
|
||||
|
||||
DECLARE_CONCRETE_INSTRUCTION(InstanceSize, "instance-size")
|
||||
DECLARE_HYDROGEN_ACCESSOR(InstanceSize)
|
||||
};
|
||||
|
||||
|
||||
class LBoundsCheck V8_FINAL : public LTemplateInstruction<0, 2, 0> {
|
||||
public:
|
||||
LBoundsCheck(LOperand* index, LOperand* length) {
|
||||
|
@ -2847,14 +2847,6 @@ void LCodeGen::DoDeferredInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr,
|
||||
}
|
||||
|
||||
|
||||
void LCodeGen::DoInstanceSize(LInstanceSize* instr) {
|
||||
Register object = ToRegister(instr->object());
|
||||
Register result = ToRegister(instr->result());
|
||||
__ ldr(result, FieldMemOperand(object, HeapObject::kMapOffset));
|
||||
__ ldrb(result, FieldMemOperand(result, Map::kInstanceSizeOffset));
|
||||
}
|
||||
|
||||
|
||||
void LCodeGen::DoCmpT(LCmpT* instr) {
|
||||
ASSERT(ToRegister(instr->context()).is(cp));
|
||||
Token::Value op = instr->op();
|
||||
|
@ -434,7 +434,6 @@ Handle<Code> FastCloneShallowArrayStub::GenerateCode(Isolate* isolate) {
|
||||
|
||||
template <>
|
||||
HValue* CodeStubGraphBuilder<FastCloneShallowObjectStub>::BuildCodeStub() {
|
||||
Zone* zone = this->zone();
|
||||
HValue* undefined = graph()->GetConstantUndefined();
|
||||
|
||||
HInstruction* boilerplate = Add<HLoadKeyed>(GetParameter(0),
|
||||
@ -448,8 +447,10 @@ HValue* CodeStubGraphBuilder<FastCloneShallowObjectStub>::BuildCodeStub() {
|
||||
checker.And();
|
||||
|
||||
int size = JSObject::kHeaderSize + casted_stub()->length() * kPointerSize;
|
||||
HValue* boilerplate_size =
|
||||
AddInstruction(new(zone) HInstanceSize(boilerplate));
|
||||
HValue* boilerplate_map = Add<HLoadNamedField>(
|
||||
boilerplate, HObjectAccess::ForMap());
|
||||
HValue* boilerplate_size = Add<HLoadNamedField>(
|
||||
boilerplate_map, HObjectAccess::ForMapInstanceSize());
|
||||
HValue* size_in_words = Add<HConstant>(size >> kPointerSizeLog2);
|
||||
checker.If<HCompareNumericAndBranch>(boilerplate_size,
|
||||
size_in_words, Token::EQ);
|
||||
|
@ -126,7 +126,6 @@ class LChunkBuilder;
|
||||
V(InnerAllocatedObject) \
|
||||
V(InstanceOf) \
|
||||
V(InstanceOfKnownGlobal) \
|
||||
V(InstanceSize) \
|
||||
V(InvokeFunction) \
|
||||
V(IsConstructCallAndBranch) \
|
||||
V(IsObjectAndBranch) \
|
||||
@ -4473,26 +4472,6 @@ class HInstanceOfKnownGlobal V8_FINAL : public HTemplateInstruction<2> {
|
||||
};
|
||||
|
||||
|
||||
// TODO(mstarzinger): This instruction should be modeled as a load of the map
|
||||
// field followed by a load of the instance size field once HLoadNamedField is
|
||||
// flexible enough to accommodate byte-field loads.
|
||||
class HInstanceSize V8_FINAL : public HTemplateInstruction<1> {
|
||||
public:
|
||||
explicit HInstanceSize(HValue* object) {
|
||||
SetOperandAt(0, object);
|
||||
set_representation(Representation::Integer32());
|
||||
}
|
||||
|
||||
HValue* object() { return OperandAt(0); }
|
||||
|
||||
virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE {
|
||||
return Representation::Tagged();
|
||||
}
|
||||
|
||||
DECLARE_CONCRETE_INSTRUCTION(InstanceSize)
|
||||
};
|
||||
|
||||
|
||||
class HPower V8_FINAL : public HTemplateInstruction<2> {
|
||||
public:
|
||||
static HInstruction* New(Zone* zone,
|
||||
@ -5828,6 +5807,12 @@ class HObjectAccess V8_FINAL {
|
||||
return HObjectAccess(kMaps, JSObject::kMapOffset);
|
||||
}
|
||||
|
||||
static HObjectAccess ForMapInstanceSize() {
|
||||
return HObjectAccess(kInobject,
|
||||
Map::kInstanceSizeOffset,
|
||||
Representation::Byte());
|
||||
}
|
||||
|
||||
static HObjectAccess ForPropertyCellValue() {
|
||||
return HObjectAccess(kInobject, PropertyCell::kValueOffset);
|
||||
}
|
||||
|
@ -3003,14 +3003,6 @@ void LCodeGen::DoDeferredInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr,
|
||||
}
|
||||
|
||||
|
||||
void LCodeGen::DoInstanceSize(LInstanceSize* instr) {
|
||||
Register object = ToRegister(instr->object());
|
||||
Register result = ToRegister(instr->result());
|
||||
__ mov(result, FieldOperand(object, HeapObject::kMapOffset));
|
||||
__ movzx_b(result, FieldOperand(result, Map::kInstanceSizeOffset));
|
||||
}
|
||||
|
||||
|
||||
void LCodeGen::DoCmpT(LCmpT* instr) {
|
||||
Token::Value op = instr->op();
|
||||
|
||||
|
@ -1150,12 +1150,6 @@ LInstruction* LChunkBuilder::DoInstanceOfKnownGlobal(
|
||||
}
|
||||
|
||||
|
||||
LInstruction* LChunkBuilder::DoInstanceSize(HInstanceSize* instr) {
|
||||
LOperand* object = UseRegisterAtStart(instr->object());
|
||||
return DefineAsRegister(new(zone()) LInstanceSize(object));
|
||||
}
|
||||
|
||||
|
||||
LInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) {
|
||||
LOperand* receiver = UseRegister(instr->receiver());
|
||||
LOperand* function = UseRegisterAtStart(instr->function());
|
||||
|
@ -107,7 +107,6 @@ class LCodeGen;
|
||||
V(InnerAllocatedObject) \
|
||||
V(InstanceOf) \
|
||||
V(InstanceOfKnownGlobal) \
|
||||
V(InstanceSize) \
|
||||
V(InstructionGap) \
|
||||
V(Integer32ToDouble) \
|
||||
V(Integer32ToSmi) \
|
||||
@ -1131,19 +1130,6 @@ class LInstanceOfKnownGlobal V8_FINAL : public LTemplateInstruction<1, 2, 1> {
|
||||
};
|
||||
|
||||
|
||||
class LInstanceSize V8_FINAL : public LTemplateInstruction<1, 1, 0> {
|
||||
public:
|
||||
explicit LInstanceSize(LOperand* object) {
|
||||
inputs_[0] = object;
|
||||
}
|
||||
|
||||
LOperand* object() { return inputs_[0]; }
|
||||
|
||||
DECLARE_CONCRETE_INSTRUCTION(InstanceSize, "instance-size")
|
||||
DECLARE_HYDROGEN_ACCESSOR(InstanceSize)
|
||||
};
|
||||
|
||||
|
||||
class LBoundsCheck V8_FINAL : public LTemplateInstruction<0, 2, 0> {
|
||||
public:
|
||||
LBoundsCheck(LOperand* index, LOperand* length) {
|
||||
|
@ -2694,14 +2694,6 @@ void LCodeGen::DoDeferredInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr,
|
||||
}
|
||||
|
||||
|
||||
void LCodeGen::DoInstanceSize(LInstanceSize* instr) {
|
||||
Register object = ToRegister(instr->object());
|
||||
Register result = ToRegister(instr->result());
|
||||
__ lw(result, FieldMemOperand(object, HeapObject::kMapOffset));
|
||||
__ lbu(result, FieldMemOperand(result, Map::kInstanceSizeOffset));
|
||||
}
|
||||
|
||||
|
||||
void LCodeGen::DoCmpT(LCmpT* instr) {
|
||||
ASSERT(ToRegister(instr->context()).is(cp));
|
||||
Token::Value op = instr->op();
|
||||
|
@ -1082,12 +1082,6 @@ LInstruction* LChunkBuilder::DoInstanceOfKnownGlobal(
|
||||
}
|
||||
|
||||
|
||||
LInstruction* LChunkBuilder::DoInstanceSize(HInstanceSize* instr) {
|
||||
LOperand* object = UseRegisterAtStart(instr->object());
|
||||
return DefineAsRegister(new(zone()) LInstanceSize(object));
|
||||
}
|
||||
|
||||
|
||||
LInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) {
|
||||
LOperand* receiver = UseRegisterAtStart(instr->receiver());
|
||||
LOperand* function = UseRegisterAtStart(instr->function());
|
||||
|
@ -105,7 +105,6 @@ class LCodeGen;
|
||||
V(InnerAllocatedObject) \
|
||||
V(InstanceOf) \
|
||||
V(InstanceOfKnownGlobal) \
|
||||
V(InstanceSize) \
|
||||
V(InstructionGap) \
|
||||
V(Integer32ToDouble) \
|
||||
V(Integer32ToSmi) \
|
||||
@ -1143,19 +1142,6 @@ class LInstanceOfKnownGlobal V8_FINAL : public LTemplateInstruction<1, 2, 1> {
|
||||
};
|
||||
|
||||
|
||||
class LInstanceSize V8_FINAL : public LTemplateInstruction<1, 1, 0> {
|
||||
public:
|
||||
explicit LInstanceSize(LOperand* object) {
|
||||
inputs_[0] = object;
|
||||
}
|
||||
|
||||
LOperand* object() { return inputs_[0]; }
|
||||
|
||||
DECLARE_CONCRETE_INSTRUCTION(InstanceSize, "instance-size")
|
||||
DECLARE_HYDROGEN_ACCESSOR(InstanceSize)
|
||||
};
|
||||
|
||||
|
||||
class LBoundsCheck V8_FINAL : public LTemplateInstruction<0, 2, 0> {
|
||||
public:
|
||||
LBoundsCheck(LOperand* index, LOperand* length) {
|
||||
|
@ -2539,14 +2539,6 @@ void LCodeGen::DoDeferredInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr,
|
||||
}
|
||||
|
||||
|
||||
void LCodeGen::DoInstanceSize(LInstanceSize* instr) {
|
||||
Register object = ToRegister(instr->object());
|
||||
Register result = ToRegister(instr->result());
|
||||
__ movq(result, FieldOperand(object, HeapObject::kMapOffset));
|
||||
__ movzxbq(result, FieldOperand(result, Map::kInstanceSizeOffset));
|
||||
}
|
||||
|
||||
|
||||
void LCodeGen::DoCmpT(LCmpT* instr) {
|
||||
Token::Value op = instr->op();
|
||||
|
||||
|
@ -1077,12 +1077,6 @@ LInstruction* LChunkBuilder::DoInstanceOfKnownGlobal(
|
||||
}
|
||||
|
||||
|
||||
LInstruction* LChunkBuilder::DoInstanceSize(HInstanceSize* instr) {
|
||||
LOperand* object = UseRegisterAtStart(instr->object());
|
||||
return DefineAsRegister(new(zone()) LInstanceSize(object));
|
||||
}
|
||||
|
||||
|
||||
LInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) {
|
||||
LOperand* receiver = UseRegister(instr->receiver());
|
||||
LOperand* function = UseRegisterAtStart(instr->function());
|
||||
|
@ -105,7 +105,6 @@ class LCodeGen;
|
||||
V(InnerAllocatedObject) \
|
||||
V(InstanceOf) \
|
||||
V(InstanceOfKnownGlobal) \
|
||||
V(InstanceSize) \
|
||||
V(InstructionGap) \
|
||||
V(Integer32ToDouble) \
|
||||
V(Integer32ToSmi) \
|
||||
@ -1078,19 +1077,6 @@ class LInstanceOfKnownGlobal V8_FINAL : public LTemplateInstruction<1, 1, 1> {
|
||||
};
|
||||
|
||||
|
||||
class LInstanceSize V8_FINAL : public LTemplateInstruction<1, 1, 0> {
|
||||
public:
|
||||
explicit LInstanceSize(LOperand* object) {
|
||||
inputs_[0] = object;
|
||||
}
|
||||
|
||||
LOperand* object() { return inputs_[0]; }
|
||||
|
||||
DECLARE_CONCRETE_INSTRUCTION(InstanceSize, "instance-size")
|
||||
DECLARE_HYDROGEN_ACCESSOR(InstanceSize)
|
||||
};
|
||||
|
||||
|
||||
class LBoundsCheck V8_FINAL : public LTemplateInstruction<0, 2, 0> {
|
||||
public:
|
||||
LBoundsCheck(LOperand* index, LOperand* length) {
|
||||
|
Loading…
Reference in New Issue
Block a user