| Index: src/crankshaft/s390/lithium-codegen-s390.cc
|
| diff --git a/src/crankshaft/s390/lithium-codegen-s390.cc b/src/crankshaft/s390/lithium-codegen-s390.cc
|
| index 484c5b3b3c6eaa4c9b38fcea186ee78ca46c4ee4..2950d96a7edb1e051ef6420696048e7ff6e9299f 100644
|
| --- a/src/crankshaft/s390/lithium-codegen-s390.cc
|
| +++ b/src/crankshaft/s390/lithium-codegen-s390.cc
|
| @@ -2870,6 +2870,7 @@ void LCodeGen::DoLoadKeyedExternalArray(LLoadKeyed* instr) {
|
| }
|
| int element_size_shift = ElementsKindToShiftSize(elements_kind);
|
| bool key_is_smi = instr->hydrogen()->key()->representation().IsSmi();
|
| + bool keyMaybeNegative = instr->hydrogen()->IsDehoisted();
|
| int base_offset = instr->base_offset();
|
| bool use_scratch = false;
|
|
|
| @@ -2883,7 +2884,8 @@ void LCodeGen::DoLoadKeyedExternalArray(LLoadKeyed* instr) {
|
| use_scratch = true;
|
| }
|
| } else {
|
| - __ IndexToArrayOffset(scratch0(), key, element_size_shift, key_is_smi);
|
| + __ IndexToArrayOffset(scratch0(), key, element_size_shift, key_is_smi,
|
| + keyMaybeNegative);
|
| use_scratch = true;
|
| }
|
| if (elements_kind == FLOAT32_ELEMENTS) {
|
| @@ -2903,7 +2905,8 @@ void LCodeGen::DoLoadKeyedExternalArray(LLoadKeyed* instr) {
|
| Register result = ToRegister(instr->result());
|
| MemOperand mem_operand =
|
| PrepareKeyedOperand(key, external_pointer, key_is_constant, key_is_smi,
|
| - constant_key, element_size_shift, base_offset);
|
| + constant_key, element_size_shift, base_offset,
|
| + keyMaybeNegative);
|
| switch (elements_kind) {
|
| case INT8_ELEMENTS:
|
| __ LoadB(result, mem_operand);
|
| @@ -2957,6 +2960,7 @@ void LCodeGen::DoLoadKeyedFixedDoubleArray(LLoadKeyed* instr) {
|
|
|
| int element_size_shift = ElementsKindToShiftSize(FAST_DOUBLE_ELEMENTS);
|
| bool key_is_smi = instr->hydrogen()->key()->representation().IsSmi();
|
| + bool keyMaybeNegative = instr->hydrogen()->IsDehoisted();
|
| int constant_key = 0;
|
| if (key_is_constant) {
|
| constant_key = ToInteger32(LConstantOperand::cast(instr->key()));
|
| @@ -2971,7 +2975,8 @@ void LCodeGen::DoLoadKeyedFixedDoubleArray(LLoadKeyed* instr) {
|
| intptr_t base_offset = instr->base_offset() + constant_key * kDoubleSize;
|
| if (!key_is_constant) {
|
| use_scratch = true;
|
| - __ IndexToArrayOffset(scratch, key, element_size_shift, key_is_smi);
|
| + __ IndexToArrayOffset(scratch, key, element_size_shift, key_is_smi,
|
| + keyMaybeNegative);
|
| }
|
|
|
| // Memory references support up to 20-bits signed displacement in RXY form
|
| @@ -3093,7 +3098,8 @@ MemOperand LCodeGen::PrepareKeyedOperand(Register key, Register base,
|
| bool key_is_constant, bool key_is_smi,
|
| int constant_key,
|
| int element_size_shift,
|
| - int base_offset) {
|
| + int base_offset,
|
| + bool keyMaybeNegative) {
|
| Register scratch = scratch0();
|
|
|
| if (key_is_constant) {
|
| @@ -3111,7 +3117,8 @@ MemOperand LCodeGen::PrepareKeyedOperand(Register key, Register base,
|
| (element_size_shift != (key_is_smi ? kSmiTagSize + kSmiShiftSize : 0));
|
|
|
| if (needs_shift) {
|
| - __ IndexToArrayOffset(scratch, key, element_size_shift, key_is_smi);
|
| + __ IndexToArrayOffset(scratch, key, element_size_shift, key_is_smi,
|
| + keyMaybeNegative);
|
| } else {
|
| scratch = key;
|
| }
|
| @@ -4050,6 +4057,7 @@ void LCodeGen::DoStoreKeyedExternalArray(LStoreKeyed* instr) {
|
| }
|
| int element_size_shift = ElementsKindToShiftSize(elements_kind);
|
| bool key_is_smi = instr->hydrogen()->key()->representation().IsSmi();
|
| + bool keyMaybeNegative = instr->hydrogen()->IsDehoisted();
|
| int base_offset = instr->base_offset();
|
|
|
| if (elements_kind == FLOAT32_ELEMENTS || elements_kind == FLOAT64_ELEMENTS) {
|
| @@ -4069,7 +4077,8 @@ void LCodeGen::DoStoreKeyedExternalArray(LStoreKeyed* instr) {
|
| address = external_pointer;
|
| }
|
| } else {
|
| - __ IndexToArrayOffset(address, key, element_size_shift, key_is_smi);
|
| + __ IndexToArrayOffset(address, key, element_size_shift, key_is_smi,
|
| + keyMaybeNegative);
|
| __ AddP(address, external_pointer);
|
| }
|
| if (elements_kind == FLOAT32_ELEMENTS) {
|
| @@ -4082,7 +4091,8 @@ void LCodeGen::DoStoreKeyedExternalArray(LStoreKeyed* instr) {
|
| Register value(ToRegister(instr->value()));
|
| MemOperand mem_operand =
|
| PrepareKeyedOperand(key, external_pointer, key_is_constant, key_is_smi,
|
| - constant_key, element_size_shift, base_offset);
|
| + constant_key, element_size_shift, base_offset,
|
| + keyMaybeNegative);
|
| switch (elements_kind) {
|
| case UINT8_ELEMENTS:
|
| case UINT8_CLAMPED_ELEMENTS:
|
| @@ -4150,6 +4160,7 @@ void LCodeGen::DoStoreKeyedFixedDoubleArray(LStoreKeyed* instr) {
|
| }
|
| int element_size_shift = ElementsKindToShiftSize(FAST_DOUBLE_ELEMENTS);
|
| bool key_is_smi = instr->hydrogen()->key()->representation().IsSmi();
|
| + bool keyMaybeNegative = instr->hydrogen()->IsDehoisted();
|
| int base_offset = instr->base_offset() + constant_key * kDoubleSize;
|
| bool use_scratch = false;
|
| intptr_t address_offset = base_offset;
|
| @@ -4163,7 +4174,8 @@ void LCodeGen::DoStoreKeyedFixedDoubleArray(LStoreKeyed* instr) {
|
| }
|
| } else {
|
| use_scratch = true;
|
| - __ IndexToArrayOffset(scratch, key, element_size_shift, key_is_smi);
|
| + __ IndexToArrayOffset(scratch, key, element_size_shift, key_is_smi,
|
| + keyMaybeNegative);
|
| // Memory references support up to 20-bits signed displacement in RXY form
|
| if (!is_int20((address_offset))) {
|
| __ AddP(scratch, Operand(address_offset));
|
|
|