OLD | NEW |
1 // Copyright 2009 the V8 project authors. All rights reserved. | 1 // Copyright 2009 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 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
155 | 155 |
156 void VirtualFrame::MakeMergable() { | 156 void VirtualFrame::MakeMergable() { |
157 for (int i = 0; i < element_count(); i++) { | 157 for (int i = 0; i < element_count(); i++) { |
158 FrameElement element = elements_[i]; | 158 FrameElement element = elements_[i]; |
159 | 159 |
160 // All number type information is reset to unknown for a mergable frame | 160 // All number type information is reset to unknown for a mergable frame |
161 // because of incoming back edges. | 161 // because of incoming back edges. |
162 if (element.is_constant() || element.is_copy()) { | 162 if (element.is_constant() || element.is_copy()) { |
163 if (element.is_synced()) { | 163 if (element.is_synced()) { |
164 // Just spill. | 164 // Just spill. |
165 elements_[i] = FrameElement::MemoryElement(NumberInfo::kUnknown); | 165 elements_[i] = FrameElement::MemoryElement(NumberInfo::Unknown()); |
166 } else { | 166 } else { |
167 // Allocate to a register. | 167 // Allocate to a register. |
168 FrameElement backing_element; // Invalid if not a copy. | 168 FrameElement backing_element; // Invalid if not a copy. |
169 if (element.is_copy()) { | 169 if (element.is_copy()) { |
170 backing_element = elements_[element.index()]; | 170 backing_element = elements_[element.index()]; |
171 } | 171 } |
172 Result fresh = cgen()->allocator()->Allocate(); | 172 Result fresh = cgen()->allocator()->Allocate(); |
173 ASSERT(fresh.is_valid()); // A register was spilled if all were in use. | 173 ASSERT(fresh.is_valid()); // A register was spilled if all were in use. |
174 elements_[i] = | 174 elements_[i] = |
175 FrameElement::RegisterElement(fresh.reg(), | 175 FrameElement::RegisterElement(fresh.reg(), |
176 FrameElement::NOT_SYNCED, | 176 FrameElement::NOT_SYNCED, |
177 NumberInfo::kUnknown); | 177 NumberInfo::Unknown()); |
178 Use(fresh.reg(), i); | 178 Use(fresh.reg(), i); |
179 | 179 |
180 // Emit a move. | 180 // Emit a move. |
181 if (element.is_constant()) { | 181 if (element.is_constant()) { |
182 if (cgen()->IsUnsafeSmi(element.handle())) { | 182 if (cgen()->IsUnsafeSmi(element.handle())) { |
183 cgen()->MoveUnsafeSmi(fresh.reg(), element.handle()); | 183 cgen()->MoveUnsafeSmi(fresh.reg(), element.handle()); |
184 } else { | 184 } else { |
185 __ Set(fresh.reg(), Immediate(element.handle())); | 185 __ Set(fresh.reg(), Immediate(element.handle())); |
186 } | 186 } |
187 } else { | 187 } else { |
(...skipping 12 matching lines...) Expand all Loading... |
200 } | 200 } |
201 } | 201 } |
202 } | 202 } |
203 // No need to set the copied flag --- there are no copies. | 203 // No need to set the copied flag --- there are no copies. |
204 } else { | 204 } else { |
205 // Clear the copy flag of non-constant, non-copy elements. | 205 // Clear the copy flag of non-constant, non-copy elements. |
206 // They cannot be copied because copies are not allowed. | 206 // They cannot be copied because copies are not allowed. |
207 // The copy flag is not relied on before the end of this loop, | 207 // The copy flag is not relied on before the end of this loop, |
208 // including when registers are spilled. | 208 // including when registers are spilled. |
209 elements_[i].clear_copied(); | 209 elements_[i].clear_copied(); |
210 elements_[i].set_number_info(NumberInfo::kUnknown); | 210 elements_[i].set_number_info(NumberInfo::Unknown()); |
211 } | 211 } |
212 } | 212 } |
213 } | 213 } |
214 | 214 |
215 | 215 |
216 void VirtualFrame::MergeTo(VirtualFrame* expected) { | 216 void VirtualFrame::MergeTo(VirtualFrame* expected) { |
217 Comment cmnt(masm(), "[ Merge frame"); | 217 Comment cmnt(masm(), "[ Merge frame"); |
218 // We should always be merging the code generator's current frame to an | 218 // We should always be merging the code generator's current frame to an |
219 // expected frame. | 219 // expected frame. |
220 ASSERT(cgen()->frame() == this); | 220 ASSERT(cgen()->frame() == this); |
(...skipping 834 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1055 } | 1055 } |
1056 } | 1056 } |
1057 | 1057 |
1058 | 1058 |
1059 Result VirtualFrame::Pop() { | 1059 Result VirtualFrame::Pop() { |
1060 FrameElement element = elements_.RemoveLast(); | 1060 FrameElement element = elements_.RemoveLast(); |
1061 int index = element_count(); | 1061 int index = element_count(); |
1062 ASSERT(element.is_valid()); | 1062 ASSERT(element.is_valid()); |
1063 | 1063 |
1064 // Get number type information of the result. | 1064 // Get number type information of the result. |
1065 NumberInfo::Type info; | 1065 NumberInfo info; |
1066 if (!element.is_copy()) { | 1066 if (!element.is_copy()) { |
1067 info = element.number_info(); | 1067 info = element.number_info(); |
1068 } else { | 1068 } else { |
1069 info = elements_[element.index()].number_info(); | 1069 info = elements_[element.index()].number_info(); |
1070 } | 1070 } |
1071 | 1071 |
1072 bool pop_needed = (stack_pointer_ == index); | 1072 bool pop_needed = (stack_pointer_ == index); |
1073 if (pop_needed) { | 1073 if (pop_needed) { |
1074 stack_pointer_--; | 1074 stack_pointer_--; |
1075 if (element.is_memory()) { | 1075 if (element.is_memory()) { |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1130 | 1130 |
1131 | 1131 |
1132 void VirtualFrame::EmitPop(Operand operand) { | 1132 void VirtualFrame::EmitPop(Operand operand) { |
1133 ASSERT(stack_pointer_ == element_count() - 1); | 1133 ASSERT(stack_pointer_ == element_count() - 1); |
1134 stack_pointer_--; | 1134 stack_pointer_--; |
1135 elements_.RemoveLast(); | 1135 elements_.RemoveLast(); |
1136 __ pop(operand); | 1136 __ pop(operand); |
1137 } | 1137 } |
1138 | 1138 |
1139 | 1139 |
1140 void VirtualFrame::EmitPush(Register reg, NumberInfo::Type info) { | 1140 void VirtualFrame::EmitPush(Register reg, NumberInfo info) { |
1141 ASSERT(stack_pointer_ == element_count() - 1); | 1141 ASSERT(stack_pointer_ == element_count() - 1); |
1142 elements_.Add(FrameElement::MemoryElement(info)); | 1142 elements_.Add(FrameElement::MemoryElement(info)); |
1143 stack_pointer_++; | 1143 stack_pointer_++; |
1144 __ push(reg); | 1144 __ push(reg); |
1145 } | 1145 } |
1146 | 1146 |
1147 | 1147 |
1148 void VirtualFrame::EmitPush(Operand operand, NumberInfo::Type info) { | 1148 void VirtualFrame::EmitPush(Operand operand, NumberInfo info) { |
1149 ASSERT(stack_pointer_ == element_count() - 1); | 1149 ASSERT(stack_pointer_ == element_count() - 1); |
1150 elements_.Add(FrameElement::MemoryElement(info)); | 1150 elements_.Add(FrameElement::MemoryElement(info)); |
1151 stack_pointer_++; | 1151 stack_pointer_++; |
1152 __ push(operand); | 1152 __ push(operand); |
1153 } | 1153 } |
1154 | 1154 |
1155 | 1155 |
1156 void VirtualFrame::EmitPush(Immediate immediate, NumberInfo::Type info) { | 1156 void VirtualFrame::EmitPush(Immediate immediate, NumberInfo info) { |
1157 ASSERT(stack_pointer_ == element_count() - 1); | 1157 ASSERT(stack_pointer_ == element_count() - 1); |
1158 elements_.Add(FrameElement::MemoryElement(info)); | 1158 elements_.Add(FrameElement::MemoryElement(info)); |
1159 stack_pointer_++; | 1159 stack_pointer_++; |
1160 __ push(immediate); | 1160 __ push(immediate); |
1161 } | 1161 } |
1162 | 1162 |
1163 | 1163 |
1164 void VirtualFrame::Push(Expression* expr) { | 1164 void VirtualFrame::Push(Expression* expr) { |
1165 ASSERT(expr->IsTrivial()); | 1165 ASSERT(expr->IsTrivial()); |
1166 | 1166 |
1167 Literal* lit = expr->AsLiteral(); | 1167 Literal* lit = expr->AsLiteral(); |
1168 if (lit != NULL) { | 1168 if (lit != NULL) { |
1169 Push(lit->handle()); | 1169 Push(lit->handle()); |
1170 return; | 1170 return; |
1171 } | 1171 } |
1172 | 1172 |
1173 VariableProxy* proxy = expr->AsVariableProxy(); | 1173 VariableProxy* proxy = expr->AsVariableProxy(); |
1174 if (proxy != NULL && proxy->is_this()) { | 1174 if (proxy != NULL && proxy->is_this()) { |
1175 PushParameterAt(-1); | 1175 PushParameterAt(-1); |
1176 return; | 1176 return; |
1177 } | 1177 } |
1178 | 1178 |
1179 UNREACHABLE(); | 1179 UNREACHABLE(); |
1180 } | 1180 } |
1181 | 1181 |
1182 | 1182 |
1183 #undef __ | 1183 #undef __ |
1184 | 1184 |
1185 } } // namespace v8::internal | 1185 } } // namespace v8::internal |
OLD | NEW |