Index: src/ia32/lithium-codegen-ia32.cc |
diff --git a/src/ia32/lithium-codegen-ia32.cc b/src/ia32/lithium-codegen-ia32.cc |
index 86118ebf6bdbeeb185b7aec0a762389dcc9da356..8f157f277ea0386fc102eb7aafec530a4668bf0d 100644 |
--- a/src/ia32/lithium-codegen-ia32.cc |
+++ b/src/ia32/lithium-codegen-ia32.cc |
@@ -3415,7 +3415,8 @@ void LCodeGen::DoLoadKeyedExternalArray(LLoadKeyed* instr) { |
elements_kind, |
0, |
instr->additional_index())); |
- if (elements_kind == EXTERNAL_FLOAT_ELEMENTS) { |
+ if (elements_kind == EXTERNAL_FLOAT_ELEMENTS || |
+ elements_kind == FLOAT32_ELEMENTS) { |
if (CpuFeatures::IsSupported(SSE2)) { |
CpuFeatureScope scope(masm(), SSE2); |
XMMRegister result(ToDoubleRegister(instr->result())); |
@@ -3424,7 +3425,8 @@ void LCodeGen::DoLoadKeyedExternalArray(LLoadKeyed* instr) { |
} else { |
X87Mov(ToX87Register(instr->result()), operand, kX87FloatOperand); |
} |
- } else if (elements_kind == EXTERNAL_DOUBLE_ELEMENTS) { |
+ } else if (elements_kind == EXTERNAL_DOUBLE_ELEMENTS || |
+ elements_kind == FLOAT64_ELEMENTS) { |
if (CpuFeatures::IsSupported(SSE2)) { |
CpuFeatureScope scope(masm(), SSE2); |
__ movsd(ToDoubleRegister(instr->result()), operand); |
@@ -3435,22 +3437,29 @@ void LCodeGen::DoLoadKeyedExternalArray(LLoadKeyed* instr) { |
Register result(ToRegister(instr->result())); |
switch (elements_kind) { |
case EXTERNAL_BYTE_ELEMENTS: |
+ case INT8_ELEMENTS: |
__ movsx_b(result, operand); |
break; |
case EXTERNAL_PIXEL_ELEMENTS: |
case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: |
+ case UINT8_ELEMENTS: |
+ case UINT8_CLAMPED_ELEMENTS: |
__ movzx_b(result, operand); |
break; |
case EXTERNAL_SHORT_ELEMENTS: |
+ case INT16_ELEMENTS: |
__ movsx_w(result, operand); |
break; |
case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: |
+ case UINT16_ELEMENTS: |
__ movzx_w(result, operand); |
break; |
case EXTERNAL_INT_ELEMENTS: |
+ case INT32_ELEMENTS: |
__ mov(result, operand); |
break; |
case EXTERNAL_UNSIGNED_INT_ELEMENTS: |
+ case UINT32_ELEMENTS: |
__ mov(result, operand); |
if (!instr->hydrogen()->CheckFlag(HInstruction::kUint32)) { |
__ test(result, Operand(result)); |
@@ -3459,6 +3468,8 @@ void LCodeGen::DoLoadKeyedExternalArray(LLoadKeyed* instr) { |
break; |
case EXTERNAL_FLOAT_ELEMENTS: |
case EXTERNAL_DOUBLE_ELEMENTS: |
+ case FLOAT32_ELEMENTS: |
+ case FLOAT64_ELEMENTS: |
case FAST_SMI_ELEMENTS: |
case FAST_ELEMENTS: |
case FAST_DOUBLE_ELEMENTS: |
@@ -3531,7 +3542,7 @@ void LCodeGen::DoLoadKeyedFixedArray(LLoadKeyed* instr) { |
void LCodeGen::DoLoadKeyed(LLoadKeyed* instr) { |
- if (instr->is_external()) { |
+ if (instr->is_external() || instr->is_fixed_typed_array()) { |
DoLoadKeyedExternalArray(instr); |
} else if (instr->hydrogen()->representation().IsDouble()) { |
DoLoadKeyedFixedDoubleArray(instr); |
@@ -3550,6 +3561,9 @@ Operand LCodeGen::BuildFastArrayOperand( |
uint32_t additional_index) { |
Register elements_pointer_reg = ToRegister(elements_pointer); |
int element_shift_size = ElementsKindToShiftSize(elements_kind); |
+ if (IsFixedTypedArrayElementsKind(elements_kind)) { |
+ offset += FixedTypedArrayBase::kDataOffset - kHeapObjectTag; |
+ } |
int shift_size = element_shift_size; |
if (key->IsConstantOperand()) { |
int constant_value = ToInteger32(LConstantOperand::cast(key)); |
@@ -4550,7 +4564,8 @@ void LCodeGen::DoStoreKeyedExternalArray(LStoreKeyed* instr) { |
elements_kind, |
0, |
instr->additional_index())); |
- if (elements_kind == EXTERNAL_FLOAT_ELEMENTS) { |
+ if (elements_kind == EXTERNAL_FLOAT_ELEMENTS || |
+ elements_kind == FLOAT32_ELEMENTS) { |
if (CpuFeatures::IsSafeForSnapshot(SSE2)) { |
CpuFeatureScope scope(masm(), SSE2); |
XMMRegister xmm_scratch = double_scratch0(); |
@@ -4560,7 +4575,8 @@ void LCodeGen::DoStoreKeyedExternalArray(LStoreKeyed* instr) { |
__ fld(0); |
__ fstp_s(operand); |
} |
- } else if (elements_kind == EXTERNAL_DOUBLE_ELEMENTS) { |
+ } else if (elements_kind == EXTERNAL_DOUBLE_ELEMENTS || |
+ elements_kind == FLOAT64_ELEMENTS) { |
if (CpuFeatures::IsSafeForSnapshot(SSE2)) { |
CpuFeatureScope scope(masm(), SSE2); |
__ movsd(operand, ToDoubleRegister(instr->value())); |
@@ -4573,18 +4589,27 @@ void LCodeGen::DoStoreKeyedExternalArray(LStoreKeyed* instr) { |
case EXTERNAL_PIXEL_ELEMENTS: |
case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: |
case EXTERNAL_BYTE_ELEMENTS: |
+ case UINT8_ELEMENTS: |
+ case INT8_ELEMENTS: |
+ case UINT8_CLAMPED_ELEMENTS: |
__ mov_b(operand, value); |
break; |
case EXTERNAL_SHORT_ELEMENTS: |
case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: |
+ case UINT16_ELEMENTS: |
+ case INT16_ELEMENTS: |
__ mov_w(operand, value); |
break; |
case EXTERNAL_INT_ELEMENTS: |
case EXTERNAL_UNSIGNED_INT_ELEMENTS: |
+ case UINT32_ELEMENTS: |
+ case INT32_ELEMENTS: |
__ mov(operand, value); |
break; |
case EXTERNAL_FLOAT_ELEMENTS: |
case EXTERNAL_DOUBLE_ELEMENTS: |
+ case FLOAT32_ELEMENTS: |
+ case FLOAT64_ELEMENTS: |
case FAST_SMI_ELEMENTS: |
case FAST_ELEMENTS: |
case FAST_DOUBLE_ELEMENTS: |
@@ -4722,7 +4747,7 @@ void LCodeGen::DoStoreKeyedFixedArray(LStoreKeyed* instr) { |
void LCodeGen::DoStoreKeyed(LStoreKeyed* instr) { |
// By cases...external, fast-double, fast |
- if (instr->is_external()) { |
+ if (instr->is_external() || instr->is_fixed_typed_array()) { |
DoStoreKeyedExternalArray(instr); |
} else if (instr->hydrogen()->value()->representation().IsDouble()) { |
DoStoreKeyedFixedDoubleArray(instr); |