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

Side by Side 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, 2 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 1003 matching lines...) Expand 10 before | Expand all | Expand 10 after
1014 PostorderProcessor* child_; 1014 PostorderProcessor* child_;
1015 HLoopInformation* loop_; 1015 HLoopInformation* loop_;
1016 HBasicBlock* block_; 1016 HBasicBlock* block_;
1017 HBasicBlock* loop_header_; 1017 HBasicBlock* loop_header_;
1018 int loop_index; 1018 int loop_index;
1019 int loop_length; 1019 int loop_length;
1020 HSuccessorIterator successor_iterator; 1020 HSuccessorIterator successor_iterator;
1021 }; 1021 };
1022 1022
1023 1023
1024 bool HGraph::TryRotateLeft(HInstruction* instr) {
1025 HInstruction* current = instr;
1026 ASSERT(current->IsBitwise());
1027 HBitwise* bor = HBitwise::cast(current);
1028 HShl* shl;
1029 HShr* shr;
1030 if (bor->left()->IsShl() && bor->right()->IsShr()) {
1031 shl = HShl::cast(bor->left());
1032 shr = HShr::cast(bor->right());
1033 } else if (bor->left()->IsShr() && bor->right()->IsShl()) {
1034 shl = HShl::cast(bor->right());
1035 shr = HShr::cast(bor->left());
1036 } else {
1037 return false;
1038 }
1039
1040
1041 if (shl->UseCount()>1 || shr->UseCount()>1) return false;
ulan 2012/09/27 14:55:30 Please add space before and after each ">" operato
1042 if (!shr->representation().IsInteger32() ||
1043 !shl->representation().IsInteger32())
Erik Corry 2012/09/27 14:45:44 Missing {}
1044 return false;
1045 if (shl->left() != shr->left()) return false;
1046
1047 if (!shr->right()->representation().IsInteger32() ||
1048 !shl->right()->representation().IsInteger32() ||
1049 !shl->left()->representation().IsInteger32())
1050 return false;
1051
1052 if (!shr->right()->IsSub()) return false;
Erik Corry 2012/09/27 14:45:44 This function needs a comment explaining what it i
1053 HSub* sub = HSub::cast(shr->right());
1054 if (!sub->left()->IsConstant() ||
1055 !sub->left()->representation().IsInteger32() ||
1056 !sub->right()->representation().IsInteger32())
1057 return false;
1058
1059 if (HConstant::cast(sub->left())->Integer32Value() != 32) return false;
1060
1061 if (sub->right()->IsChange() && shl->right()->IsChange()) {
1062 if (sub->right()->OperandAt(0) != shl->right()->OperandAt(0))
Erik Corry 2012/09/27 14:45:44 Missing {}
1063 return false;
1064 } else if (sub->right() != shl->right()) {
1065 return false;
1066 }
1067
1068 // start replacement
1069 HValue* left = shr->left();
1070 HValue* right = shr->right();
1071 HValue* context = shr->context();
1072 HInstruction* ror = new(zone()) HRor(context, left, right);
1073 ror->InsertAfter(bor);
1074 bor->DeleteAndReplaceWith(ror);
1075 shl->DeleteAndReplaceWith(NULL);
1076 shr->DeleteAndReplaceWith(NULL);
1077
1078 return true;
1079 }
1080
1081
1082
1083 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
1084 HInstruction* current = instr;
1085 ASSERT(current->IsBitwise());
1086 HBitwise* bor = HBitwise::cast(current);
1087 HShl* shl;
1088 HShr* shr;
1089 if (bor->left()->IsShl() && bor->right()->IsShr()) {
ulan 2012/09/27 14:55:30 Please add space before and after each ">" operato
1090 shl = HShl::cast(bor->left());
1091 shr = HShr::cast(bor->right());
1092 } else if (bor->left()->IsShr() && bor->right()->IsShl()) {
1093 shl = HShl::cast(bor->right());
1094 shr = HShr::cast(bor->left());
1095 } else {
1096 return false;
1097 }
1098 if (shl->UseCount()>1 || shr->UseCount()>1) return false;
1099 if (!shr->representation().IsInteger32() ||
1100 !shl->representation().IsInteger32())
1101 return false;
1102 if (shl->left() != shr->left()) return false;
1103 if (!shr->right()->representation().IsInteger32() ||
1104 !shl->right()->representation().IsInteger32() ||
1105 !shl->left()->representation().IsInteger32())
1106 return false;
1107 if (!shl->right()->IsSub()) return false;
1108 HSub* sub = HSub::cast(shl->right());
1109 if (!sub->left()->IsConstant() ||
1110 !sub->left()->representation().IsInteger32() ||
1111 !sub->right()->representation().IsInteger32())
1112 return false;
1113 HConstant* constant = HConstant::cast(sub->left());
1114 if (constant->Integer32Value() != 32) return false;
1115
1116 if (sub->right()->IsChange() && shl->right()->IsChange()) {
1117 if (sub->right()->OperandAt(0) != shl->right()->OperandAt(0))
1118 return false;
1119 } else if (sub->right() != shl->right()) {
1120 return false;
1121 }
1122
1123 // start replacement
1124 HValue* left = shr->left();
1125 HValue* right = shr->right();
1126 HValue* context = shr->context();
1127 HInstruction* ror = new(zone()) HRor(context, left, right);
1128 ror->InsertAfter(bor);
1129 bor->DeleteAndReplaceWith(ror);
1130 shl->DeleteAndReplaceWith(NULL);
1131 shr->DeleteAndReplaceWith(NULL);
1132 if (sub->HasNoUses()) sub->DeleteAndReplaceWith(NULL);
1133 if (constant->HasNoUses()) constant->DeleteAndReplaceWith(NULL);
1134
1135 return true;
1136 }
1137
1138
1139
1140 void HGraph::ReplaceWithRor() {
1141 if (!FLAG_use_replace_with_ror) return;
1142 HPhase phase("H_ReplaceWithRor", this);
1143 for (int i = 0; i < blocks()->length(); ++i) {
1144 HInstruction* instr = blocks()->at(i)->first();
1145 while (instr != NULL) {
1146 if (instr->IsBitwise() &&
1147 HBitwise::cast(instr)->op() == Token::BIT_OR) {
1148 if (!TryRotateLeft(instr)) {
1149 TryRotateRight(instr);
1150 }
1151 }
1152 instr = instr->next();
1153 }
1154 }
1155 }
1156
1157
1024 void HGraph::OrderBlocks() { 1158 void HGraph::OrderBlocks() {
1025 HPhase phase("H_Block ordering"); 1159 HPhase phase("H_Block ordering");
1026 BitVector visited(blocks_.length(), zone()); 1160 BitVector visited(blocks_.length(), zone());
1027 1161
1028 ZoneList<HBasicBlock*> reverse_result(8, zone()); 1162 ZoneList<HBasicBlock*> reverse_result(8, zone());
1029 HBasicBlock* start = blocks_[0]; 1163 HBasicBlock* start = blocks_[0];
1030 PostorderProcessor* postorder = 1164 PostorderProcessor* postorder =
1031 PostorderProcessor::CreateEntryProcessor(zone(), start, &visited); 1165 PostorderProcessor::CreateEntryProcessor(zone(), start, &visited);
1032 while (postorder != NULL) { 1166 while (postorder != NULL) {
1033 postorder = postorder->PerformStep(zone(), &visited, &reverse_result); 1167 postorder = postorder->PerformStep(zone(), &visited, &reverse_result);
(...skipping 2361 matching lines...) Expand 10 before | Expand all | Expand 10 after
3395 if (FLAG_use_range) { 3529 if (FLAG_use_range) {
3396 HRangeAnalysis rangeAnalysis(this); 3530 HRangeAnalysis rangeAnalysis(this);
3397 rangeAnalysis.Analyze(); 3531 rangeAnalysis.Analyze();
3398 } 3532 }
3399 ComputeMinusZeroChecks(); 3533 ComputeMinusZeroChecks();
3400 3534
3401 // Eliminate redundant stack checks on backwards branches. 3535 // Eliminate redundant stack checks on backwards branches.
3402 HStackCheckEliminator sce(this); 3536 HStackCheckEliminator sce(this);
3403 sce.Process(); 3537 sce.Process();
3404 3538
3539 #if defined(V8_TARGET_ARCH_ARM)
ulan 2012/09/27 15:30:10 I am concerned with this ifdef. Hydrogen should co
3540 ReplaceWithRor();
3541 #endif
3542
3405 EliminateRedundantBoundsChecks(); 3543 EliminateRedundantBoundsChecks();
3406 DehoistSimpleArrayIndexComputations(); 3544 DehoistSimpleArrayIndexComputations();
3407 3545
3408 return true; 3546 return true;
3409 } 3547 }
3410 3548
3411 3549
3412 // We try to "factor up" HBoundsCheck instructions towards the root of the 3550 // We try to "factor up" HBoundsCheck instructions towards the root of the
3413 // dominator tree. 3551 // dominator tree.
3414 // For now we handle checks where the index is like "exp + int32value". 3552 // For now we handle checks where the index is like "exp + int32value".
(...skipping 6568 matching lines...) Expand 10 before | Expand all | Expand 10 after
9983 } 10121 }
9984 } 10122 }
9985 10123
9986 #ifdef DEBUG 10124 #ifdef DEBUG
9987 if (graph_ != NULL) graph_->Verify(false); // No full verify. 10125 if (graph_ != NULL) graph_->Verify(false); // No full verify.
9988 if (allocator_ != NULL) allocator_->Verify(); 10126 if (allocator_ != NULL) allocator_->Verify();
9989 #endif 10127 #endif
9990 } 10128 }
9991 10129
9992 } } // namespace v8::internal 10130 } } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698