Revert "Add support to load/store byte fields." and "MIPS: Add support to load/store byte fields.".
This reverts commit r17079 and r17085. Will reland after fix. TBR=jkummerow@chromium.org Review URL: https://codereview.chromium.org/25679008 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@17099 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
36072e610c
commit
5e8c902991
@ -3042,12 +3042,7 @@ void LCodeGen::DoLoadNamedField(LLoadNamedField* instr) {
|
|||||||
|
|
||||||
if (access.IsExternalMemory()) {
|
if (access.IsExternalMemory()) {
|
||||||
Register result = ToRegister(instr->result());
|
Register result = ToRegister(instr->result());
|
||||||
MemOperand operand = MemOperand(object, offset);
|
__ ldr(result, MemOperand(object, offset));
|
||||||
if (access.representation().IsByte()) {
|
|
||||||
__ ldrb(result, operand);
|
|
||||||
} else {
|
|
||||||
__ ldr(result, operand);
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3058,15 +3053,11 @@ void LCodeGen::DoLoadNamedField(LLoadNamedField* instr) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Register result = ToRegister(instr->result());
|
Register result = ToRegister(instr->result());
|
||||||
if (!access.IsInobject()) {
|
if (access.IsInobject()) {
|
||||||
__ ldr(result, FieldMemOperand(object, JSObject::kPropertiesOffset));
|
__ ldr(result, FieldMemOperand(object, offset));
|
||||||
object = result;
|
|
||||||
}
|
|
||||||
MemOperand operand = FieldMemOperand(object, offset);
|
|
||||||
if (access.representation().IsByte()) {
|
|
||||||
__ ldrb(result, operand);
|
|
||||||
} else {
|
} else {
|
||||||
__ ldr(result, operand);
|
__ ldr(result, FieldMemOperand(object, JSObject::kPropertiesOffset));
|
||||||
|
__ ldr(result, FieldMemOperand(result, offset));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4172,12 +4163,7 @@ void LCodeGen::DoStoreNamedField(LStoreNamedField* instr) {
|
|||||||
|
|
||||||
if (access.IsExternalMemory()) {
|
if (access.IsExternalMemory()) {
|
||||||
Register value = ToRegister(instr->value());
|
Register value = ToRegister(instr->value());
|
||||||
MemOperand operand = MemOperand(object, offset);
|
__ str(value, MemOperand(object, offset));
|
||||||
if (representation.IsByte()) {
|
|
||||||
__ strb(value, operand);
|
|
||||||
} else {
|
|
||||||
__ str(value, operand);
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4222,12 +4208,7 @@ void LCodeGen::DoStoreNamedField(LStoreNamedField* instr) {
|
|||||||
instr->hydrogen()->value()->IsHeapObject()
|
instr->hydrogen()->value()->IsHeapObject()
|
||||||
? OMIT_SMI_CHECK : INLINE_SMI_CHECK;
|
? OMIT_SMI_CHECK : INLINE_SMI_CHECK;
|
||||||
if (access.IsInobject()) {
|
if (access.IsInobject()) {
|
||||||
MemOperand operand = FieldMemOperand(object, offset);
|
__ str(value, FieldMemOperand(object, offset));
|
||||||
if (representation.IsByte()) {
|
|
||||||
__ strb(value, operand);
|
|
||||||
} else {
|
|
||||||
__ str(value, operand);
|
|
||||||
}
|
|
||||||
if (instr->hydrogen()->NeedsWriteBarrier()) {
|
if (instr->hydrogen()->NeedsWriteBarrier()) {
|
||||||
// Update the write barrier for the object for in-object properties.
|
// Update the write barrier for the object for in-object properties.
|
||||||
__ RecordWriteField(object,
|
__ RecordWriteField(object,
|
||||||
@ -4241,12 +4222,7 @@ void LCodeGen::DoStoreNamedField(LStoreNamedField* instr) {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
__ ldr(scratch, FieldMemOperand(object, JSObject::kPropertiesOffset));
|
__ ldr(scratch, FieldMemOperand(object, JSObject::kPropertiesOffset));
|
||||||
MemOperand operand = FieldMemOperand(scratch, offset);
|
__ str(value, FieldMemOperand(scratch, offset));
|
||||||
if (representation.IsByte()) {
|
|
||||||
__ strb(value, operand);
|
|
||||||
} else {
|
|
||||||
__ str(value, operand);
|
|
||||||
}
|
|
||||||
if (instr->hydrogen()->NeedsWriteBarrier()) {
|
if (instr->hydrogen()->NeedsWriteBarrier()) {
|
||||||
// Update the write barrier for the properties array.
|
// Update the write barrier for the properties array.
|
||||||
// object is used as a scratch register.
|
// object is used as a scratch register.
|
||||||
|
@ -2829,9 +2829,6 @@ Range* HShl::InferRange(Zone* zone) {
|
|||||||
|
|
||||||
|
|
||||||
Range* HLoadNamedField::InferRange(Zone* zone) {
|
Range* HLoadNamedField::InferRange(Zone* zone) {
|
||||||
if (access().representation().IsByte()) {
|
|
||||||
return new(zone) Range(0, 255);
|
|
||||||
}
|
|
||||||
if (access().IsStringLength()) {
|
if (access().IsStringLength()) {
|
||||||
return new(zone) Range(0, String::kMaxLength);
|
return new(zone) Range(0, String::kMaxLength);
|
||||||
}
|
}
|
||||||
|
@ -5954,9 +5954,7 @@ class HLoadNamedField V8_FINAL : public HTemplateInstruction<1> {
|
|||||||
SetOperandAt(0, object);
|
SetOperandAt(0, object);
|
||||||
|
|
||||||
Representation representation = access.representation();
|
Representation representation = access.representation();
|
||||||
if (representation.IsByte()) {
|
if (representation.IsSmi()) {
|
||||||
set_representation(Representation::Integer32());
|
|
||||||
} else if (representation.IsSmi()) {
|
|
||||||
set_type(HType::Smi());
|
set_type(HType::Smi());
|
||||||
set_representation(representation);
|
set_representation(representation);
|
||||||
} else if (representation.IsDouble() ||
|
} else if (representation.IsDouble() ||
|
||||||
@ -6254,14 +6252,11 @@ class HStoreNamedField V8_FINAL : public HTemplateInstruction<3> {
|
|||||||
if (index == 0 && access().IsExternalMemory()) {
|
if (index == 0 && access().IsExternalMemory()) {
|
||||||
// object must be external in case of external memory access
|
// object must be external in case of external memory access
|
||||||
return Representation::External();
|
return Representation::External();
|
||||||
} else if (index == 1) {
|
} else if (index == 1 &&
|
||||||
if (field_representation().IsByte() ||
|
(field_representation().IsDouble() ||
|
||||||
field_representation().IsInteger32()) {
|
field_representation().IsSmi() ||
|
||||||
return Representation::Integer32();
|
field_representation().IsInteger32())) {
|
||||||
} else if (field_representation().IsDouble() ||
|
return field_representation();
|
||||||
field_representation().IsSmi()) {
|
|
||||||
return field_representation();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return Representation::Tagged();
|
return Representation::Tagged();
|
||||||
}
|
}
|
||||||
|
@ -3225,15 +3225,12 @@ void LCodeGen::DoLoadNamedField(LLoadNamedField* instr) {
|
|||||||
|
|
||||||
if (access.IsExternalMemory()) {
|
if (access.IsExternalMemory()) {
|
||||||
Register result = ToRegister(instr->result());
|
Register result = ToRegister(instr->result());
|
||||||
MemOperand operand = instr->object()->IsConstantOperand()
|
if (instr->object()->IsConstantOperand()) {
|
||||||
? MemOperand::StaticVariable(ToExternalReference(
|
ExternalReference external_reference = ToExternalReference(
|
||||||
LConstantOperand::cast(instr->object())))
|
LConstantOperand::cast(instr->object()));
|
||||||
: MemOperand(ToRegister(instr->object()), offset);
|
__ mov(result, MemOperand::StaticVariable(external_reference));
|
||||||
if (access.representation().IsByte()) {
|
|
||||||
ASSERT(instr->hydrogen()->representation().IsInteger32());
|
|
||||||
__ movzx_b(result, operand);
|
|
||||||
} else {
|
} else {
|
||||||
__ mov(result, operand);
|
__ mov(result, MemOperand(ToRegister(instr->object()), offset));
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -3252,15 +3249,11 @@ void LCodeGen::DoLoadNamedField(LLoadNamedField* instr) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Register result = ToRegister(instr->result());
|
Register result = ToRegister(instr->result());
|
||||||
if (!access.IsInobject()) {
|
if (access.IsInobject()) {
|
||||||
__ mov(result, FieldOperand(object, JSObject::kPropertiesOffset));
|
|
||||||
object = result;
|
|
||||||
}
|
|
||||||
if (access.representation().IsByte()) {
|
|
||||||
ASSERT(instr->hydrogen()->representation().IsInteger32());
|
|
||||||
__ movzx_b(result, FieldOperand(object, offset));
|
|
||||||
} else {
|
|
||||||
__ mov(result, FieldOperand(object, offset));
|
__ mov(result, FieldOperand(object, offset));
|
||||||
|
} else {
|
||||||
|
__ mov(result, FieldOperand(object, JSObject::kPropertiesOffset));
|
||||||
|
__ mov(result, FieldOperand(result, offset));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4436,18 +4429,10 @@ void LCodeGen::DoStoreNamedField(LStoreNamedField* instr) {
|
|||||||
: MemOperand(ToRegister(instr->object()), offset);
|
: MemOperand(ToRegister(instr->object()), offset);
|
||||||
if (instr->value()->IsConstantOperand()) {
|
if (instr->value()->IsConstantOperand()) {
|
||||||
LConstantOperand* operand_value = LConstantOperand::cast(instr->value());
|
LConstantOperand* operand_value = LConstantOperand::cast(instr->value());
|
||||||
if (representation.IsByte()) {
|
__ mov(operand, Immediate(ToInteger32(operand_value)));
|
||||||
__ mov_b(operand, ToInteger32(operand_value));
|
|
||||||
} else {
|
|
||||||
__ mov(operand, Immediate(ToInteger32(operand_value)));
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
Register value = ToRegister(instr->value());
|
Register value = ToRegister(instr->value());
|
||||||
if (representation.IsByte()) {
|
__ mov(operand, value);
|
||||||
__ mov_b(operand, value);
|
|
||||||
} else {
|
|
||||||
__ mov(operand, value);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -4520,28 +4505,17 @@ void LCodeGen::DoStoreNamedField(LStoreNamedField* instr) {
|
|||||||
__ mov(write_register, FieldOperand(object, JSObject::kPropertiesOffset));
|
__ mov(write_register, FieldOperand(object, JSObject::kPropertiesOffset));
|
||||||
}
|
}
|
||||||
|
|
||||||
MemOperand operand = FieldOperand(write_register, offset);
|
|
||||||
if (instr->value()->IsConstantOperand()) {
|
if (instr->value()->IsConstantOperand()) {
|
||||||
LConstantOperand* operand_value = LConstantOperand::cast(instr->value());
|
LConstantOperand* operand_value = LConstantOperand::cast(instr->value());
|
||||||
if (operand_value->IsRegister()) {
|
if (operand_value->IsRegister()) {
|
||||||
Register value = ToRegister(operand_value);
|
__ mov(FieldOperand(write_register, offset), ToRegister(operand_value));
|
||||||
if (representation.IsByte()) {
|
|
||||||
__ mov_b(operand, value);
|
|
||||||
} else {
|
|
||||||
__ mov(operand, value);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
Handle<Object> handle_value = ToHandle(operand_value);
|
Handle<Object> handle_value = ToHandle(operand_value);
|
||||||
ASSERT(!instr->hydrogen()->NeedsWriteBarrier());
|
ASSERT(!instr->hydrogen()->NeedsWriteBarrier());
|
||||||
__ mov(operand, handle_value);
|
__ mov(FieldOperand(write_register, offset), handle_value);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Register value = ToRegister(instr->value());
|
__ mov(FieldOperand(write_register, offset), ToRegister(instr->value()));
|
||||||
if (representation.IsByte()) {
|
|
||||||
__ mov_b(operand, value);
|
|
||||||
} else {
|
|
||||||
__ mov(operand, value);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (instr->hydrogen()->NeedsWriteBarrier()) {
|
if (instr->hydrogen()->NeedsWriteBarrier()) {
|
||||||
|
@ -2896,12 +2896,7 @@ void LCodeGen::DoLoadNamedField(LLoadNamedField* instr) {
|
|||||||
|
|
||||||
if (access.IsExternalMemory()) {
|
if (access.IsExternalMemory()) {
|
||||||
Register result = ToRegister(instr->result());
|
Register result = ToRegister(instr->result());
|
||||||
MemOperand operand = MemOperand(object, offset);
|
__ lw(result, MemOperand(object, offset));
|
||||||
if (access.representation().IsByte()) {
|
|
||||||
__ lb(result, operand);
|
|
||||||
} else {
|
|
||||||
__ lw(result, operand);
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2912,15 +2907,11 @@ void LCodeGen::DoLoadNamedField(LLoadNamedField* instr) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Register result = ToRegister(instr->result());
|
Register result = ToRegister(instr->result());
|
||||||
if (!access.IsInobject()) {
|
if (access.IsInobject()) {
|
||||||
__ lw(result, FieldMemOperand(object, JSObject::kPropertiesOffset));
|
__ lw(result, FieldMemOperand(object, offset));
|
||||||
object = result;
|
|
||||||
}
|
|
||||||
MemOperand operand = FieldMemOperand(object, offset);
|
|
||||||
if (access.representation().IsByte()) {
|
|
||||||
__ lb(result, operand);
|
|
||||||
} else {
|
} else {
|
||||||
__ lw(result, operand);
|
__ lw(result, FieldMemOperand(object, JSObject::kPropertiesOffset));
|
||||||
|
__ lw(result, FieldMemOperand(result, offset));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4084,12 +4075,7 @@ void LCodeGen::DoStoreNamedField(LStoreNamedField* instr) {
|
|||||||
|
|
||||||
if (access.IsExternalMemory()) {
|
if (access.IsExternalMemory()) {
|
||||||
Register value = ToRegister(instr->value());
|
Register value = ToRegister(instr->value());
|
||||||
MemOperand operand = MemOperand(object, offset);
|
__ sw(value, MemOperand(object, offset));
|
||||||
if (representation.IsByte()) {
|
|
||||||
__ sb(value, operand);
|
|
||||||
} else {
|
|
||||||
__ sw(value, operand);
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4134,12 +4120,7 @@ void LCodeGen::DoStoreNamedField(LStoreNamedField* instr) {
|
|||||||
instr->hydrogen()->value()->IsHeapObject()
|
instr->hydrogen()->value()->IsHeapObject()
|
||||||
? OMIT_SMI_CHECK : INLINE_SMI_CHECK;
|
? OMIT_SMI_CHECK : INLINE_SMI_CHECK;
|
||||||
if (access.IsInobject()) {
|
if (access.IsInobject()) {
|
||||||
MemOperand operand = FieldMemOperand(object, offset);
|
__ sw(value, FieldMemOperand(object, offset));
|
||||||
if (representation.IsByte()) {
|
|
||||||
__ sb(value, operand);
|
|
||||||
} else {
|
|
||||||
__ sw(value, operand);
|
|
||||||
}
|
|
||||||
if (instr->hydrogen()->NeedsWriteBarrier()) {
|
if (instr->hydrogen()->NeedsWriteBarrier()) {
|
||||||
// Update the write barrier for the object for in-object properties.
|
// Update the write barrier for the object for in-object properties.
|
||||||
__ RecordWriteField(object,
|
__ RecordWriteField(object,
|
||||||
@ -4153,12 +4134,7 @@ void LCodeGen::DoStoreNamedField(LStoreNamedField* instr) {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
__ lw(scratch, FieldMemOperand(object, JSObject::kPropertiesOffset));
|
__ lw(scratch, FieldMemOperand(object, JSObject::kPropertiesOffset));
|
||||||
MemOperand operand = FieldMemOperand(scratch, offset);
|
__ sw(value, FieldMemOperand(scratch, offset));
|
||||||
if (representation.IsByte()) {
|
|
||||||
__ sb(value, operand);
|
|
||||||
} else {
|
|
||||||
__ sw(value, operand);
|
|
||||||
}
|
|
||||||
if (instr->hydrogen()->NeedsWriteBarrier()) {
|
if (instr->hydrogen()->NeedsWriteBarrier()) {
|
||||||
// Update the write barrier for the properties array.
|
// Update the write barrier for the properties array.
|
||||||
// object is used as a scratch register.
|
// object is used as a scratch register.
|
||||||
|
@ -82,7 +82,6 @@ class Representation {
|
|||||||
public:
|
public:
|
||||||
enum Kind {
|
enum Kind {
|
||||||
kNone,
|
kNone,
|
||||||
kByte,
|
|
||||||
kSmi,
|
kSmi,
|
||||||
kInteger32,
|
kInteger32,
|
||||||
kDouble,
|
kDouble,
|
||||||
@ -96,7 +95,6 @@ class Representation {
|
|||||||
|
|
||||||
static Representation None() { return Representation(kNone); }
|
static Representation None() { return Representation(kNone); }
|
||||||
static Representation Tagged() { return Representation(kTagged); }
|
static Representation Tagged() { return Representation(kTagged); }
|
||||||
static Representation Byte() { return Representation(kByte); }
|
|
||||||
static Representation Smi() { return Representation(kSmi); }
|
static Representation Smi() { return Representation(kSmi); }
|
||||||
static Representation Integer32() { return Representation(kInteger32); }
|
static Representation Integer32() { return Representation(kInteger32); }
|
||||||
static Representation Double() { return Representation(kDouble); }
|
static Representation Double() { return Representation(kDouble); }
|
||||||
@ -141,7 +139,6 @@ class Representation {
|
|||||||
|
|
||||||
Kind kind() const { return static_cast<Kind>(kind_); }
|
Kind kind() const { return static_cast<Kind>(kind_); }
|
||||||
bool IsNone() const { return kind_ == kNone; }
|
bool IsNone() const { return kind_ == kNone; }
|
||||||
bool IsByte() const { return kind_ == kByte; }
|
|
||||||
bool IsTagged() const { return kind_ == kTagged; }
|
bool IsTagged() const { return kind_ == kTagged; }
|
||||||
bool IsSmi() const { return kind_ == kSmi; }
|
bool IsSmi() const { return kind_ == kSmi; }
|
||||||
bool IsSmiOrTagged() const { return IsSmi() || IsTagged(); }
|
bool IsSmiOrTagged() const { return IsSmi() || IsTagged(); }
|
||||||
@ -151,7 +148,7 @@ class Representation {
|
|||||||
bool IsHeapObject() const { return kind_ == kHeapObject; }
|
bool IsHeapObject() const { return kind_ == kHeapObject; }
|
||||||
bool IsExternal() const { return kind_ == kExternal; }
|
bool IsExternal() const { return kind_ == kExternal; }
|
||||||
bool IsSpecialization() const {
|
bool IsSpecialization() const {
|
||||||
return IsByte() || IsSmi() || IsInteger32() || IsDouble();
|
return kind_ == kInteger32 || kind_ == kDouble || kind_ == kSmi;
|
||||||
}
|
}
|
||||||
const char* Mnemonic() const;
|
const char* Mnemonic() const;
|
||||||
|
|
||||||
|
@ -2725,13 +2725,14 @@ void LCodeGen::DoLoadNamedField(LLoadNamedField* instr) {
|
|||||||
int offset = access.offset();
|
int offset = access.offset();
|
||||||
|
|
||||||
if (access.IsExternalMemory()) {
|
if (access.IsExternalMemory()) {
|
||||||
|
ASSERT(!access.representation().IsInteger32());
|
||||||
Register result = ToRegister(instr->result());
|
Register result = ToRegister(instr->result());
|
||||||
if (instr->object()->IsConstantOperand()) {
|
if (instr->object()->IsConstantOperand()) {
|
||||||
ASSERT(result.is(rax));
|
ASSERT(result.is(rax));
|
||||||
__ load_rax(ToExternalReference(LConstantOperand::cast(instr->object())));
|
__ load_rax(ToExternalReference(LConstantOperand::cast(instr->object())));
|
||||||
} else {
|
} else {
|
||||||
Register object = ToRegister(instr->object());
|
Register object = ToRegister(instr->object());
|
||||||
__ Load(result, MemOperand(object, offset), access.representation());
|
__ movq(result, MemOperand(object, offset));
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -2745,11 +2746,20 @@ void LCodeGen::DoLoadNamedField(LLoadNamedField* instr) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Register result = ToRegister(instr->result());
|
Register result = ToRegister(instr->result());
|
||||||
if (!access.IsInobject()) {
|
if (access.IsInobject()) {
|
||||||
|
if (access.representation().IsInteger32()) {
|
||||||
|
__ movl(result, FieldOperand(object, offset));
|
||||||
|
} else {
|
||||||
|
__ movq(result, FieldOperand(object, offset));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
__ movq(result, FieldOperand(object, JSObject::kPropertiesOffset));
|
__ movq(result, FieldOperand(object, JSObject::kPropertiesOffset));
|
||||||
object = result;
|
if (access.representation().IsInteger32()) {
|
||||||
|
__ movl(result, FieldOperand(result, offset));
|
||||||
|
} else {
|
||||||
|
__ movq(result, FieldOperand(result, offset));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
__ Load(result, FieldOperand(object, offset), access.representation());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -3871,16 +3881,16 @@ void LCodeGen::DoStoreNamedField(LStoreNamedField* instr) {
|
|||||||
int offset = access.offset();
|
int offset = access.offset();
|
||||||
|
|
||||||
if (access.IsExternalMemory()) {
|
if (access.IsExternalMemory()) {
|
||||||
|
ASSERT(!access.representation().IsInteger32());
|
||||||
ASSERT(!instr->hydrogen()->NeedsWriteBarrier());
|
ASSERT(!instr->hydrogen()->NeedsWriteBarrier());
|
||||||
Register value = ToRegister(instr->value());
|
Register value = ToRegister(instr->value());
|
||||||
if (instr->object()->IsConstantOperand()) {
|
if (instr->object()->IsConstantOperand()) {
|
||||||
ASSERT(value.is(rax));
|
ASSERT(value.is(rax));
|
||||||
ASSERT(!access.representation().IsSpecialization());
|
|
||||||
LConstantOperand* object = LConstantOperand::cast(instr->object());
|
LConstantOperand* object = LConstantOperand::cast(instr->object());
|
||||||
__ store_rax(ToExternalReference(object));
|
__ store_rax(ToExternalReference(object));
|
||||||
} else {
|
} else {
|
||||||
Register object = ToRegister(instr->object());
|
Register object = ToRegister(instr->object());
|
||||||
__ Store(MemOperand(object, offset), value, representation);
|
__ movq(MemOperand(object, offset), value);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -3949,16 +3959,24 @@ void LCodeGen::DoStoreNamedField(LStoreNamedField* instr) {
|
|||||||
if (instr->value()->IsConstantOperand()) {
|
if (instr->value()->IsConstantOperand()) {
|
||||||
LConstantOperand* operand_value = LConstantOperand::cast(instr->value());
|
LConstantOperand* operand_value = LConstantOperand::cast(instr->value());
|
||||||
if (operand_value->IsRegister()) {
|
if (operand_value->IsRegister()) {
|
||||||
Register value = ToRegister(operand_value);
|
if (access.representation().IsInteger32()) {
|
||||||
__ Store(FieldOperand(write_register, offset), value, representation);
|
__ movl(FieldOperand(write_register, offset),
|
||||||
|
ToRegister(operand_value));
|
||||||
|
} else {
|
||||||
|
__ movq(FieldOperand(write_register, offset),
|
||||||
|
ToRegister(operand_value));
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
Handle<Object> handle_value = ToHandle(operand_value);
|
Handle<Object> handle_value = ToHandle(operand_value);
|
||||||
ASSERT(!instr->hydrogen()->NeedsWriteBarrier());
|
ASSERT(!instr->hydrogen()->NeedsWriteBarrier());
|
||||||
__ Move(FieldOperand(write_register, offset), handle_value);
|
__ Move(FieldOperand(write_register, offset), handle_value);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Register value = ToRegister(instr->value());
|
if (access.representation().IsInteger32()) {
|
||||||
__ Store(FieldOperand(write_register, offset), value, representation);
|
__ movl(FieldOperand(write_register, offset), ToRegister(instr->value()));
|
||||||
|
} else {
|
||||||
|
__ movq(FieldOperand(write_register, offset), ToRegister(instr->value()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (instr->hydrogen()->NeedsWriteBarrier()) {
|
if (instr->hydrogen()->NeedsWriteBarrier()) {
|
||||||
|
@ -2060,14 +2060,7 @@ LInstruction* LChunkBuilder::DoStoreContextSlot(HStoreContextSlot* instr) {
|
|||||||
|
|
||||||
|
|
||||||
LInstruction* LChunkBuilder::DoLoadNamedField(HLoadNamedField* instr) {
|
LInstruction* LChunkBuilder::DoLoadNamedField(HLoadNamedField* instr) {
|
||||||
// Use the special mov rax, moffs64 encoding for external
|
if (instr->access().IsExternalMemory() && instr->access().offset() == 0) {
|
||||||
// memory accesses with 64-bit word-sized values.
|
|
||||||
if (instr->access().IsExternalMemory() &&
|
|
||||||
instr->access().offset() == 0 &&
|
|
||||||
(instr->access().representation().IsSmi() ||
|
|
||||||
instr->access().representation().IsTagged() ||
|
|
||||||
instr->access().representation().IsHeapObject() ||
|
|
||||||
instr->access().representation().IsExternal())) {
|
|
||||||
LOperand* obj = UseRegisterOrConstantAtStart(instr->object());
|
LOperand* obj = UseRegisterOrConstantAtStart(instr->object());
|
||||||
return DefineFixed(new(zone()) LLoadNamedField(obj), rax);
|
return DefineFixed(new(zone()) LLoadNamedField(obj), rax);
|
||||||
}
|
}
|
||||||
|
@ -947,28 +947,6 @@ void MacroAssembler::Cvtlsi2sd(XMMRegister dst, const Operand& src) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void MacroAssembler::Load(Register dst, const Operand& src, Representation r) {
|
|
||||||
if (r.IsByte()) {
|
|
||||||
movzxbl(dst, src);
|
|
||||||
} else if (r.IsInteger32()) {
|
|
||||||
movl(dst, src);
|
|
||||||
} else {
|
|
||||||
movq(dst, src);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void MacroAssembler::Store(const Operand& dst, Register src, Representation r) {
|
|
||||||
if (r.IsByte()) {
|
|
||||||
movb(dst, src);
|
|
||||||
} else if (r.IsInteger32()) {
|
|
||||||
movl(dst, src);
|
|
||||||
} else {
|
|
||||||
movq(dst, src);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void MacroAssembler::Set(Register dst, int64_t x) {
|
void MacroAssembler::Set(Register dst, int64_t x) {
|
||||||
if (x == 0) {
|
if (x == 0) {
|
||||||
xorl(dst, dst);
|
xorl(dst, dst);
|
||||||
|
@ -781,10 +781,6 @@ class MacroAssembler: public Assembler {
|
|||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
// Macro instructions.
|
// Macro instructions.
|
||||||
|
|
||||||
// Load/store with specific representation.
|
|
||||||
void Load(Register dst, const Operand& src, Representation r);
|
|
||||||
void Store(const Operand& dst, Register src, Representation r);
|
|
||||||
|
|
||||||
// Load a register with a long value as efficiently as possible.
|
// Load a register with a long value as efficiently as possible.
|
||||||
void Set(Register dst, int64_t x);
|
void Set(Register dst, int64_t x);
|
||||||
void Set(const Operand& dst, int64_t x);
|
void Set(const Operand& dst, int64_t x);
|
||||||
|
Loading…
Reference in New Issue
Block a user