| Index: src/compiler/ppc/code-generator-ppc.cc
|
| diff --git a/src/compiler/ppc/code-generator-ppc.cc b/src/compiler/ppc/code-generator-ppc.cc
|
| index 550cb230a947f17681484e2c53bd7ec347afdbe8..e1a7be2b3cc44a943d07a10ccd3682a1d849e6f3 100644
|
| --- a/src/compiler/ppc/code-generator-ppc.cc
|
| +++ b/src/compiler/ppc/code-generator-ppc.cc
|
| @@ -201,7 +201,7 @@ class OutOfLineRecordWrite final : public OutOfLineCode {
|
| };
|
|
|
|
|
| -Condition FlagsConditionToCondition(FlagsCondition condition) {
|
| +Condition FlagsConditionToCondition(FlagsCondition condition, ArchOpcode op) {
|
| switch (condition) {
|
| case kEqual:
|
| return eq;
|
| @@ -220,17 +220,42 @@ Condition FlagsConditionToCondition(FlagsCondition condition) {
|
| case kUnsignedGreaterThan:
|
| return gt;
|
| case kOverflow:
|
| + // Overflow checked for add/sub only.
|
| + switch (op) {
|
| #if V8_TARGET_ARCH_PPC64
|
| - return ne;
|
| + case kPPC_Add:
|
| + case kPPC_Sub:
|
| + return lt;
|
| +#endif
|
| + case kPPC_AddWithOverflow32:
|
| + case kPPC_SubWithOverflow32:
|
| +#if V8_TARGET_ARCH_PPC64
|
| + return ne;
|
| #else
|
| - return lt;
|
| + return lt;
|
| #endif
|
| + default:
|
| + break;
|
| + }
|
| + break;
|
| case kNotOverflow:
|
| + switch (op) {
|
| #if V8_TARGET_ARCH_PPC64
|
| - return eq;
|
| + case kPPC_Add:
|
| + case kPPC_Sub:
|
| + return ge;
|
| +#endif
|
| + case kPPC_AddWithOverflow32:
|
| + case kPPC_SubWithOverflow32:
|
| +#if V8_TARGET_ARCH_PPC64
|
| + return eq;
|
| #else
|
| - return ge;
|
| + return ge;
|
| #endif
|
| + default:
|
| + break;
|
| + }
|
| + break;
|
| default:
|
| break;
|
| }
|
| @@ -290,13 +315,6 @@ Condition FlagsConditionToCondition(FlagsCondition condition) {
|
| } while (0)
|
|
|
|
|
| -#if V8_TARGET_ARCH_PPC64
|
| -#define ASSEMBLE_ADD_WITH_OVERFLOW() \
|
| - do { \
|
| - ASSEMBLE_BINOP(add, addi); \
|
| - __ TestIfInt32(i.OutputRegister(), r0, cr0); \
|
| - } while (0)
|
| -#else
|
| #define ASSEMBLE_ADD_WITH_OVERFLOW() \
|
| do { \
|
| if (HasRegisterInput(instr, 1)) { \
|
| @@ -307,16 +325,8 @@ Condition FlagsConditionToCondition(FlagsCondition condition) {
|
| i.InputInt32(1), kScratchReg, r0); \
|
| } \
|
| } while (0)
|
| -#endif
|
|
|
|
|
| -#if V8_TARGET_ARCH_PPC64
|
| -#define ASSEMBLE_SUB_WITH_OVERFLOW() \
|
| - do { \
|
| - ASSEMBLE_BINOP(sub, subi); \
|
| - __ TestIfInt32(i.OutputRegister(), r0, cr0); \
|
| - } while (0)
|
| -#else
|
| #define ASSEMBLE_SUB_WITH_OVERFLOW() \
|
| do { \
|
| if (HasRegisterInput(instr, 1)) { \
|
| @@ -327,6 +337,24 @@ Condition FlagsConditionToCondition(FlagsCondition condition) {
|
| -i.InputInt32(1), kScratchReg, r0); \
|
| } \
|
| } while (0)
|
| +
|
| +
|
| +#if V8_TARGET_ARCH_PPC64
|
| +#define ASSEMBLE_ADD_WITH_OVERFLOW32() \
|
| + do { \
|
| + ASSEMBLE_BINOP(add, addi); \
|
| + __ TestIfInt32(i.OutputRegister(), r0, cr0); \
|
| + } while (0)
|
| +
|
| +
|
| +#define ASSEMBLE_SUB_WITH_OVERFLOW32() \
|
| + do { \
|
| + ASSEMBLE_BINOP(sub, subi); \
|
| + __ TestIfInt32(i.OutputRegister(), r0, cr0); \
|
| + } while (0)
|
| +#else
|
| +#define ASSEMBLE_ADD_WITH_OVERFLOW32 ASSEMBLE_ADD_WITH_OVERFLOW
|
| +#define ASSEMBLE_SUB_WITH_OVERFLOW32 ASSEMBLE_SUB_WITH_OVERFLOW
|
| #endif
|
|
|
|
|
| @@ -903,31 +931,47 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) {
|
| break;
|
| #endif
|
| case kPPC_Add:
|
| - if (HasRegisterInput(instr, 1)) {
|
| - __ add(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1),
|
| - LeaveOE, i.OutputRCBit());
|
| +#if V8_TARGET_ARCH_PPC64
|
| + if (FlagsModeField::decode(instr->opcode()) != kFlags_none) {
|
| + ASSEMBLE_ADD_WITH_OVERFLOW();
|
| } else {
|
| - __ addi(i.OutputRegister(), i.InputRegister(0), i.InputImmediate(1));
|
| - DCHECK_EQ(LeaveRC, i.OutputRCBit());
|
| +#endif
|
| + if (HasRegisterInput(instr, 1)) {
|
| + __ add(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1),
|
| + LeaveOE, i.OutputRCBit());
|
| + } else {
|
| + __ addi(i.OutputRegister(), i.InputRegister(0), i.InputImmediate(1));
|
| + DCHECK_EQ(LeaveRC, i.OutputRCBit());
|
| + }
|
| +#if V8_TARGET_ARCH_PPC64
|
| }
|
| +#endif
|
| break;
|
| case kPPC_AddWithOverflow32:
|
| - ASSEMBLE_ADD_WITH_OVERFLOW();
|
| + ASSEMBLE_ADD_WITH_OVERFLOW32();
|
| break;
|
| case kPPC_AddDouble:
|
| ASSEMBLE_FLOAT_BINOP_RC(fadd);
|
| break;
|
| case kPPC_Sub:
|
| - if (HasRegisterInput(instr, 1)) {
|
| - __ sub(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1),
|
| - LeaveOE, i.OutputRCBit());
|
| +#if V8_TARGET_ARCH_PPC64
|
| + if (FlagsModeField::decode(instr->opcode()) != kFlags_none) {
|
| + ASSEMBLE_SUB_WITH_OVERFLOW();
|
| } else {
|
| - __ subi(i.OutputRegister(), i.InputRegister(0), i.InputImmediate(1));
|
| - DCHECK_EQ(LeaveRC, i.OutputRCBit());
|
| +#endif
|
| + if (HasRegisterInput(instr, 1)) {
|
| + __ sub(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1),
|
| + LeaveOE, i.OutputRCBit());
|
| + } else {
|
| + __ subi(i.OutputRegister(), i.InputRegister(0), i.InputImmediate(1));
|
| + DCHECK_EQ(LeaveRC, i.OutputRCBit());
|
| + }
|
| +#if V8_TARGET_ARCH_PPC64
|
| }
|
| +#endif
|
| break;
|
| case kPPC_SubWithOverflow32:
|
| - ASSEMBLE_SUB_WITH_OVERFLOW();
|
| + ASSEMBLE_SUB_WITH_OVERFLOW32();
|
| break;
|
| case kPPC_SubDouble:
|
| ASSEMBLE_FLOAT_BINOP_RC(fsub);
|
| @@ -1128,8 +1172,7 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) {
|
| DCHECK_EQ(LeaveRC, i.OutputRCBit());
|
| break;
|
| case kPPC_Int64ToInt32:
|
| - // TODO(mbrandy): sign extend?
|
| - __ Move(i.OutputRegister(), i.InputRegister(0));
|
| + __ extsw(i.OutputRegister(), i.InputRegister(0));
|
| DCHECK_EQ(LeaveRC, i.OutputRCBit());
|
| break;
|
| case kPPC_Int64ToFloat32:
|
| @@ -1370,11 +1413,7 @@ void CodeGenerator::AssembleArchBranch(Instruction* instr, BranchInfo* branch) {
|
| FlagsCondition condition = branch->condition;
|
| CRegister cr = cr0;
|
|
|
| - // Overflow checked for add/sub only.
|
| - DCHECK((condition != kOverflow && condition != kNotOverflow) ||
|
| - (op == kPPC_AddWithOverflow32 || op == kPPC_SubWithOverflow32));
|
| -
|
| - Condition cond = FlagsConditionToCondition(condition);
|
| + Condition cond = FlagsConditionToCondition(condition, op);
|
| if (op == kPPC_CmpDouble) {
|
| // check for unordered if necessary
|
| if (cond == le) {
|
| @@ -1404,16 +1443,12 @@ void CodeGenerator::AssembleArchBoolean(Instruction* instr,
|
| bool check_unordered = (op == kPPC_CmpDouble);
|
| CRegister cr = cr0;
|
|
|
| - // Overflow checked for add/sub only.
|
| - DCHECK((condition != kOverflow && condition != kNotOverflow) ||
|
| - (op == kPPC_AddWithOverflow32 || op == kPPC_SubWithOverflow32));
|
| -
|
| // Materialize a full 32-bit 1 or 0 value. The result register is always the
|
| // last output of the instruction.
|
| DCHECK_NE(0u, instr->OutputCount());
|
| Register reg = i.OutputRegister(instr->OutputCount() - 1);
|
|
|
| - Condition cond = FlagsConditionToCondition(condition);
|
| + Condition cond = FlagsConditionToCondition(condition, op);
|
| switch (cond) {
|
| case eq:
|
| case lt:
|
|
|