summaryrefslogtreecommitdiff
path: root/compiler/optimizing/instruction_simplifier_shared.cc
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/optimizing/instruction_simplifier_shared.cc')
-rw-r--r--compiler/optimizing/instruction_simplifier_shared.cc19
1 files changed, 19 insertions, 0 deletions
diff --git a/compiler/optimizing/instruction_simplifier_shared.cc b/compiler/optimizing/instruction_simplifier_shared.cc
index b7d76da548..7f575c0348 100644
--- a/compiler/optimizing/instruction_simplifier_shared.cc
+++ b/compiler/optimizing/instruction_simplifier_shared.cc
@@ -316,4 +316,23 @@ bool TryReplaceSubSubWithSubAdd(HSub* last_sub) {
}
}
+void UnfoldRotateLeft(HRol* rol) {
+ HBasicBlock* block = rol->GetBlock();
+ HGraph* graph = block->GetGraph();
+ ArenaAllocator* allocator = graph->GetAllocator();
+ HRor* ror;
+
+ if (rol->GetRight()->IsConstant()) {
+ int32_t value = rol->GetRight()->AsIntConstant()->GetValue();
+ HIntConstant* negated = graph->GetIntConstant(-value);
+ ror = new (allocator) HRor(rol->GetType(), rol->GetLeft(), negated);
+ } else {
+ HNeg* neg = new (allocator) HNeg(DataType::Type::kInt32, rol->GetRight());
+ block->InsertInstructionBefore(neg, rol);
+ ror = new (allocator) HRor(rol->GetType(), rol->GetLeft(), neg);
+ }
+
+ block->ReplaceAndRemoveInstructionWith(rol, ror);
+}
+
} // namespace art