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

Unified Diff: src/compiler/arm64/instruction-selector-arm64.cc

Issue 1945783002: [turbofan] ARM64: Use zr to store immediate zero (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 8 months 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
Index: src/compiler/arm64/instruction-selector-arm64.cc
diff --git a/src/compiler/arm64/instruction-selector-arm64.cc b/src/compiler/arm64/instruction-selector-arm64.cc
index 7114077ff9a86328142000c3e3fc84c2936191ee..f95fd7e811c9b037f2715d040574d57524b6575c 100644
--- a/src/compiler/arm64/instruction-selector-arm64.cc
+++ b/src/compiler/arm64/instruction-selector-arm64.cc
@@ -40,7 +40,9 @@ class Arm64OperandGenerator final : public OperandGenerator {
// Use the zero register if the node has the immediate value zero, otherwise
// assign a register.
InstructionOperand UseRegisterOrImmediateZero(Node* node) {
- if (IsIntegerConstant(node) && (GetIntegerConstantValue(node) == 0)) {
+ if ((IsIntegerConstant(node) && (GetIntegerConstantValue(node) == 0)) ||
+ (IsFloatConstant(node) && (GetFloatConstantValue(node) == 0.0) &&
+ (copysign(1.0, GetFloatConstantValue(node)) > 0.0))) {
Benedikt Meurer 2016/05/03 17:33:20 Use std::signbit here, or even easier use bit_cast
martyn.capewell 2016/05/04 09:47:47 Done.
return UseImmediate(node);
}
return UseRegister(node);
@@ -68,6 +70,19 @@ class Arm64OperandGenerator final : public OperandGenerator {
return OpParameter<int64_t>(node);
}
+ bool IsFloatConstant(Node* node) {
+ return (node->opcode() == IrOpcode::kFloat32Constant) ||
+ (node->opcode() == IrOpcode::kFloat64Constant);
+ }
+
+ double GetFloatConstantValue(Node* node) {
+ if (node->opcode() == IrOpcode::kFloat32Constant) {
+ return OpParameter<float>(node);
+ }
+ DCHECK(node->opcode() == IrOpcode::kFloat64Constant);
Benedikt Meurer 2016/05/03 17:33:20 Nit: Use DCHECK_EQ(IrOpcode::kFloat64Constant, nod
martyn.capewell 2016/05/04 09:47:47 Done.
+ return OpParameter<double>(node);
+ }
+
bool CanBeImmediate(Node* node, ImmediateMode mode) {
return IsIntegerConstant(node) &&
CanBeImmediate(GetIntegerConstantValue(node), mode);
@@ -477,10 +492,12 @@ void InstructionSelector::VisitStore(Node* node) {
}
if (g.CanBeImmediate(index, immediate_mode)) {
Emit(opcode | AddressingModeField::encode(kMode_MRI), g.NoOutput(),
- g.UseRegister(base), g.UseImmediate(index), g.UseRegister(value));
+ g.UseRegister(base), g.UseImmediate(index),
+ g.UseRegisterOrImmediateZero(value));
} else {
Emit(opcode | AddressingModeField::encode(kMode_MRR), g.NoOutput(),
- g.UseRegister(base), g.UseRegister(index), g.UseRegister(value));
+ g.UseRegister(base), g.UseRegister(index),
+ g.UseRegisterOrImmediateZero(value));
}
}
}
@@ -559,7 +576,8 @@ void InstructionSelector::VisitCheckedStore(Node* node) {
return;
}
Emit(opcode, g.NoOutput(), g.UseRegister(buffer), g.UseRegister(offset),
- g.UseOperand(length, kArithmeticImm), g.UseRegister(value));
+ g.UseOperand(length, kArithmeticImm),
+ g.UseRegisterOrImmediateZero(value));
}

Powered by Google App Engine
This is Rietveld 408576698