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

Side by Side Diff: src/virtual-frame-ia32.cc

Issue 21392: Change compiler to safely write unsafe smis when they are spilled from... (Closed) Base URL: http://v8.googlecode.com/svn/branches/experimental/toiger/
Patch Set: '' Created 11 years, 10 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
« src/codegen-ia32.cc ('K') | « src/register-allocator-ia32.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2008 the V8 project authors. All rights reserved. 1 // Copyright 2008 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 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
72 // There was an early bailout for invalid and synced elements 72 // There was an early bailout for invalid and synced elements
73 // (memory elements are always synced). 73 // (memory elements are always synced).
74 UNREACHABLE(); 74 UNREACHABLE();
75 break; 75 break;
76 76
77 case FrameElement::REGISTER: 77 case FrameElement::REGISTER:
78 __ mov(Operand(ebp, fp_relative(index)), element.reg()); 78 __ mov(Operand(ebp, fp_relative(index)), element.reg());
79 break; 79 break;
80 80
81 case FrameElement::CONSTANT: 81 case FrameElement::CONSTANT:
82 __ Set(Operand(ebp, fp_relative(index)), Immediate(element.handle())); 82 if (cgen_->IsUnsafeSmi(element.handle())) {
83 Result temp = cgen_->allocator()->Allocate();
84 ASSERT(temp.is_valid());
85 cgen_->LoadUnsafeSmi(temp.reg(), element.handle());
86 __ mov(Operand(ebp, fp_relative(index)), temp.reg());
87 } else {
88 __ Set(Operand(ebp, fp_relative(index)),
89 Immediate(element.handle()));
90 }
83 break; 91 break;
84 92
85 case FrameElement::COPY: { 93 case FrameElement::COPY: {
86 int backing_index = element.index(); 94 int backing_index = element.index();
87 FrameElement backing_element = elements_[backing_index]; 95 FrameElement backing_element = elements_[backing_index];
88 if (backing_element.is_memory()) { 96 if (backing_element.is_memory()) {
89 Result temp = cgen_->allocator()->Allocate(); 97 Result temp = cgen_->allocator()->Allocate();
90 ASSERT(temp.is_valid()); 98 ASSERT(temp.is_valid());
91 __ mov(temp.reg(), Operand(ebp, fp_relative(backing_index))); 99 __ mov(temp.reg(), Operand(ebp, fp_relative(backing_index)));
92 __ mov(Operand(ebp, fp_relative(index)), temp.reg()); 100 __ mov(Operand(ebp, fp_relative(index)), temp.reg());
(...skipping 17 matching lines...) Expand all
110 // There was an early bailout for invalid and synced elements 118 // There was an early bailout for invalid and synced elements
111 // (memory elements are always synced). 119 // (memory elements are always synced).
112 UNREACHABLE(); 120 UNREACHABLE();
113 break; 121 break;
114 122
115 case FrameElement::REGISTER: 123 case FrameElement::REGISTER:
116 __ push(element.reg()); 124 __ push(element.reg());
117 break; 125 break;
118 126
119 case FrameElement::CONSTANT: 127 case FrameElement::CONSTANT:
120 __ push(Immediate(element.handle())); 128 if (cgen_->IsUnsafeSmi(element.handle())) {
129 Result temp = cgen_->allocator()->Allocate();
130 ASSERT(temp.is_valid());
131 cgen_->LoadUnsafeSmi(temp.reg(), element.handle());
132 __ push(temp.reg());
133 } else {
134 __ push(Immediate(element.handle()));
135 }
121 break; 136 break;
122 137
123 case FrameElement::COPY: { 138 case FrameElement::COPY: {
124 int backing_index = element.index(); 139 int backing_index = element.index();
125 FrameElement backing = elements_[backing_index]; 140 FrameElement backing = elements_[backing_index];
126 ASSERT(backing.is_memory() || backing.is_register()); 141 ASSERT(backing.is_memory() || backing.is_register());
127 if (backing.is_memory()) { 142 if (backing.is_memory()) {
128 __ push(Operand(ebp, fp_relative(backing_index))); 143 __ push(Operand(ebp, fp_relative(backing_index)));
129 } else { 144 } else {
130 __ push(backing.reg()); 145 __ push(backing.reg());
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
210 225
211 case FrameElement::REGISTER: 226 case FrameElement::REGISTER:
212 Unuse(source.reg()); 227 Unuse(source.reg());
213 if (!source.is_synced()) { 228 if (!source.is_synced()) {
214 __ mov(Operand(ebp, fp_relative(i)), source.reg()); 229 __ mov(Operand(ebp, fp_relative(i)), source.reg());
215 } 230 }
216 break; 231 break;
217 232
218 case FrameElement::CONSTANT: 233 case FrameElement::CONSTANT:
219 if (!source.is_synced()) { 234 if (!source.is_synced()) {
220 __ Set(Operand(ebp, fp_relative(i)), Immediate(source.handle())); 235 if (cgen_->IsUnsafeSmi(source.handle())) {
236 esi_caches = i;
237 cgen_->LoadUnsafeSmi(esi, source.handle());
238 __ mov(Operand(ebp, fp_relative(i)), esi);
239 } else {
240 __ Set(Operand(ebp, fp_relative(i)), Immediate(source.handle()));
241 }
221 } 242 }
222 break; 243 break;
223 244
224 case FrameElement::COPY: 245 case FrameElement::COPY:
225 if (!source.is_synced()) { 246 if (!source.is_synced()) {
226 int backing_index = source.index(); 247 int backing_index = source.index();
227 FrameElement backing_element = elements_[backing_index]; 248 FrameElement backing_element = elements_[backing_index];
228 if (backing_element.is_memory()) { 249 if (backing_element.is_memory()) {
229 // If we have to spill a register, we spill esi. 250 // If we have to spill a register, we spill esi.
230 if (esi_caches != backing_index) { 251 if (esi_caches != backing_index) {
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
328 case FrameElement::REGISTER: 349 case FrameElement::REGISTER:
329 UNREACHABLE(); 350 UNREACHABLE();
330 break; 351 break;
331 352
332 case FrameElement::MEMORY: 353 case FrameElement::MEMORY:
333 ASSERT(i <= stack_pointer_); 354 ASSERT(i <= stack_pointer_);
334 __ mov(target.reg(), Operand(ebp, fp_relative(i))); 355 __ mov(target.reg(), Operand(ebp, fp_relative(i)));
335 break; 356 break;
336 357
337 case FrameElement::CONSTANT: 358 case FrameElement::CONSTANT:
338 __ Set(target.reg(), Immediate(source.handle())); 359 if (cgen_->IsUnsafeSmi(source.handle())) {
360 cgen_->LoadUnsafeSmi(target.reg(), source.handle());
361 } else {
362 __ Set(target.reg(), Immediate(source.handle()));
363 }
339 break; 364 break;
340 365
341 case FrameElement::COPY: { 366 case FrameElement::COPY: {
342 FrameElement backing = elements_[source.index()]; 367 FrameElement backing = elements_[source.index()];
343 ASSERT(backing.is_memory() || backing.is_register()); 368 ASSERT(backing.is_memory() || backing.is_register());
344 if (backing.is_memory()) { 369 if (backing.is_memory()) {
345 ASSERT(source.index() <= stack_pointer_); 370 ASSERT(source.index() <= stack_pointer_);
346 __ mov(target.reg(), Operand(ebp, fp_relative(source.index()))); 371 __ mov(target.reg(), Operand(ebp, fp_relative(source.index())));
347 } else { 372 } else {
348 __ mov(target.reg(), backing.reg()); 373 __ mov(target.reg(), backing.reg());
(...skipping 594 matching lines...) Expand 10 before | Expand all | Expand 10 after
943 ASSERT(stack_pointer_ == elements_.length() - 1); 968 ASSERT(stack_pointer_ == elements_.length() - 1);
944 elements_.Add(FrameElement::MemoryElement()); 969 elements_.Add(FrameElement::MemoryElement());
945 stack_pointer_++; 970 stack_pointer_++;
946 __ push(immediate); 971 __ push(immediate);
947 } 972 }
948 973
949 974
950 #undef __ 975 #undef __
951 976
952 } } // namespace v8::internal 977 } } // namespace v8::internal
OLDNEW
« src/codegen-ia32.cc ('K') | « src/register-allocator-ia32.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698