| 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 dfe390aa62bda7e33eb958eafe9f6d3f274de495..843441cee6de37dfd5f3b29ab98006ae47ac5c20 100644
|
| --- a/src/compiler/s390/code-generator-s390.cc
|
| +++ b/src/compiler/s390/code-generator-s390.cc
|
| @@ -808,7 +808,8 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
|
| break;
|
| case kS390_ShiftLeft32:
|
| if (HasRegisterInput(instr, 1)) {
|
| - if (i.OutputRegister().is(i.InputRegister(1))) {
|
| + if (i.OutputRegister().is(i.InputRegister(1)) &&
|
| + !CpuFeatures::IsSupported(DISTINCT_OPS)) {
|
| __ LoadRR(kScratchReg, i.InputRegister(1));
|
| __ ShiftLeft(i.OutputRegister(), i.InputRegister(0), kScratchReg);
|
| } else {
|
| @@ -817,9 +818,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
|
| } else {
|
| ASSEMBLE_BINOP(ShiftLeft, ShiftLeft);
|
| }
|
| -#if V8_TARGET_ARCH_S390X
|
| - __ lgfr(i.OutputRegister(0), i.OutputRegister(0));
|
| -#endif
|
| + __ LoadlW(i.OutputRegister(0), i.OutputRegister(0));
|
| break;
|
| #if V8_TARGET_ARCH_S390X
|
| case kS390_ShiftLeft64:
|
| @@ -828,7 +827,8 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
|
| #endif
|
| case kS390_ShiftRight32:
|
| if (HasRegisterInput(instr, 1)) {
|
| - if (i.OutputRegister().is(i.InputRegister(1))) {
|
| + if (i.OutputRegister().is(i.InputRegister(1)) &&
|
| + !CpuFeatures::IsSupported(DISTINCT_OPS)) {
|
| __ LoadRR(kScratchReg, i.InputRegister(1));
|
| __ ShiftRight(i.OutputRegister(), i.InputRegister(0), kScratchReg);
|
| } else {
|
| @@ -837,9 +837,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
|
| } else {
|
| ASSEMBLE_BINOP(ShiftRight, ShiftRight);
|
| }
|
| -#if V8_TARGET_ARCH_S390X
|
| - __ lgfr(i.OutputRegister(0), i.OutputRegister(0));
|
| -#endif
|
| + __ LoadlW(i.OutputRegister(0), i.OutputRegister(0));
|
| break;
|
| #if V8_TARGET_ARCH_S390X
|
| case kS390_ShiftRight64:
|
| @@ -848,7 +846,8 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
|
| #endif
|
| case kS390_ShiftRightArith32:
|
| if (HasRegisterInput(instr, 1)) {
|
| - if (i.OutputRegister().is(i.InputRegister(1))) {
|
| + if (i.OutputRegister().is(i.InputRegister(1)) &&
|
| + !CpuFeatures::IsSupported(DISTINCT_OPS)) {
|
| __ LoadRR(kScratchReg, i.InputRegister(1));
|
| __ ShiftRightArith(i.OutputRegister(), i.InputRegister(0),
|
| kScratchReg);
|
| @@ -858,6 +857,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
|
| } else {
|
| ASSEMBLE_BINOP(ShiftRightArith, ShiftRightArith);
|
| }
|
| + __ LoadlW(i.OutputRegister(), i.OutputRegister());
|
| break;
|
| #if V8_TARGET_ARCH_S390X
|
| case kS390_ShiftRightArith64:
|
| @@ -1093,12 +1093,12 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
|
| case kS390_MulHigh32:
|
| __ LoadRR(r1, i.InputRegister(0));
|
| __ mr_z(r0, i.InputRegister(1));
|
| - __ LoadRR(i.OutputRegister(), r0);
|
| + __ LoadW(i.OutputRegister(), r0);
|
| break;
|
| case kS390_MulHighU32:
|
| __ LoadRR(r1, i.InputRegister(0));
|
| __ mlr(r0, i.InputRegister(1));
|
| - __ LoadRR(i.OutputRegister(), r0);
|
| + __ LoadlW(i.OutputRegister(), r0);
|
| break;
|
| case kS390_MulFloat:
|
| // Ensure we don't clobber right
|
| @@ -1131,7 +1131,8 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
|
| __ LoadRR(r0, i.InputRegister(0));
|
| __ srda(r0, Operand(32));
|
| __ dr(r0, i.InputRegister(1));
|
| - __ ltr(i.OutputRegister(), r1);
|
| + __ LoadAndTestP_ExtendSrc(i.OutputRegister(),
|
| + r1); // Copy R1: Quotient to output
|
| break;
|
| #if V8_TARGET_ARCH_S390X
|
| case kS390_DivU64:
|
| @@ -1145,7 +1146,8 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
|
| __ LoadRR(r0, i.InputRegister(0));
|
| __ srdl(r0, Operand(32));
|
| __ dlr(r0, i.InputRegister(1)); // R0:R1: Dividend
|
| - __ ltr(i.OutputRegister(), r1); // Copy R1: Quotient to output
|
| + __ LoadlW(i.OutputRegister(), r1); // Copy R1: Quotient to output
|
| + __ LoadAndTestP_ExtendSrc(r1, r1);
|
| break;
|
|
|
| case kS390_DivFloat:
|
| @@ -1287,11 +1289,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
|
| } else {
|
| __ AndP(r0, i.InputRegister(0), i.InputImmediate(1));
|
| }
|
| -#if V8_TARGET_ARCH_S390X
|
| - // TODO(john.yan): use ltgfr here.
|
| - __ lgfr(r0, r0);
|
| - __ LoadAndTestP(r0, r0);
|
| -#endif
|
| + __ LoadAndTestP_ExtendSrc(r0, r0);
|
| break;
|
| #if V8_TARGET_ARCH_S390X
|
| case kS390_Tst64:
|
|
|