| Index: src/compiler/s390/code-generator-s390.cc
|
| diff --git a/src/compiler/s390/code-generator-s390.cc b/src/compiler/s390/code-generator-s390.cc
|
| index 8602c51d72a78d7d4a8e9224a32e7bab49b383cc..de6341cd6f824885c2bc17244e08a13c24bb9457 100644
|
| --- a/src/compiler/s390/code-generator-s390.cc
|
| +++ b/src/compiler/s390/code-generator-s390.cc
|
| @@ -237,15 +237,10 @@ Condition FlagsConditionToCondition(FlagsCondition condition, ArchOpcode op) {
|
| #if V8_TARGET_ARCH_S390X
|
| case kS390_Add:
|
| case kS390_Sub:
|
| - return lt;
|
| #endif
|
| case kS390_AddWithOverflow32:
|
| case kS390_SubWithOverflow32:
|
| -#if V8_TARGET_ARCH_S390X
|
| - return ne;
|
| -#else
|
| return lt;
|
| -#endif
|
| default:
|
| break;
|
| }
|
| @@ -255,15 +250,10 @@ Condition FlagsConditionToCondition(FlagsCondition condition, ArchOpcode op) {
|
| #if V8_TARGET_ARCH_S390X
|
| case kS390_Add:
|
| case kS390_Sub:
|
| - return ge;
|
| #endif
|
| case kS390_AddWithOverflow32:
|
| case kS390_SubWithOverflow32:
|
| -#if V8_TARGET_ARCH_S390X
|
| - return eq;
|
| -#else
|
| return ge;
|
| -#endif
|
| default:
|
| break;
|
| }
|
| @@ -333,16 +323,16 @@ Condition FlagsConditionToCondition(FlagsCondition condition, ArchOpcode op) {
|
| } while (0)
|
|
|
| #if V8_TARGET_ARCH_S390X
|
| -#define ASSEMBLE_ADD_WITH_OVERFLOW32() \
|
| - do { \
|
| - ASSEMBLE_BINOP(AddP, AddP); \
|
| - __ TestIfInt32(i.OutputRegister(), r0); \
|
| +#define ASSEMBLE_ADD_WITH_OVERFLOW32() \
|
| + do { \
|
| + ASSEMBLE_ADD_WITH_OVERFLOW(); \
|
| + __ LoadAndTestP_ExtendSrc(kScratchReg, kScratchReg); \
|
| } while (0)
|
|
|
| -#define ASSEMBLE_SUB_WITH_OVERFLOW32() \
|
| - do { \
|
| - ASSEMBLE_BINOP(SubP, SubP); \
|
| - __ TestIfInt32(i.OutputRegister(), r0); \
|
| +#define ASSEMBLE_SUB_WITH_OVERFLOW32() \
|
| + do { \
|
| + ASSEMBLE_SUB_WITH_OVERFLOW(); \
|
| + __ LoadAndTestP_ExtendSrc(kScratchReg, kScratchReg); \
|
| } while (0)
|
| #else
|
| #define ASSEMBLE_ADD_WITH_OVERFLOW32 ASSEMBLE_ADD_WITH_OVERFLOW
|
| @@ -462,7 +452,6 @@ Condition FlagsConditionToCondition(FlagsCondition condition, ArchOpcode op) {
|
| __ asm_instr(value, operand); \
|
| } while (0)
|
|
|
| -// TODO(mbrandy): fix paths that produce garbage in offset's upper 32-bits.
|
| #define ASSEMBLE_CHECKED_LOAD_FLOAT(asm_instr, width) \
|
| do { \
|
| DoubleRegister result = i.OutputDoubleRegister(); \
|
| @@ -470,7 +459,6 @@ Condition FlagsConditionToCondition(FlagsCondition condition, ArchOpcode op) {
|
| AddressingMode mode = kMode_None; \
|
| MemOperand operand = i.MemoryOperand(&mode, index); \
|
| Register offset = operand.rb(); \
|
| - __ lgfr(offset, offset); \
|
| if (HasRegisterInput(instr, 2)) { \
|
| __ CmpLogical32(offset, i.InputRegister(2)); \
|
| } else { \
|
| @@ -482,7 +470,6 @@ Condition FlagsConditionToCondition(FlagsCondition condition, ArchOpcode op) {
|
| __ bind(ool->exit()); \
|
| } while (0)
|
|
|
| -// TODO(mbrandy): fix paths that produce garbage in offset's upper 32-bits.
|
| #define ASSEMBLE_CHECKED_LOAD_INTEGER(asm_instr) \
|
| do { \
|
| Register result = i.OutputRegister(); \
|
| @@ -490,7 +477,6 @@ Condition FlagsConditionToCondition(FlagsCondition condition, ArchOpcode op) {
|
| AddressingMode mode = kMode_None; \
|
| MemOperand operand = i.MemoryOperand(&mode, index); \
|
| Register offset = operand.rb(); \
|
| - __ lgfr(offset, offset); \
|
| if (HasRegisterInput(instr, 2)) { \
|
| __ CmpLogical32(offset, i.InputRegister(2)); \
|
| } else { \
|
| @@ -502,7 +488,6 @@ Condition FlagsConditionToCondition(FlagsCondition condition, ArchOpcode op) {
|
| __ bind(ool->exit()); \
|
| } while (0)
|
|
|
| -// TODO(mbrandy): fix paths that produce garbage in offset's upper 32-bits.
|
| #define ASSEMBLE_CHECKED_STORE_FLOAT32() \
|
| do { \
|
| Label done; \
|
| @@ -510,7 +495,6 @@ Condition FlagsConditionToCondition(FlagsCondition condition, ArchOpcode op) {
|
| AddressingMode mode = kMode_None; \
|
| MemOperand operand = i.MemoryOperand(&mode, index); \
|
| Register offset = operand.rb(); \
|
| - __ lgfr(offset, offset); \
|
| if (HasRegisterInput(instr, 2)) { \
|
| __ CmpLogical32(offset, i.InputRegister(2)); \
|
| } else { \
|
| @@ -522,7 +506,6 @@ Condition FlagsConditionToCondition(FlagsCondition condition, ArchOpcode op) {
|
| __ bind(&done); \
|
| } while (0)
|
|
|
| -// TODO(mbrandy): fix paths that produce garbage in offset's upper 32-bits.
|
| #define ASSEMBLE_CHECKED_STORE_DOUBLE() \
|
| do { \
|
| Label done; \
|
| @@ -531,7 +514,6 @@ Condition FlagsConditionToCondition(FlagsCondition condition, ArchOpcode op) {
|
| MemOperand operand = i.MemoryOperand(&mode, index); \
|
| DCHECK_EQ(kMode_MRR, mode); \
|
| Register offset = operand.rb(); \
|
| - __ lgfr(offset, offset); \
|
| if (HasRegisterInput(instr, 2)) { \
|
| __ CmpLogical32(offset, i.InputRegister(2)); \
|
| } else { \
|
| @@ -543,7 +525,6 @@ Condition FlagsConditionToCondition(FlagsCondition condition, ArchOpcode op) {
|
| __ bind(&done); \
|
| } while (0)
|
|
|
| -// TODO(mbrandy): fix paths that produce garbage in offset's upper 32-bits.
|
| #define ASSEMBLE_CHECKED_STORE_INTEGER(asm_instr) \
|
| do { \
|
| Label done; \
|
| @@ -551,7 +532,6 @@ Condition FlagsConditionToCondition(FlagsCondition condition, ArchOpcode op) {
|
| AddressingMode mode = kMode_None; \
|
| MemOperand operand = i.MemoryOperand(&mode, index); \
|
| Register offset = operand.rb(); \
|
| - __ lgfr(offset, offset); \
|
| if (HasRegisterInput(instr, 2)) { \
|
| __ CmpLogical32(offset, i.InputRegister(2)); \
|
| } else { \
|
| @@ -1570,6 +1550,9 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) {
|
| case kS390_LoadWordS16:
|
| ASSEMBLE_LOAD_INTEGER(LoadHalfWordP);
|
| break;
|
| + case kS390_LoadWordU32:
|
| + ASSEMBLE_LOAD_INTEGER(LoadlW);
|
| + break;
|
| case kS390_LoadWordS32:
|
| ASSEMBLE_LOAD_INTEGER(LoadW);
|
| break;
|
| @@ -1622,7 +1605,7 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) {
|
| ASSEMBLE_CHECKED_LOAD_INTEGER(LoadLogicalHalfWordP);
|
| break;
|
| case kCheckedLoadWord32:
|
| - ASSEMBLE_CHECKED_LOAD_INTEGER(LoadW);
|
| + ASSEMBLE_CHECKED_LOAD_INTEGER(LoadlW);
|
| break;
|
| case kCheckedLoadWord64:
|
| #if V8_TARGET_ARCH_S390X
|
| @@ -1672,7 +1655,7 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) {
|
| __ LoadLogicalHalfWordP(i.OutputRegister(), i.MemoryOperand());
|
| break;
|
| case kAtomicLoadWord32:
|
| - __ Load(i.OutputRegister(), i.MemoryOperand());
|
| + __ LoadlW(i.OutputRegister(), i.MemoryOperand());
|
| break;
|
| default:
|
| UNREACHABLE();
|
| @@ -1774,7 +1757,7 @@ void CodeGenerator::AssembleArchLookupSwitch(Instruction* instr) {
|
| S390OperandConverter i(this, instr);
|
| Register input = i.InputRegister(0);
|
| for (size_t index = 2; index < instr->InputCount(); index += 2) {
|
| - __ CmpP(input, Operand(i.InputInt32(index + 0)));
|
| + __ Cmp32(input, Operand(i.InputInt32(index + 0)));
|
| __ beq(GetLabel(i.InputRpo(index + 1)));
|
| }
|
| AssembleArchJump(i.InputRpo(1));
|
|
|