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 8e9db3dcb01b3a9696207d421e6751e6c81721e2..ddf68562b861e7c3d0f6c834daab5ca045b08e11 100644 |
--- a/src/compiler/s390/code-generator-s390.cc |
+++ b/src/compiler/s390/code-generator-s390.cc |
@@ -135,26 +135,28 @@ static inline bool HasRegisterOutput(Instruction* instr, int index = 0) { |
return instr->OutputCount() > 0 && instr->OutputAt(index)->IsRegister(); |
} |
-static inline bool HasRegisterInput(Instruction* instr, int index) { |
- return instr->InputAt(index)->IsRegister(); |
-} |
- |
static inline bool HasFPRegisterInput(Instruction* instr, int index) { |
return instr->InputAt(index)->IsFPRegister(); |
} |
-static inline bool HasImmediateInput(Instruction* instr, size_t index) { |
- return instr->InputAt(index)->IsImmediate(); |
+static inline bool HasRegisterInput(Instruction* instr, int index) { |
+ return instr->InputAt(index)->IsRegister() || |
+ HasFPRegisterInput(instr, index); |
} |
-static inline bool HasStackSlotInput(Instruction* instr, size_t index) { |
- return instr->InputAt(index)->IsStackSlot(); |
+static inline bool HasImmediateInput(Instruction* instr, size_t index) { |
+ return instr->InputAt(index)->IsImmediate(); |
} |
static inline bool HasFPStackSlotInput(Instruction* instr, size_t index) { |
return instr->InputAt(index)->IsFPStackSlot(); |
} |
+static inline bool HasStackSlotInput(Instruction* instr, size_t index) { |
+ return instr->InputAt(index)->IsStackSlot() || |
+ HasFPStackSlotInput(instr, index); |
+} |
+ |
namespace { |
class OutOfLineLoadNAN32 final : public OutOfLineCode { |
@@ -330,175 +332,177 @@ 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()); \ |
+#define GET_MEMOPERAND32(ret, fi) \ |
+ ([&](int& ret) { \ |
+ AddressingMode mode = AddressingModeField::decode(instr->opcode()); \ |
+ MemOperand mem(r0); \ |
+ if (mode != kMode_None) { \ |
+ size_t first_index = (fi); \ |
+ mem = i.MemoryOperand(&mode, &first_index); \ |
+ ret = first_index; \ |
+ } else { \ |
+ mem = i.InputStackSlot32(fi); \ |
+ } \ |
+ return mem; \ |
+ })(ret) |
+ |
+#define GET_MEMOPERAND(ret, fi) \ |
+ ([&](int& ret) { \ |
+ AddressingMode mode = AddressingModeField::decode(instr->opcode()); \ |
+ MemOperand mem(r0); \ |
+ if (mode != kMode_None) { \ |
+ size_t first_index = (fi); \ |
+ mem = i.MemoryOperand(&mode, &first_index); \ |
+ ret = first_index; \ |
+ } else { \ |
+ mem = i.InputStackSlot(fi); \ |
+ } \ |
+ return mem; \ |
+ })(ret) |
+ |
+#define RRInstr(instr) \ |
+ [&]() { \ |
+ DCHECK(i.OutputRegister().is(i.InputRegister(0))); \ |
+ __ instr(i.OutputRegister(), i.InputRegister(1)); \ |
+ return 2; \ |
} |
+#define RIInstr(instr) \ |
+ [&]() { \ |
+ DCHECK(i.OutputRegister().is(i.InputRegister(0))); \ |
+ __ instr(i.OutputRegister(), i.InputImmediate(1)); \ |
+ return 2; \ |
+ } |
+#define RMInstr(instr, GETMEM) \ |
+ [&]() { \ |
+ DCHECK(i.OutputRegister().is(i.InputRegister(0))); \ |
+ int ret = 2; \ |
+ __ instr(i.OutputRegister(), GETMEM(ret, 1)); \ |
+ return ret; \ |
+ } |
+#define RM32Instr(instr) RMInstr(instr, GET_MEMOPERAND32) |
+#define RM64Instr(instr) RMInstr(instr, GET_MEMOPERAND) |
-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(); |
+#define RRRInstr(instr) \ |
+ [&]() { \ |
+ __ instr(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1)); \ |
+ return 2; \ |
+ } |
+#define RRIInstr(instr) \ |
+ [&]() { \ |
+ __ instr(i.OutputRegister(), i.InputRegister(0), i.InputImmediate(1)); \ |
+ return 2; \ |
+ } |
+#define RRMInstr(instr, GETMEM) \ |
+ [&]() { \ |
+ int ret = 2; \ |
+ __ instr(i.OutputRegister(), i.InputRegister(0), GETMEM(ret, 1)); \ |
+ return ret; \ |
+ } |
+#define RRM32Instr(instr) RRMInstr(instr, GET_MEMOPERAND32) |
+#define RRM64Instr(instr) RRMInstr(instr, GET_MEMOPERAND) |
+ |
+#define DDInstr(instr) \ |
+ [&]() { \ |
+ DCHECK(i.OutputDoubleRegister().is(i.InputDoubleRegister(0))); \ |
+ __ instr(i.OutputDoubleRegister(), i.InputDoubleRegister(1)); \ |
+ return 2; \ |
} |
- 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(); |
+#define DMInstr(instr) \ |
+ [&]() { \ |
+ DCHECK(i.OutputDoubleRegister().is(i.InputDoubleRegister(0))); \ |
+ int ret = 2; \ |
+ __ instr(i.OutputDoubleRegister(), GET_MEMOPERAND(ret, 1)); \ |
+ return ret; \ |
} |
- 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(); |
+#define DMTInstr(instr) \ |
+ [&]() { \ |
+ DCHECK(i.OutputDoubleRegister().is(i.InputDoubleRegister(0))); \ |
+ int ret = 2; \ |
+ __ instr(i.OutputDoubleRegister(), GET_MEMOPERAND(ret, 1), \ |
+ kScratchDoubleReg); \ |
+ return ret; \ |
} |
- 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(); |
+#define R_MInstr(instr) \ |
+ [&]() { \ |
+ int ret = 2; \ |
+ __ instr(i.OutputRegister(), GET_MEMOPERAND(ret, 0)); \ |
+ return ret; \ |
} |
- 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(); |
+#define R_DInstr(instr) \ |
+ [&]() { \ |
+ __ instr(i.OutputRegister(), i.InputDoubleRegister(0)); \ |
+ return 2; \ |
+ } |
+ |
+#define D_DInstr(instr) \ |
+ [&]() { \ |
+ __ instr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); \ |
+ return 2; \ |
+ } |
+ |
+#define D_MInstr(instr) \ |
+ [&]() { \ |
+ int ret = 2; \ |
+ __ instr(i.OutputDoubleRegister(), GET_MEMOPERAND(ret, 0)); \ |
+ return ret; \ |
} |
- CHECK_AND_ZERO_EXT_OUTPUT(zeroExtIndex); |
+ |
+#define D_MTInstr(instr) \ |
+ [&]() { \ |
+ int ret = 2; \ |
+ __ instr(i.OutputDoubleRegister(), GET_MEMOPERAND(ret, 0), \ |
+ kScratchDoubleReg); \ |
+ return ret; \ |
+ } |
+ |
+static int nullInstr() { |
+ UNREACHABLE(); |
+ return -1; |
} |
-void AssembleBinOp(S390OperandConverter& i, MacroAssembler* masm, |
- Instruction* instr, RRTypeInstr rr_instr, |
- RITypeInstr ri_instr) { |
+template <int numOfOperand, class RType, class MType, class IType> |
+static inline int AssembleOp(Instruction* instr, RType r, MType m, IType i) { |
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)); |
+ if (mode != kMode_None || HasStackSlotInput(instr, numOfOperand - 1)) { |
+ return m(); |
+ } else if (HasRegisterInput(instr, numOfOperand - 1)) { |
+ return r(); |
+ } else if (HasImmediateInput(instr, numOfOperand - 1)) { |
+ return i(); |
} else { |
UNREACHABLE(); |
+ return -1; |
} |
- 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 |
+template <class _RR, class _RM, class _RI> |
+static inline int AssembleBinOp(Instruction* instr, _RR _rr, _RM _rm, _RI _ri) { |
+ return AssembleOp<2>(instr, _rr, _rm, _ri); |
+} |
-} // namespace |
+template <class _R, class _M, class _I> |
+static inline int AssembleUnaryOp(Instruction* instr, _R _r, _M _m, _I _i) { |
+ return AssembleOp<1>(instr, _r, _m, _i); |
+} |
#define CHECK_AND_ZERO_EXT_OUTPUT(num) \ |
- { \ |
- CHECK(HasImmediateInput(instr, (num))); \ |
- int doZeroExt = i.InputInt32(num); \ |
+ ([&](int index) { \ |
+ DCHECK(HasImmediateInput(instr, (index))); \ |
+ int doZeroExt = i.InputInt32(index); \ |
if (doZeroExt) __ LoadlW(i.OutputRegister(), i.OutputRegister()); \ |
- } |
+ })(num) |
+ |
+#define ASSEMBLE_BIN_OP(_rr, _rm, _ri) AssembleBinOp(instr, _rr, _rm, _ri) |
+#define ASSEMBLE_UNARY_OP(_r, _m, _i) AssembleUnaryOp(instr, _r, _m, _i) |
+ |
+#define ASSEMBLE_BIN32_OP(_rr, _rm, _ri) \ |
+ { CHECK_AND_ZERO_EXT_OUTPUT(AssembleBinOp(instr, _rr, _rm, _ri)); } |
+ |
+} // namespace |
#define ASSEMBLE_FLOAT_UNOP(asm_instr) \ |
do { \ |
@@ -511,19 +515,6 @@ void AssembleBinOp(S390OperandConverter& i, MacroAssembler* masm, |
i.InputDoubleRegister(1)); \ |
} while (0) |
-#define ASSEMBLE_BINOP(asm_instr) \ |
- do { \ |
- if (HasRegisterInput(instr, 1)) { \ |
- __ asm_instr(i.OutputRegister(), i.InputRegister(0), \ |
- i.InputRegister(1)); \ |
- } else if (HasImmediateInput(instr, 1)) { \ |
- __ asm_instr(i.OutputRegister(), i.InputRegister(0), \ |
- i.InputImmediate(1)); \ |
- } else { \ |
- UNIMPLEMENTED(); \ |
- } \ |
- } while (0) |
- |
#define ASSEMBLE_COMPARE(cmp_instr, cmpl_instr) \ |
do { \ |
AddressingMode mode = AddressingModeField::decode(instr->opcode()); \ |
@@ -1353,76 +1344,76 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( |
} |
case kS390_And32: |
if (CpuFeatures::IsSupported(DISTINCT_OPS)) { |
- ASSEMBLE_BIN_OP(nrk, And, nilf); |
+ ASSEMBLE_BIN32_OP(RRRInstr(nrk), RM32Instr(And), RIInstr(nilf)); |
} else { |
- ASSEMBLE_BIN_OP(nr, And, nilf); |
+ ASSEMBLE_BIN32_OP(RRInstr(nr), RM32Instr(And), RIInstr(nilf)); |
} |
break; |
case kS390_And64: |
- ASSEMBLE_BINOP(AndP); |
+ if (CpuFeatures::IsSupported(DISTINCT_OPS)) { |
+ ASSEMBLE_BIN_OP(RRRInstr(ngrk), RM64Instr(ng), nullInstr); |
+ } else { |
+ ASSEMBLE_BIN_OP(RRInstr(ngr), RM64Instr(ng), nullInstr); |
+ } |
break; |
case kS390_Or32: |
if (CpuFeatures::IsSupported(DISTINCT_OPS)) { |
- ASSEMBLE_BIN_OP(ork, Or, oilf); |
+ ASSEMBLE_BIN32_OP(RRRInstr(ork), RM32Instr(Or), RIInstr(oilf)); |
} else { |
- ASSEMBLE_BIN_OP(or_z, Or, oilf); |
+ ASSEMBLE_BIN32_OP(RRInstr(or_z), RM32Instr(Or), RIInstr(oilf)); |
} |
break; |
case kS390_Or64: |
- ASSEMBLE_BINOP(OrP); |
+ if (CpuFeatures::IsSupported(DISTINCT_OPS)) { |
+ ASSEMBLE_BIN_OP(RRRInstr(ogrk), RM64Instr(og), nullInstr); |
+ } else { |
+ ASSEMBLE_BIN_OP(RRInstr(ogr), RM64Instr(og), nullInstr); |
+ } |
break; |
case kS390_Xor32: |
if (CpuFeatures::IsSupported(DISTINCT_OPS)) { |
- ASSEMBLE_BIN_OP(xrk, Xor, xilf); |
+ ASSEMBLE_BIN32_OP(RRRInstr(xrk), RM32Instr(Xor), RIInstr(xilf)); |
} else { |
- ASSEMBLE_BIN_OP(xr, Xor, xilf); |
+ ASSEMBLE_BIN32_OP(RRInstr(xr), RM32Instr(Xor), RIInstr(xilf)); |
} |
break; |
case kS390_Xor64: |
- ASSEMBLE_BINOP(XorP); |
+ if (CpuFeatures::IsSupported(DISTINCT_OPS)) { |
+ ASSEMBLE_BIN_OP(RRRInstr(xgrk), RM64Instr(xg), nullInstr); |
+ } else { |
+ ASSEMBLE_BIN_OP(RRInstr(xgr), RM64Instr(xg), nullInstr); |
+ } |
break; |
case kS390_ShiftLeft32: |
if (CpuFeatures::IsSupported(DISTINCT_OPS)) { |
- AssembleBinOp(i, masm(), instr, &MacroAssembler::ShiftLeft, |
- &MacroAssembler::ShiftLeft); |
+ ASSEMBLE_BIN32_OP(RRRInstr(ShiftLeft), nullInstr, RRIInstr(ShiftLeft)); |
} else { |
- AssembleBinOp(i, masm(), instr, &MacroAssembler::sll, |
- &MacroAssembler::sll); |
+ ASSEMBLE_BIN32_OP(RRInstr(sll), nullInstr, RIInstr(sll)); |
} |
break; |
-#if V8_TARGET_ARCH_S390X |
case kS390_ShiftLeft64: |
- ASSEMBLE_BINOP(sllg); |
+ ASSEMBLE_BIN_OP(RRRInstr(sllg), nullInstr, RRIInstr(sllg)); |
break; |
-#endif |
case kS390_ShiftRight32: |
if (CpuFeatures::IsSupported(DISTINCT_OPS)) { |
- AssembleBinOp(i, masm(), instr, &MacroAssembler::srlk, |
- &MacroAssembler::srlk); |
+ ASSEMBLE_BIN32_OP(RRRInstr(srlk), nullInstr, RRIInstr(srlk)); |
} else { |
- AssembleBinOp(i, masm(), instr, &MacroAssembler::srl, |
- &MacroAssembler::srl); |
+ ASSEMBLE_BIN32_OP(RRInstr(srl), nullInstr, RIInstr(srl)); |
} |
break; |
-#if V8_TARGET_ARCH_S390X |
case kS390_ShiftRight64: |
- ASSEMBLE_BINOP(srlg); |
+ ASSEMBLE_BIN_OP(RRRInstr(srlg), nullInstr, RRIInstr(srlg)); |
break; |
-#endif |
case kS390_ShiftRightArith32: |
if (CpuFeatures::IsSupported(DISTINCT_OPS)) { |
- AssembleBinOp(i, masm(), instr, &MacroAssembler::srak, |
- &MacroAssembler::srak); |
+ ASSEMBLE_BIN32_OP(RRRInstr(srak), nullInstr, RRIInstr(srak)); |
} else { |
- AssembleBinOp(i, masm(), instr, &MacroAssembler::sra, |
- &MacroAssembler::sra); |
+ ASSEMBLE_BIN32_OP(RRInstr(sra), nullInstr, RIInstr(sra)); |
} |
break; |
-#if V8_TARGET_ARCH_S390X |
case kS390_ShiftRightArith64: |
- ASSEMBLE_BINOP(srag); |
+ ASSEMBLE_BIN_OP(RRRInstr(srag), nullInstr, RRIInstr(srag)); |
break; |
-#endif |
#if !V8_TARGET_ARCH_S390X |
case kS390_AddPair: |
// i.InputRegister(0) ... left low word. |
@@ -1509,16 +1500,17 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( |
CHECK_AND_ZERO_EXT_OUTPUT(2); |
break; |
} |
-#if V8_TARGET_ARCH_S390X |
case kS390_RotRight64: |
if (HasRegisterInput(instr, 1)) { |
- __ LoadComplementRR(kScratchReg, i.InputRegister(1)); |
+ __ lcgr(kScratchReg, i.InputRegister(1)); |
__ rllg(i.OutputRegister(), i.InputRegister(0), kScratchReg); |
} else { |
+ DCHECK(HasImmediateInput(instr, 1)); |
__ rllg(i.OutputRegister(), i.InputRegister(0), |
Operand(64 - i.InputInt32(1))); |
} |
break; |
+ // TODO(john.yan): clean up kS390_RotLeftAnd... |
case kS390_RotLeftAndClear64: |
if (CpuFeatures::IsSupported(GENERAL_INSTR_EXT)) { |
int shiftAmount = i.InputInt32(1); |
@@ -1566,191 +1558,112 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( |
__ sllg(i.OutputRegister(), i.OutputRegister(), Operand(clearBit)); |
} |
break; |
-#endif |
case kS390_Add32: { |
if (CpuFeatures::IsSupported(DISTINCT_OPS)) { |
- ASSEMBLE_BIN_OP(ark, Add32, Add32_RRI); |
+ ASSEMBLE_BIN32_OP(RRRInstr(ark), RM32Instr(Add32), RRIInstr(Add32)); |
} else { |
- ASSEMBLE_BIN_OP(ar, Add32, Add32_RI); |
+ ASSEMBLE_BIN32_OP(RRInstr(ar), RM32Instr(Add32), RIInstr(Add32)); |
} |
break; |
} |
case kS390_Add64: |
- ASSEMBLE_BINOP(AddP); |
- break; |
- case kS390_AddFloat: |
- // Ensure we don't clobber right/InputReg(1) |
- if (i.OutputDoubleRegister().is(i.InputDoubleRegister(1))) { |
- ASSEMBLE_FLOAT_UNOP(aebr); |
+ if (CpuFeatures::IsSupported(DISTINCT_OPS)) { |
+ ASSEMBLE_BIN_OP(RRRInstr(agrk), RM64Instr(ag), RRIInstr(AddP)); |
} else { |
- if (!i.OutputDoubleRegister().is(i.InputDoubleRegister(0))) |
- __ ldr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); |
- __ aebr(i.OutputDoubleRegister(), i.InputDoubleRegister(1)); |
+ ASSEMBLE_BIN_OP(RRInstr(agr), RM64Instr(ag), RIInstr(agfi)); |
} |
break; |
+ case kS390_AddFloat: |
+ ASSEMBLE_BIN_OP(DDInstr(aebr), DMTInstr(AddFloat32), nullInstr); |
+ break; |
case kS390_AddDouble: |
- // Ensure we don't clobber right/InputReg(1) |
- if (i.OutputDoubleRegister().is(i.InputDoubleRegister(1))) { |
- ASSEMBLE_FLOAT_UNOP(adbr); |
- } else { |
- if (!i.OutputDoubleRegister().is(i.InputDoubleRegister(0))) |
- __ ldr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); |
- __ adbr(i.OutputDoubleRegister(), i.InputDoubleRegister(1)); |
- } |
+ ASSEMBLE_BIN_OP(DDInstr(adbr), DMTInstr(AddFloat64), nullInstr); |
break; |
case kS390_Sub32: |
if (CpuFeatures::IsSupported(DISTINCT_OPS)) { |
- ASSEMBLE_BIN_OP(srk, Sub32, Sub32_RRI); |
+ ASSEMBLE_BIN32_OP(RRRInstr(srk), RM32Instr(Sub32), RRIInstr(Sub32)); |
} else { |
- ASSEMBLE_BIN_OP(sr, Sub32, Sub32_RI); |
+ ASSEMBLE_BIN32_OP(RRInstr(sr), RM32Instr(Sub32), RIInstr(Sub32)); |
} |
break; |
case kS390_Sub64: |
- ASSEMBLE_BINOP(SubP); |
- break; |
- case kS390_SubFloat: |
- // OutputDoubleReg() = i.InputDoubleRegister(0) - i.InputDoubleRegister(1) |
- if (i.OutputDoubleRegister().is(i.InputDoubleRegister(1))) { |
- __ ldr(kScratchDoubleReg, i.InputDoubleRegister(1)); |
- __ ldr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); |
- __ sebr(i.OutputDoubleRegister(), kScratchDoubleReg); |
+ if (CpuFeatures::IsSupported(DISTINCT_OPS)) { |
+ ASSEMBLE_BIN_OP(RRRInstr(sgrk), RM64Instr(sg), RRIInstr(SubP)); |
} else { |
- if (!i.OutputDoubleRegister().is(i.InputDoubleRegister(0))) { |
- __ ldr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); |
- } |
- __ sebr(i.OutputDoubleRegister(), i.InputDoubleRegister(1)); |
+ ASSEMBLE_BIN_OP(RRInstr(sgr), RM64Instr(sg), RIInstr(SubP)); |
} |
break; |
+ case kS390_SubFloat: |
+ ASSEMBLE_BIN_OP(DDInstr(sebr), DMTInstr(SubFloat32), nullInstr); |
+ break; |
case kS390_SubDouble: |
- // OutputDoubleReg() = i.InputDoubleRegister(0) - i.InputDoubleRegister(1) |
- if (i.OutputDoubleRegister().is(i.InputDoubleRegister(1))) { |
- __ ldr(kScratchDoubleReg, i.InputDoubleRegister(1)); |
- __ ldr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); |
- __ sdbr(i.OutputDoubleRegister(), kScratchDoubleReg); |
- } else { |
- if (!i.OutputDoubleRegister().is(i.InputDoubleRegister(0))) { |
- __ ldr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); |
- } |
- __ sdbr(i.OutputDoubleRegister(), i.InputDoubleRegister(1)); |
- } |
+ ASSEMBLE_BIN_OP(DDInstr(sdbr), DMTInstr(SubFloat64), nullInstr); |
break; |
case kS390_Mul32: |
- ASSEMBLE_BIN_OP(Mul32, Mul32, Mul32); |
+ ASSEMBLE_BIN32_OP(RRInstr(Mul32), RM32Instr(Mul32), RIInstr(Mul32)); |
break; |
case kS390_Mul32WithOverflow: |
- ASSEMBLE_BIN_OP(Mul32WithOverflowIfCCUnequal, |
- Mul32WithOverflowIfCCUnequal, |
- Mul32WithOverflowIfCCUnequal); |
+ ASSEMBLE_BIN32_OP(RRRInstr(Mul32WithOverflowIfCCUnequal), |
+ RRM32Instr(Mul32WithOverflowIfCCUnequal), |
+ RRIInstr(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)) { |
- __ Mul64(i.InputRegister(0), i.InputImmediate(1)); |
- } else if (HasStackSlotInput(instr, 1)) { |
- __ Mul64(i.InputRegister(0), i.InputStackSlot(1)); |
- } else { |
- UNIMPLEMENTED(); |
- } |
+ ASSEMBLE_BIN_OP(RRInstr(Mul64), RM64Instr(Mul64), RIInstr(Mul64)); |
break; |
case kS390_MulHigh32: |
- ASSEMBLE_BIN_OP(MulHigh32, MulHigh32, MulHigh32); |
+ ASSEMBLE_BIN32_OP(RRRInstr(MulHigh32), RRM32Instr(MulHigh32), |
+ RRIInstr(MulHigh32)); |
break; |
case kS390_MulHighU32: |
- ASSEMBLE_BIN_OP(MulHighU32, MulHighU32, MulHighU32); |
+ ASSEMBLE_BIN32_OP(RRRInstr(MulHighU32), RRM32Instr(MulHighU32), |
+ RRIInstr(MulHighU32)); |
break; |
case kS390_MulFloat: |
- // Ensure we don't clobber right |
- if (i.OutputDoubleRegister().is(i.InputDoubleRegister(1))) { |
- ASSEMBLE_FLOAT_UNOP(meebr); |
- } else { |
- if (!i.OutputDoubleRegister().is(i.InputDoubleRegister(0))) |
- __ ldr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); |
- __ meebr(i.OutputDoubleRegister(), i.InputDoubleRegister(1)); |
- } |
+ ASSEMBLE_BIN_OP(DDInstr(meebr), DMTInstr(MulFloat32), nullInstr); |
break; |
case kS390_MulDouble: |
- // Ensure we don't clobber right |
- if (i.OutputDoubleRegister().is(i.InputDoubleRegister(1))) { |
- ASSEMBLE_FLOAT_UNOP(mdbr); |
- } else { |
- if (!i.OutputDoubleRegister().is(i.InputDoubleRegister(0))) |
- __ ldr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); |
- __ mdbr(i.OutputDoubleRegister(), i.InputDoubleRegister(1)); |
- } |
+ ASSEMBLE_BIN_OP(DDInstr(mdbr), DMTInstr(MulFloat64), nullInstr); |
break; |
-#if V8_TARGET_ARCH_S390X |
case kS390_Div64: |
- __ LoadRR(r1, i.InputRegister(0)); |
- __ dsgr(r0, i.InputRegister(1)); // R1: Dividend |
- __ ltgr(i.OutputRegister(), r1); // Copy R1: Quotient to output |
+ ASSEMBLE_BIN_OP(RRRInstr(Div64), RRM64Instr(Div64), nullInstr); |
break; |
-#endif |
case kS390_Div32: { |
- ASSEMBLE_BIN_OP(Div32, Div32, Div32); |
+ ASSEMBLE_BIN32_OP(RRRInstr(Div32), RRM32Instr(Div32), nullInstr); |
break; |
} |
-#if V8_TARGET_ARCH_S390X |
case kS390_DivU64: |
- __ LoadRR(r1, i.InputRegister(0)); |
- __ LoadImmP(r0, Operand::Zero()); |
- __ dlgr(r0, i.InputRegister(1)); // R0:R1: Dividend |
- __ ltgr(i.OutputRegister(), r1); // Copy R1: Quotient to output |
+ ASSEMBLE_BIN_OP(RRRInstr(DivU64), RRM64Instr(DivU64), nullInstr); |
break; |
-#endif |
case kS390_DivU32: { |
- ASSEMBLE_BIN_OP(DivU32, DivU32, DivU32); |
+ ASSEMBLE_BIN32_OP(RRRInstr(DivU32), RRM32Instr(DivU32), nullInstr); |
break; |
} |
case kS390_DivFloat: |
- // InputDoubleRegister(1)=InputDoubleRegister(0)/InputDoubleRegister(1) |
- if (i.OutputDoubleRegister().is(i.InputDoubleRegister(1))) { |
- __ ldr(kScratchDoubleReg, i.InputDoubleRegister(1)); |
- __ ldr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); |
- __ debr(i.OutputDoubleRegister(), kScratchDoubleReg); |
- } else { |
- if (!i.OutputDoubleRegister().is(i.InputDoubleRegister(0))) |
- __ ldr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); |
- __ debr(i.OutputDoubleRegister(), i.InputDoubleRegister(1)); |
- } |
+ ASSEMBLE_BIN_OP(DDInstr(debr), DMTInstr(DivFloat32), nullInstr); |
break; |
case kS390_DivDouble: |
- // InputDoubleRegister(1)=InputDoubleRegister(0)/InputDoubleRegister(1) |
- if (i.OutputDoubleRegister().is(i.InputDoubleRegister(1))) { |
- __ ldr(kScratchDoubleReg, i.InputDoubleRegister(1)); |
- __ ldr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); |
- __ ddbr(i.OutputDoubleRegister(), kScratchDoubleReg); |
- } else { |
- if (!i.OutputDoubleRegister().is(i.InputDoubleRegister(0))) |
- __ ldr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); |
- __ ddbr(i.OutputDoubleRegister(), i.InputDoubleRegister(1)); |
- } |
+ ASSEMBLE_BIN_OP(DDInstr(ddbr), DMTInstr(DivFloat64), nullInstr); |
break; |
case kS390_Mod32: |
- ASSEMBLE_BIN_OP(Mod32, Mod32, Mod32); |
+ ASSEMBLE_BIN32_OP(RRRInstr(Mod32), RRM32Instr(Mod32), nullInstr); |
break; |
case kS390_ModU32: |
- ASSEMBLE_BIN_OP(ModU32, ModU32, ModU32); |
+ ASSEMBLE_BIN32_OP(RRRInstr(ModU32), RRM32Instr(ModU32), nullInstr); |
break; |
-#if V8_TARGET_ARCH_S390X |
case kS390_Mod64: |
- __ LoadRR(r1, i.InputRegister(0)); |
- __ dsgr(r0, i.InputRegister(1)); // R1: Dividend |
- __ ltgr(i.OutputRegister(), r0); // Copy R0: Remainder to output |
+ ASSEMBLE_BIN_OP(RRRInstr(Mod64), RRM64Instr(Mod64), nullInstr); |
break; |
case kS390_ModU64: |
- __ LoadRR(r1, i.InputRegister(0)); |
- __ LoadImmP(r0, Operand::Zero()); |
- __ dlgr(r0, i.InputRegister(1)); // R0:R1: Dividend |
- __ ltgr(i.OutputRegister(), r0); // Copy R0: Remainder to output |
+ ASSEMBLE_BIN_OP(RRRInstr(ModU64), RRM64Instr(ModU64), nullInstr); |
break; |
-#endif |
case kS390_AbsFloat: |
__ lpebr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); |
break; |
case kS390_SqrtFloat: |
- ASSEMBLE_FLOAT_UNOP(sqebr); |
+ ASSEMBLE_UNARY_OP(D_DInstr(sqebr), nullInstr, nullInstr); |
+ break; |
+ case kS390_SqrtDouble: |
+ ASSEMBLE_UNARY_OP(D_DInstr(sqdbr), nullInstr, nullInstr); |
break; |
case kS390_FloorFloat: |
__ fiebra(i.OutputDoubleRegister(), i.InputDoubleRegister(0), |
@@ -1856,9 +1769,6 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( |
case kS390_AbsDouble: |
__ lpdbr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); |
break; |
- case kS390_SqrtDouble: |
- ASSEMBLE_FLOAT_UNOP(sqdbr); |
- break; |
case kS390_FloorDouble: |
__ fidbra(i.OutputDoubleRegister(), i.InputDoubleRegister(0), |
v8::internal::Assembler::FIDBRA_ROUND_TOWARD_NEG_INF); |
@@ -1876,10 +1786,10 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( |
v8::internal::Assembler::FIDBRA_ROUND_TO_NEAREST_AWAY_FROM_0); |
break; |
case kS390_NegFloat: |
- ASSEMBLE_FLOAT_UNOP(lcebr); |
+ ASSEMBLE_UNARY_OP(D_DInstr(lcebr), nullInstr, nullInstr); |
break; |
case kS390_NegDouble: |
- ASSEMBLE_FLOAT_UNOP(lcdbr); |
+ ASSEMBLE_UNARY_OP(D_DInstr(lcdbr), nullInstr, nullInstr); |
break; |
case kS390_Cntlz32: { |
__ llgfr(i.OutputRegister(), i.InputRegister(0)); |
@@ -2144,10 +2054,11 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( |
} |
#endif |
case kS390_DoubleToFloat32: |
- __ ledbr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); |
+ ASSEMBLE_UNARY_OP(D_DInstr(ledbr), nullInstr, nullInstr); |
break; |
case kS390_Float32ToDouble: |
- __ ldebr(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); |
+ ASSEMBLE_UNARY_OP(D_DInstr(ldebr), D_MTInstr(LoadFloat32ToDouble), |
+ nullInstr); |
break; |
case kS390_DoubleExtractLowWord32: |
__ lgdr(i.OutputRegister(), i.InputDoubleRegister(0)); |
@@ -2176,15 +2087,10 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( |
__ ldgr(i.OutputDoubleRegister(), kScratchReg); |
break; |
case kS390_LoadWordS8: |
- ASSEMBLE_LOAD_INTEGER(LoadlB); |
-#if V8_TARGET_ARCH_S390X |
- __ lgbr(i.OutputRegister(), i.OutputRegister()); |
-#else |
- __ lbr(i.OutputRegister(), i.OutputRegister()); |
-#endif |
+ ASSEMBLE_LOAD_INTEGER(LoadB); |
break; |
case kS390_BitcastFloat32ToInt32: |
- __ MovFloatToInt(i.OutputRegister(), i.InputDoubleRegister(0)); |
+ ASSEMBLE_UNARY_OP(R_DInstr(MovFloatToInt), R_MInstr(LoadlW), nullInstr); |
break; |
case kS390_BitcastInt32ToFloat32: |
__ MovIntToFloat(i.OutputDoubleRegister(), i.InputRegister(0)); |
@@ -2231,11 +2137,9 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( |
case kS390_LoadReverse64RR: |
__ lrvgr(i.OutputRegister(), i.InputRegister(0)); |
break; |
-#if V8_TARGET_ARCH_S390X |
case kS390_LoadWord64: |
ASSEMBLE_LOAD_INTEGER(lg); |
break; |
-#endif |
case kS390_LoadAndTestWord32: { |
ASSEMBLE_LOADANDTEST32(ltr, lt_z); |
break; |
@@ -2283,12 +2187,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( |
__ lay(i.OutputRegister(), i.MemoryOperand()); |
break; |
case kCheckedLoadInt8: |
- ASSEMBLE_CHECKED_LOAD_INTEGER(LoadlB); |
-#if V8_TARGET_ARCH_S390X |
- __ lgbr(i.OutputRegister(), i.OutputRegister()); |
-#else |
- __ lbr(i.OutputRegister(), i.OutputRegister()); |
-#endif |
+ ASSEMBLE_CHECKED_LOAD_INTEGER(LoadB); |
break; |
case kCheckedLoadUint8: |
ASSEMBLE_CHECKED_LOAD_INTEGER(LoadlB); |
@@ -2495,6 +2394,8 @@ void CodeGenerator::AssembleArchBoolean(Instruction* instr, |
: Operand(1)); |
__ bunordered(&done); |
} |
+ |
+ // TODO(john.yan): use load imm high on condition here |
__ LoadImmP(reg, Operand::Zero()); |
__ LoadImmP(kScratchReg, Operand(1)); |
// locr is sufficient since reg's upper 32 is guarrantee to be 0 |