Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(802)

Unified Diff: src/compiler/ppc/code-generator-ppc.cc

Issue 1552783002: PPC: [turbofan] Add Int64(Add|Sub)WithOverflow support. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | src/compiler/ppc/instruction-selector-ppc.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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:
« no previous file with comments | « no previous file | src/compiler/ppc/instruction-selector-ppc.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698