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

Unified Diff: src/hydrogen.cc

Issue 10984057: Replace a set of Hydrogen instructions with rotate instructions on ARM (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 8 years, 3 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/hydrogen.cc
===================================================================
--- src/hydrogen.cc (revision 12582)
+++ src/hydrogen.cc (working copy)
@@ -1021,6 +1021,140 @@
};
+bool HGraph::TryRotateLeft(HInstruction* instr) {
+ HInstruction* current = instr;
+ ASSERT(current->IsBitwise());
+ HBitwise* bor = HBitwise::cast(current);
+ HShl* shl;
+ HShr* shr;
+ if (bor->left()->IsShl() && bor->right()->IsShr()) {
+ shl = HShl::cast(bor->left());
+ shr = HShr::cast(bor->right());
+ } else if (bor->left()->IsShr() && bor->right()->IsShl()) {
+ shl = HShl::cast(bor->right());
+ shr = HShr::cast(bor->left());
+ } else {
+ return false;
+ }
+
+
+ if (shl->UseCount()>1 || shr->UseCount()>1) return false;
ulan 2012/09/27 14:55:30 Please add space before and after each ">" operato
+ if (!shr->representation().IsInteger32() ||
+ !shl->representation().IsInteger32())
Erik Corry 2012/09/27 14:45:44 Missing {}
+ return false;
+ if (shl->left() != shr->left()) return false;
+
+ if (!shr->right()->representation().IsInteger32() ||
+ !shl->right()->representation().IsInteger32() ||
+ !shl->left()->representation().IsInteger32())
+ return false;
+
+ if (!shr->right()->IsSub()) return false;
Erik Corry 2012/09/27 14:45:44 This function needs a comment explaining what it i
+ HSub* sub = HSub::cast(shr->right());
+ if (!sub->left()->IsConstant() ||
+ !sub->left()->representation().IsInteger32() ||
+ !sub->right()->representation().IsInteger32())
+ return false;
+
+ if (HConstant::cast(sub->left())->Integer32Value() != 32) return false;
+
+ if (sub->right()->IsChange() && shl->right()->IsChange()) {
+ if (sub->right()->OperandAt(0) != shl->right()->OperandAt(0))
Erik Corry 2012/09/27 14:45:44 Missing {}
+ return false;
+ } else if (sub->right() != shl->right()) {
+ return false;
+ }
+
+ // start replacement
+ HValue* left = shr->left();
+ HValue* right = shr->right();
+ HValue* context = shr->context();
+ HInstruction* ror = new(zone()) HRor(context, left, right);
+ ror->InsertAfter(bor);
+ bor->DeleteAndReplaceWith(ror);
+ shl->DeleteAndReplaceWith(NULL);
+ shr->DeleteAndReplaceWith(NULL);
+
+ return true;
+}
+
+
+
+bool HGraph::TryRotateRight(HInstruction* instr) {
Erik Corry 2012/09/27 14:45:44 There is a lot of copied code here - can they be c
+ HInstruction* current = instr;
+ ASSERT(current->IsBitwise());
+ HBitwise* bor = HBitwise::cast(current);
+ HShl* shl;
+ HShr* shr;
+ if (bor->left()->IsShl() && bor->right()->IsShr()) {
ulan 2012/09/27 14:55:30 Please add space before and after each ">" operato
+ shl = HShl::cast(bor->left());
+ shr = HShr::cast(bor->right());
+ } else if (bor->left()->IsShr() && bor->right()->IsShl()) {
+ shl = HShl::cast(bor->right());
+ shr = HShr::cast(bor->left());
+ } else {
+ return false;
+ }
+ if (shl->UseCount()>1 || shr->UseCount()>1) return false;
+ if (!shr->representation().IsInteger32() ||
+ !shl->representation().IsInteger32())
+ return false;
+ if (shl->left() != shr->left()) return false;
+ if (!shr->right()->representation().IsInteger32() ||
+ !shl->right()->representation().IsInteger32() ||
+ !shl->left()->representation().IsInteger32())
+ return false;
+ if (!shl->right()->IsSub()) return false;
+ HSub* sub = HSub::cast(shl->right());
+ if (!sub->left()->IsConstant() ||
+ !sub->left()->representation().IsInteger32() ||
+ !sub->right()->representation().IsInteger32())
+ return false;
+ HConstant* constant = HConstant::cast(sub->left());
+ if (constant->Integer32Value() != 32) return false;
+
+ if (sub->right()->IsChange() && shl->right()->IsChange()) {
+ if (sub->right()->OperandAt(0) != shl->right()->OperandAt(0))
+ return false;
+ } else if (sub->right() != shl->right()) {
+ return false;
+ }
+
+ // start replacement
+ HValue* left = shr->left();
+ HValue* right = shr->right();
+ HValue* context = shr->context();
+ HInstruction* ror = new(zone()) HRor(context, left, right);
+ ror->InsertAfter(bor);
+ bor->DeleteAndReplaceWith(ror);
+ shl->DeleteAndReplaceWith(NULL);
+ shr->DeleteAndReplaceWith(NULL);
+ if (sub->HasNoUses()) sub->DeleteAndReplaceWith(NULL);
+ if (constant->HasNoUses()) constant->DeleteAndReplaceWith(NULL);
+
+ return true;
+}
+
+
+
+void HGraph::ReplaceWithRor() {
+ if (!FLAG_use_replace_with_ror) return;
+ HPhase phase("H_ReplaceWithRor", this);
+ for (int i = 0; i < blocks()->length(); ++i) {
+ HInstruction* instr = blocks()->at(i)->first();
+ while (instr != NULL) {
+ if (instr->IsBitwise() &&
+ HBitwise::cast(instr)->op() == Token::BIT_OR) {
+ if (!TryRotateLeft(instr)) {
+ TryRotateRight(instr);
+ }
+ }
+ instr = instr->next();
+ }
+ }
+}
+
+
void HGraph::OrderBlocks() {
HPhase phase("H_Block ordering");
BitVector visited(blocks_.length(), zone());
@@ -3402,6 +3536,10 @@
HStackCheckEliminator sce(this);
sce.Process();
+#if defined(V8_TARGET_ARCH_ARM)
ulan 2012/09/27 15:30:10 I am concerned with this ifdef. Hydrogen should co
+ ReplaceWithRor();
+#endif
+
EliminateRedundantBoundsChecks();
DehoistSimpleArrayIndexComputations();

Powered by Google App Engine
This is Rietveld 408576698