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

Unified Diff: runtime/vm/opt_code_generator_ia32.cc

Issue 9288086: Allocate inlined temporary double objects only if the parent node supports it; (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 11 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/opt_code_generator_ia32.cc
===================================================================
--- runtime/vm/opt_code_generator_ia32.cc (revision 3627)
+++ runtime/vm/opt_code_generator_ia32.cc (working copy)
@@ -30,6 +30,7 @@
// (name, type, default)
#define PROPERTY_LIST(V) \
V(is_temp, bool, false) \
+ V(allow_temp, bool, false) \
V(true_label, Label*, NULL) \
V(false_label, Label*, NULL) \
V(labels_used, bool, false) \
@@ -584,6 +585,7 @@
return;
}
CodeGenInfo value_info(node->value());
+ value_info.set_allow_temp(true);
value_info.set_request_result_in_eax(true);
node->value()->Visit(this);
if (value_info.is_temp()) {
@@ -880,7 +882,8 @@
__ movsd(FieldAddress(kResultRegister, Double::value_offset()), XMM1);
if (CodeGenerator::IsResultNeeded(node)) {
if (node->info() != NULL) {
- node->info()->set_is_temp(true);
+ // TODO(srdjan): Enable once we use a temporary object.
+ // node->info()->set_is_temp(true);
node->info()->set_is_class(&double_class_);
}
HandleResult(node, kResultRegister);
@@ -1137,10 +1140,14 @@
const Register kTempRegister = EBX;
CodeGenInfo left_info(node->left()); // Receiver.
CodeGenInfo right_info(node->right());
+ left_info.set_allow_temp(true);
+ right_info.set_allow_temp(true);
VisitLoadTwo(node->left(), node->right(), kLeftRegister, kRightRegister);
// First allocate result object or specify an existing object as result.
Register result_register = kNoRegister;
- if (node->info() == NULL) {
+ const bool using_temp =
+ (node->info() != NULL) && node->info()->allow_temp();
+ if (!using_temp) {
// Parent node cannot handle a temporary double object, allocate one
// each time.
result_register = kAllocatedRegister;
@@ -1246,7 +1253,7 @@
__ movsd(FieldAddress(result_register, Double::value_offset()), XMM0);
if (CodeGenerator::IsResultNeeded(node)) {
if (node->info() != NULL) {
- node->info()->set_is_temp(true);
+ node->info()->set_is_temp(using_temp);
node->info()->set_is_class(&double_class_);
}
HandleResult(node, result_register);
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698