| 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 2cc39911065bdce198bb5cb9207753c31963f746..942042456a728931b2830f63bf33340e1d9ad0fd 100644
|
| --- a/src/compiler/s390/code-generator-s390.cc
|
| +++ b/src/compiler/s390/code-generator-s390.cc
|
| @@ -302,8 +302,176 @@ Condition FlagsConditionToCondition(FlagsCondition condition, ArchOpcode op) {
|
| return kNoCondition;
|
| }
|
|
|
| +typedef void (MacroAssembler::*RRTypeInstr)(Register, Register);
|
| +typedef void (MacroAssembler::*RMTypeInstr)(Register, const MemOperand&);
|
| +typedef void (MacroAssembler::*RITypeInstr)(Register, const Operand&);
|
| +typedef void (MacroAssembler::*RRRTypeInstr)(Register, Register, Register);
|
| +typedef void (MacroAssembler::*RRMTypeInstr)(Register, Register,
|
| + const MemOperand&);
|
| +typedef void (MacroAssembler::*RRITypeInstr)(Register, Register,
|
| + const Operand&);
|
| +
|
| +#define CHECK_AND_ZERO_EXT_OUTPUT(num) \
|
| + { \
|
| + CHECK(HasImmediateInput(instr, (num))); \
|
| + int doZeroExt = i.InputInt32(num); \
|
| + if (doZeroExt) masm->LoadlW(i.OutputRegister(), i.OutputRegister()); \
|
| + }
|
| +
|
| +void AssembleBinOp(S390OperandConverter& i, MacroAssembler* masm,
|
| + Instruction* instr, RRTypeInstr rr_instr,
|
| + RMTypeInstr rm_instr, RITypeInstr ri_instr) {
|
| + CHECK(i.OutputRegister().is(i.InputRegister(0)));
|
| + AddressingMode mode = AddressingModeField::decode(instr->opcode());
|
| + int zeroExtIndex = 2;
|
| + if (mode != kMode_None) {
|
| + size_t first_index = 1;
|
| + MemOperand operand = i.MemoryOperand(&mode, &first_index);
|
| + zeroExtIndex = first_index;
|
| + CHECK(rm_instr != NULL);
|
| + (masm->*rm_instr)(i.OutputRegister(), operand);
|
| + } else if (HasRegisterInput(instr, 1)) {
|
| + (masm->*rr_instr)(i.OutputRegister(), i.InputRegister(1));
|
| + } else if (HasImmediateInput(instr, 1)) {
|
| + (masm->*ri_instr)(i.OutputRegister(), i.InputImmediate(1));
|
| + } else if (HasStackSlotInput(instr, 1)) {
|
| + (masm->*rm_instr)(i.OutputRegister(), i.InputStackSlot32(1));
|
| + } else {
|
| + UNREACHABLE();
|
| + }
|
| + CHECK_AND_ZERO_EXT_OUTPUT(zeroExtIndex);
|
| +}
|
| +
|
| +void AssembleBinOp(S390OperandConverter& i, MacroAssembler* masm,
|
| + Instruction* instr, RRRTypeInstr rrr_instr,
|
| + RMTypeInstr rm_instr, RITypeInstr ri_instr) {
|
| + AddressingMode mode = AddressingModeField::decode(instr->opcode());
|
| + int zeroExtIndex = 2;
|
| + if (mode != kMode_None) {
|
| + CHECK(i.OutputRegister().is(i.InputRegister(0)));
|
| + size_t first_index = 1;
|
| + MemOperand operand = i.MemoryOperand(&mode, &first_index);
|
| + zeroExtIndex = first_index;
|
| + CHECK(rm_instr != NULL);
|
| + (masm->*rm_instr)(i.OutputRegister(), operand);
|
| + } else if (HasRegisterInput(instr, 1)) {
|
| + (masm->*rrr_instr)(i.OutputRegister(), i.InputRegister(0),
|
| + i.InputRegister(1));
|
| + } else if (HasImmediateInput(instr, 1)) {
|
| + CHECK(i.OutputRegister().is(i.InputRegister(0)));
|
| + (masm->*ri_instr)(i.OutputRegister(), i.InputImmediate(1));
|
| + } else if (HasStackSlotInput(instr, 1)) {
|
| + CHECK(i.OutputRegister().is(i.InputRegister(0)));
|
| + (masm->*rm_instr)(i.OutputRegister(), i.InputStackSlot32(1));
|
| + } else {
|
| + UNREACHABLE();
|
| + }
|
| + CHECK_AND_ZERO_EXT_OUTPUT(zeroExtIndex);
|
| +}
|
| +
|
| +void AssembleBinOp(S390OperandConverter& i, MacroAssembler* masm,
|
| + Instruction* instr, RRRTypeInstr rrr_instr,
|
| + RMTypeInstr rm_instr, RRITypeInstr rri_instr) {
|
| + AddressingMode mode = AddressingModeField::decode(instr->opcode());
|
| + int zeroExtIndex = 2;
|
| + if (mode != kMode_None) {
|
| + CHECK(i.OutputRegister().is(i.InputRegister(0)));
|
| + size_t first_index = 1;
|
| + MemOperand operand = i.MemoryOperand(&mode, &first_index);
|
| + zeroExtIndex = first_index;
|
| + CHECK(rm_instr != NULL);
|
| + (masm->*rm_instr)(i.OutputRegister(), operand);
|
| + } else if (HasRegisterInput(instr, 1)) {
|
| + (masm->*rrr_instr)(i.OutputRegister(), i.InputRegister(0),
|
| + i.InputRegister(1));
|
| + } else if (HasImmediateInput(instr, 1)) {
|
| + (masm->*rri_instr)(i.OutputRegister(), i.InputRegister(0),
|
| + i.InputImmediate(1));
|
| + } else if (HasStackSlotInput(instr, 1)) {
|
| + CHECK(i.OutputRegister().is(i.InputRegister(0)));
|
| + (masm->*rm_instr)(i.OutputRegister(), i.InputStackSlot32(1));
|
| + } else {
|
| + UNREACHABLE();
|
| + }
|
| + CHECK_AND_ZERO_EXT_OUTPUT(zeroExtIndex);
|
| +}
|
| +
|
| +void AssembleBinOp(S390OperandConverter& i, MacroAssembler* masm,
|
| + Instruction* instr, RRRTypeInstr rrr_instr,
|
| + RRMTypeInstr rrm_instr, RRITypeInstr rri_instr) {
|
| + AddressingMode mode = AddressingModeField::decode(instr->opcode());
|
| + int zeroExtIndex = 2;
|
| + if (mode != kMode_None) {
|
| + size_t first_index = 1;
|
| + MemOperand operand = i.MemoryOperand(&mode, &first_index);
|
| + zeroExtIndex = first_index;
|
| + CHECK(rrm_instr != NULL);
|
| + (masm->*rrm_instr)(i.OutputRegister(), i.InputRegister(0), operand);
|
| + } else if (HasRegisterInput(instr, 1)) {
|
| + (masm->*rrr_instr)(i.OutputRegister(), i.InputRegister(0),
|
| + i.InputRegister(1));
|
| + } else if (HasImmediateInput(instr, 1)) {
|
| + (masm->*rri_instr)(i.OutputRegister(), i.InputRegister(0),
|
| + i.InputImmediate(1));
|
| + } else if (HasStackSlotInput(instr, 1)) {
|
| + (masm->*rrm_instr)(i.OutputRegister(), i.InputRegister(0),
|
| + i.InputStackSlot32(1));
|
| + } else {
|
| + UNREACHABLE();
|
| + }
|
| + CHECK_AND_ZERO_EXT_OUTPUT(zeroExtIndex);
|
| +}
|
| +
|
| +void AssembleBinOp(S390OperandConverter& i, MacroAssembler* masm,
|
| + Instruction* instr, RRRTypeInstr rrr_instr,
|
| + RRITypeInstr rri_instr) {
|
| + AddressingMode mode = AddressingModeField::decode(instr->opcode());
|
| + CHECK(mode == kMode_None);
|
| + int zeroExtIndex = 2;
|
| + if (HasRegisterInput(instr, 1)) {
|
| + (masm->*rrr_instr)(i.OutputRegister(), i.InputRegister(0),
|
| + i.InputRegister(1));
|
| + } else if (HasImmediateInput(instr, 1)) {
|
| + (masm->*rri_instr)(i.OutputRegister(), i.InputRegister(0),
|
| + i.InputImmediate(1));
|
| + } else {
|
| + UNREACHABLE();
|
| + }
|
| + CHECK_AND_ZERO_EXT_OUTPUT(zeroExtIndex);
|
| +}
|
| +
|
| +void AssembleBinOp(S390OperandConverter& i, MacroAssembler* masm,
|
| + Instruction* instr, RRTypeInstr rr_instr,
|
| + RITypeInstr ri_instr) {
|
| + AddressingMode mode = AddressingModeField::decode(instr->opcode());
|
| + CHECK(mode == kMode_None);
|
| + CHECK(i.OutputRegister().is(i.InputRegister(0)));
|
| + int zeroExtIndex = 2;
|
| + if (HasRegisterInput(instr, 1)) {
|
| + (masm->*rr_instr)(i.OutputRegister(), i.InputRegister(1));
|
| + } else if (HasImmediateInput(instr, 1)) {
|
| + (masm->*ri_instr)(i.OutputRegister(), i.InputImmediate(1));
|
| + } else {
|
| + UNREACHABLE();
|
| + }
|
| + CHECK_AND_ZERO_EXT_OUTPUT(zeroExtIndex);
|
| +}
|
| +
|
| +#define ASSEMBLE_BIN_OP(instr1, instr2, instr3) \
|
| + AssembleBinOp(i, masm(), instr, &MacroAssembler::instr1, \
|
| + &MacroAssembler::instr2, &MacroAssembler::instr3)
|
| +
|
| +#undef CHECK_AND_ZERO_EXT_OUTPUT
|
| +
|
| } // namespace
|
|
|
| +#define CHECK_AND_ZERO_EXT_OUTPUT(num) \
|
| + { \
|
| + CHECK(HasImmediateInput(instr, (num))); \
|
| + int doZeroExt = i.InputInt32(num); \
|
| + if (doZeroExt) __ LoadlW(i.OutputRegister(), i.OutputRegister()); \
|
| + }
|
| +
|
| #define ASSEMBLE_FLOAT_UNOP(asm_instr) \
|
| do { \
|
| __ asm_instr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); \
|
| @@ -359,7 +527,7 @@ Condition FlagsConditionToCondition(FlagsCondition condition, ArchOpcode op) {
|
| __ LoadRR(r0, i.InputRegister(0)); \
|
| __ shift_instr(r0, Operand(32)); \
|
| __ div_instr(r0, i.InputRegister(1)); \
|
| - __ ltr(i.OutputRegister(), r0); \
|
| + __ LoadlW(i.OutputRegister(), r0); \
|
| } while (0)
|
|
|
| #define ASSEMBLE_FLOAT_MODULO() \
|
| @@ -1058,35 +1226,43 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
|
| break;
|
| }
|
| case kS390_And32:
|
| - ASSEMBLE_BINOP(And);
|
| + if (CpuFeatures::IsSupported(DISTINCT_OPS)) {
|
| + ASSEMBLE_BIN_OP(nrk, And, nilf);
|
| + } else {
|
| + ASSEMBLE_BIN_OP(nr, And, nilf);
|
| + }
|
| break;
|
| case kS390_And64:
|
| ASSEMBLE_BINOP(AndP);
|
| break;
|
| case kS390_Or32:
|
| - ASSEMBLE_BINOP(Or);
|
| + if (CpuFeatures::IsSupported(DISTINCT_OPS)) {
|
| + ASSEMBLE_BIN_OP(ork, Or, oilf);
|
| + } else {
|
| + ASSEMBLE_BIN_OP(or_z, Or, oilf);
|
| + }
|
| + break;
|
| case kS390_Or64:
|
| ASSEMBLE_BINOP(OrP);
|
| break;
|
| case kS390_Xor32:
|
| - ASSEMBLE_BINOP(Xor);
|
| + if (CpuFeatures::IsSupported(DISTINCT_OPS)) {
|
| + ASSEMBLE_BIN_OP(xrk, Xor, xilf);
|
| + } else {
|
| + ASSEMBLE_BIN_OP(xr, Xor, xilf);
|
| + }
|
| break;
|
| case kS390_Xor64:
|
| ASSEMBLE_BINOP(XorP);
|
| break;
|
| case kS390_ShiftLeft32:
|
| - if (HasRegisterInput(instr, 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 {
|
| - ASSEMBLE_BINOP(ShiftLeft);
|
| - }
|
| + if (CpuFeatures::IsSupported(DISTINCT_OPS)) {
|
| + AssembleBinOp(i, masm(), instr, &MacroAssembler::sllk,
|
| + &MacroAssembler::sllk);
|
| } else {
|
| - ASSEMBLE_BINOP(ShiftLeft);
|
| + AssembleBinOp(i, masm(), instr, &MacroAssembler::sll,
|
| + &MacroAssembler::sll);
|
| }
|
| - __ LoadlW(i.OutputRegister(0), i.OutputRegister(0));
|
| break;
|
| #if V8_TARGET_ARCH_S390X
|
| case kS390_ShiftLeft64:
|
| @@ -1094,18 +1270,13 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
|
| break;
|
| #endif
|
| case kS390_ShiftRight32:
|
| - if (HasRegisterInput(instr, 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 {
|
| - ASSEMBLE_BINOP(ShiftRight);
|
| - }
|
| + if (CpuFeatures::IsSupported(DISTINCT_OPS)) {
|
| + AssembleBinOp(i, masm(), instr, &MacroAssembler::srlk,
|
| + &MacroAssembler::srlk);
|
| } else {
|
| - ASSEMBLE_BINOP(ShiftRight);
|
| + AssembleBinOp(i, masm(), instr, &MacroAssembler::srl,
|
| + &MacroAssembler::srl);
|
| }
|
| - __ LoadlW(i.OutputRegister(0), i.OutputRegister(0));
|
| break;
|
| #if V8_TARGET_ARCH_S390X
|
| case kS390_ShiftRight64:
|
| @@ -1113,19 +1284,13 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
|
| break;
|
| #endif
|
| case kS390_ShiftRightArith32:
|
| - if (HasRegisterInput(instr, 1)) {
|
| - if (i.OutputRegister().is(i.InputRegister(1)) &&
|
| - !CpuFeatures::IsSupported(DISTINCT_OPS)) {
|
| - __ LoadRR(kScratchReg, i.InputRegister(1));
|
| - __ ShiftRightArith(i.OutputRegister(), i.InputRegister(0),
|
| - kScratchReg);
|
| - } else {
|
| - ASSEMBLE_BINOP(ShiftRightArith);
|
| - }
|
| + if (CpuFeatures::IsSupported(DISTINCT_OPS)) {
|
| + AssembleBinOp(i, masm(), instr, &MacroAssembler::srak,
|
| + &MacroAssembler::srak);
|
| } else {
|
| - ASSEMBLE_BINOP(ShiftRightArith);
|
| + AssembleBinOp(i, masm(), instr, &MacroAssembler::sra,
|
| + &MacroAssembler::sra);
|
| }
|
| - __ LoadlW(i.OutputRegister(), i.OutputRegister());
|
| break;
|
| #if V8_TARGET_ARCH_S390X
|
| case kS390_ShiftRightArith64:
|
| @@ -1207,7 +1372,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
|
| break;
|
| }
|
| #endif
|
| - case kS390_RotRight32:
|
| + case kS390_RotRight32: {
|
| if (HasRegisterInput(instr, 1)) {
|
| __ LoadComplementRR(kScratchReg, i.InputRegister(1));
|
| __ rll(i.OutputRegister(), i.InputRegister(0), kScratchReg);
|
| @@ -1215,7 +1380,9 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
|
| __ rll(i.OutputRegister(), i.InputRegister(0),
|
| Operand(32 - i.InputInt32(1)));
|
| }
|
| + CHECK_AND_ZERO_EXT_OUTPUT(2);
|
| break;
|
| + }
|
| #if V8_TARGET_ARCH_S390X
|
| case kS390_RotRight64:
|
| if (HasRegisterInput(instr, 1)) {
|
| @@ -1226,14 +1393,6 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
|
| Operand(64 - i.InputInt32(1)));
|
| }
|
| break;
|
| -#endif
|
| - case kS390_Not32:
|
| - __ Not32(i.OutputRegister(), i.InputRegister(0));
|
| - break;
|
| - case kS390_Not64:
|
| - __ Not64(i.OutputRegister(), i.InputRegister(0));
|
| - break;
|
| -#if V8_TARGET_ARCH_S390X
|
| case kS390_RotLeftAndClear64:
|
| if (CpuFeatures::IsSupported(GENERAL_INSTR_EXT)) {
|
| int shiftAmount = i.InputInt32(1);
|
| @@ -1282,10 +1441,14 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
|
| }
|
| break;
|
| #endif
|
| - case kS390_Add32:
|
| - ASSEMBLE_BINOP(Add32);
|
| - __ LoadW(i.OutputRegister(), i.OutputRegister());
|
| + case kS390_Add32: {
|
| + if (CpuFeatures::IsSupported(DISTINCT_OPS)) {
|
| + ASSEMBLE_BIN_OP(ark, Add32, Add32_RRI);
|
| + } else {
|
| + ASSEMBLE_BIN_OP(ar, Add32, Add32_RI);
|
| + }
|
| break;
|
| + }
|
| case kS390_Add64:
|
| ASSEMBLE_BINOP(AddP);
|
| break;
|
| @@ -1310,8 +1473,11 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
|
| }
|
| break;
|
| case kS390_Sub32:
|
| - ASSEMBLE_BINOP(Sub32);
|
| - __ LoadW(i.OutputRegister(), i.OutputRegister());
|
| + if (CpuFeatures::IsSupported(DISTINCT_OPS)) {
|
| + ASSEMBLE_BIN_OP(srk, Sub32, Sub32_RRI);
|
| + } else {
|
| + ASSEMBLE_BIN_OP(sr, Sub32, Sub32_RI);
|
| + }
|
| break;
|
| case kS390_Sub64:
|
| ASSEMBLE_BINOP(SubP);
|
| @@ -1343,17 +1509,15 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
|
| }
|
| break;
|
| case kS390_Mul32:
|
| - if (HasRegisterInput(instr, 1)) {
|
| - __ Mul32(i.InputRegister(0), i.InputRegister(1));
|
| - } else if (HasImmediateInput(instr, 1)) {
|
| - __ Mul32(i.InputRegister(0), i.InputImmediate(1));
|
| - } else if (HasStackSlotInput(instr, 1)) {
|
| - __ Mul32(i.InputRegister(0), i.InputStackSlot32(1));
|
| - } else {
|
| - UNIMPLEMENTED();
|
| - }
|
| + ASSEMBLE_BIN_OP(Mul32, Mul32, Mul32);
|
| + break;
|
| + case kS390_Mul32WithOverflow:
|
| + ASSEMBLE_BIN_OP(Mul32WithOverflowIfCCUnequal,
|
| + Mul32WithOverflowIfCCUnequal,
|
| + Mul32WithOverflowIfCCUnequal);
|
| break;
|
| case kS390_Mul64:
|
| + CHECK(i.OutputRegister().is(i.InputRegister(0)));
|
| if (HasRegisterInput(instr, 1)) {
|
| __ Mul64(i.InputRegister(0), i.InputRegister(1));
|
| } else if (HasImmediateInput(instr, 1)) {
|
| @@ -1365,15 +1529,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
|
| }
|
| break;
|
| case kS390_MulHigh32:
|
| - __ LoadRR(r1, i.InputRegister(0));
|
| - if (HasRegisterInput(instr, 1)) {
|
| - __ mr_z(r0, i.InputRegister(1));
|
| - } else if (HasStackSlotInput(instr, 1)) {
|
| - __ mfy(r0, i.InputStackSlot32(1));
|
| - } else {
|
| - UNIMPLEMENTED();
|
| - }
|
| - __ LoadW(i.OutputRegister(), r0);
|
| + ASSEMBLE_BIN_OP(MulHigh32, MulHigh32, MulHigh32);
|
| break;
|
| case kS390_Mul32WithHigh32:
|
| __ LoadRR(r1, i.InputRegister(0));
|
| @@ -1419,13 +1575,23 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
|
| __ ltgr(i.OutputRegister(), r1); // Copy R1: Quotient to output
|
| break;
|
| #endif
|
| - case kS390_Div32:
|
| - __ LoadRR(r0, i.InputRegister(0));
|
| - __ srda(r0, Operand(32));
|
| - __ dr(r0, i.InputRegister(1));
|
| - __ LoadAndTestP_ExtendSrc(i.OutputRegister(),
|
| - r1); // Copy R1: Quotient to output
|
| + case kS390_Div32: {
|
| + AddressingMode mode = AddressingModeField::decode(instr->opcode());
|
| + __ lgfr(r1, i.InputRegister(0));
|
| + if (mode != kMode_None) {
|
| + size_t first_index = 1;
|
| + MemOperand operand = i.MemoryOperand(&mode, &first_index);
|
| + __ dsgf(r0, operand);
|
| + } else if (HasRegisterInput(instr, 1)) {
|
| + __ dsgfr(r0, i.InputRegister(1));
|
| + } else if (HasStackSlotInput(instr, 1)) {
|
| + __ dsgf(r0, i.InputStackSlot32(1));
|
| + } else {
|
| + UNREACHABLE();
|
| + }
|
| + __ LoadlW(i.OutputRegister(), r1);
|
| break;
|
| + }
|
| #if V8_TARGET_ARCH_S390X
|
| case kS390_DivU64:
|
| __ LoadRR(r1, i.InputRegister(0));
|
| @@ -1434,14 +1600,24 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
|
| __ ltgr(i.OutputRegister(), r1); // Copy R1: Quotient to output
|
| break;
|
| #endif
|
| - case kS390_DivU32:
|
| - __ LoadRR(r0, i.InputRegister(0));
|
| + case kS390_DivU32: {
|
| + __ lr(r0, i.InputRegister(0));
|
| __ srdl(r0, Operand(32));
|
| - __ dlr(r0, i.InputRegister(1)); // R0:R1: Dividend
|
| - __ LoadlW(i.OutputRegister(), r1); // Copy R1: Quotient to output
|
| - __ LoadAndTestP_ExtendSrc(r1, r1);
|
| + AddressingMode mode = AddressingModeField::decode(instr->opcode());
|
| + if (mode != kMode_None) {
|
| + size_t first_index = 1;
|
| + MemOperand operand = i.MemoryOperand(&mode, &first_index);
|
| + __ dl(r0, operand);
|
| + } else if (HasRegisterInput(instr, 1)) {
|
| + __ dlr(r0, i.InputRegister(1));
|
| + } else if (HasStackSlotInput(instr, 1)) {
|
| + __ dl(r0, i.InputStackSlot32(1));
|
| + } else {
|
| + UNREACHABLE();
|
| + }
|
| + __ LoadlW(i.OutputRegister(), r1);
|
| break;
|
| -
|
| + }
|
| case kS390_DivFloat:
|
| // InputDoubleRegister(1)=InputDoubleRegister(0)/InputDoubleRegister(1)
|
| if (i.OutputDoubleRegister().is(i.InputDoubleRegister(1))) {
|
| @@ -1575,7 +1751,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
|
| }
|
| case kS390_Neg32:
|
| __ lcr(i.OutputRegister(), i.InputRegister(0));
|
| - __ LoadW(i.OutputRegister(), i.OutputRegister());
|
| + CHECK_AND_ZERO_EXT_OUTPUT(1);
|
| break;
|
| case kS390_Neg64:
|
| __ lcgr(i.OutputRegister(), i.InputRegister(0));
|
| @@ -1731,18 +1907,12 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
|
| break;
|
| }
|
| case kS390_ExtendSignWord8:
|
| -#if V8_TARGET_ARCH_S390X
|
| - __ lgbr(i.OutputRegister(), i.InputRegister(0));
|
| -#else
|
| __ lbr(i.OutputRegister(), i.InputRegister(0));
|
| -#endif
|
| + CHECK_AND_ZERO_EXT_OUTPUT(1);
|
| break;
|
| case kS390_ExtendSignWord16:
|
| -#if V8_TARGET_ARCH_S390X
|
| - __ lghr(i.OutputRegister(), i.InputRegister(0));
|
| -#else
|
| __ lhr(i.OutputRegister(), i.InputRegister(0));
|
| -#endif
|
| + CHECK_AND_ZERO_EXT_OUTPUT(1);
|
| break;
|
| #if V8_TARGET_ARCH_S390X
|
| case kS390_ExtendSignWord32:
|
| @@ -2013,6 +2183,9 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
|
| case kS390_StoreDouble:
|
| ASSEMBLE_STORE_DOUBLE();
|
| break;
|
| + case kS390_Lay:
|
| + __ lay(i.OutputRegister(), i.MemoryOperand());
|
| + break;
|
| case kCheckedLoadInt8:
|
| ASSEMBLE_CHECKED_LOAD_INTEGER(LoadlB);
|
| #if V8_TARGET_ARCH_S390X
|
| @@ -2361,7 +2534,7 @@ void CodeGenerator::AssembleMove(InstructionOperand* source,
|
| #endif
|
| __ mov(dst, Operand(src.ToInt32(), src.rmode()));
|
| } else {
|
| - __ mov(dst, Operand(src.ToInt32()));
|
| + __ Load(dst, Operand(src.ToInt32()));
|
| }
|
| break;
|
| case Constant::kInt64:
|
| @@ -2370,7 +2543,7 @@ void CodeGenerator::AssembleMove(InstructionOperand* source,
|
| __ mov(dst, Operand(src.ToInt64(), src.rmode()));
|
| } else {
|
| DCHECK(!RelocInfo::IsWasmSizeReference(src.rmode()));
|
| - __ mov(dst, Operand(src.ToInt64()));
|
| + __ Load(dst, Operand(src.ToInt64()));
|
| }
|
| #else
|
| __ mov(dst, Operand(src.ToInt64()));
|
|
|