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

Side by Side Diff: src/ia32/assembler-ia32-inl.h

Issue 2900683002: [compiler] Delay allocation of code-embedded heap numbers. (Closed)
Patch Set: Fix rebase. Created 3 years, 6 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
« no previous file with comments | « src/ia32/assembler-ia32.cc ('k') | src/ia32/codegen-ia32.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 1994-2006 Sun Microsystems Inc. 1 // Copyright (c) 1994-2006 Sun Microsystems Inc.
2 // All Rights Reserved. 2 // All Rights Reserved.
3 // 3 //
4 // Redistribution and use in source and binary forms, with or without 4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are 5 // modification, are permitted provided that the following conditions are
6 // met: 6 // met:
7 // 7 //
8 // - Redistributions of source code must retain the above copyright notice, 8 // - Redistributions of source code must retain the above copyright notice,
9 // this list of conditions and the following disclaimer. 9 // this list of conditions and the following disclaimer.
10 // 10 //
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after
288 IsPatchedDebugBreakSlotSequence()) { 288 IsPatchedDebugBreakSlotSequence()) {
289 StaticVisitor::VisitDebugTarget(heap, this); 289 StaticVisitor::VisitDebugTarget(heap, this);
290 } else if (IsRuntimeEntry(mode)) { 290 } else if (IsRuntimeEntry(mode)) {
291 StaticVisitor::VisitRuntimeEntry(this); 291 StaticVisitor::VisitRuntimeEntry(this);
292 } 292 }
293 } 293 }
294 294
295 295
296 296
297 Immediate::Immediate(int x) { 297 Immediate::Immediate(int x) {
298 x_ = x; 298 value_.immediate = x;
299 rmode_ = RelocInfo::NONE32; 299 rmode_ = RelocInfo::NONE32;
300 } 300 }
301 301
302 Immediate::Immediate(Address x, RelocInfo::Mode rmode) { 302 Immediate::Immediate(Address x, RelocInfo::Mode rmode) {
303 x_ = reinterpret_cast<int32_t>(x); 303 value_.immediate = reinterpret_cast<int32_t>(x);
304 rmode_ = rmode; 304 rmode_ = rmode;
305 } 305 }
306 306
307 Immediate::Immediate(const ExternalReference& ext) { 307 Immediate::Immediate(const ExternalReference& ext) {
308 x_ = reinterpret_cast<int32_t>(ext.address()); 308 value_.immediate = reinterpret_cast<int32_t>(ext.address());
309 rmode_ = RelocInfo::EXTERNAL_REFERENCE; 309 rmode_ = RelocInfo::EXTERNAL_REFERENCE;
310 } 310 }
311 311
312 312
313 Immediate::Immediate(Label* internal_offset) { 313 Immediate::Immediate(Label* internal_offset) {
314 x_ = reinterpret_cast<int32_t>(internal_offset); 314 value_.immediate = reinterpret_cast<int32_t>(internal_offset);
315 rmode_ = RelocInfo::INTERNAL_REFERENCE; 315 rmode_ = RelocInfo::INTERNAL_REFERENCE;
316 } 316 }
317 317
318 318
319 Immediate::Immediate(Handle<Object> handle) { 319 Immediate::Immediate(Handle<Object> handle) {
320 AllowDeferredHandleDereference using_raw_address; 320 AllowDeferredHandleDereference using_raw_address;
321 // Verify all Objects referred by code are NOT in new space. 321 // Verify all Objects referred by code are NOT in new space.
322 Object* obj = *handle; 322 Object* obj = *handle;
323 if (obj->IsHeapObject()) { 323 if (obj->IsHeapObject()) {
324 x_ = reinterpret_cast<intptr_t>(handle.location()); 324 value_.immediate = reinterpret_cast<intptr_t>(handle.location());
325 rmode_ = RelocInfo::EMBEDDED_OBJECT; 325 rmode_ = RelocInfo::EMBEDDED_OBJECT;
326 } else { 326 } else {
327 // no relocation needed 327 // no relocation needed
328 x_ = reinterpret_cast<intptr_t>(obj); 328 value_.immediate = reinterpret_cast<intptr_t>(obj);
329 rmode_ = RelocInfo::NONE32; 329 rmode_ = RelocInfo::NONE32;
330 } 330 }
331 } 331 }
332 332
333 333
334 Immediate::Immediate(Smi* value) { 334 Immediate::Immediate(Smi* value) {
335 x_ = reinterpret_cast<intptr_t>(value); 335 value_.immediate = reinterpret_cast<intptr_t>(value);
336 rmode_ = RelocInfo::NONE32; 336 rmode_ = RelocInfo::NONE32;
337 } 337 }
338 338
339 339
340 Immediate::Immediate(Address addr) { 340 Immediate::Immediate(Address addr) {
341 x_ = reinterpret_cast<int32_t>(addr); 341 value_.immediate = reinterpret_cast<int32_t>(addr);
342 rmode_ = RelocInfo::NONE32; 342 rmode_ = RelocInfo::NONE32;
343 } 343 }
344 344
345 345
346 void Assembler::emit(uint32_t x) { 346 void Assembler::emit(uint32_t x) {
347 *reinterpret_cast<uint32_t*>(pc_) = x; 347 *reinterpret_cast<uint32_t*>(pc_) = x;
348 pc_ += sizeof(uint32_t); 348 pc_ += sizeof(uint32_t);
349 } 349 }
350 350
351 351
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
383 void Assembler::emit(Handle<Code> code, 383 void Assembler::emit(Handle<Code> code,
384 RelocInfo::Mode rmode, 384 RelocInfo::Mode rmode,
385 TypeFeedbackId id) { 385 TypeFeedbackId id) {
386 AllowDeferredHandleDereference embedding_raw_address; 386 AllowDeferredHandleDereference embedding_raw_address;
387 emit(reinterpret_cast<intptr_t>(code.location()), rmode, id); 387 emit(reinterpret_cast<intptr_t>(code.location()), rmode, id);
388 } 388 }
389 389
390 390
391 void Assembler::emit(const Immediate& x) { 391 void Assembler::emit(const Immediate& x) {
392 if (x.rmode_ == RelocInfo::INTERNAL_REFERENCE) { 392 if (x.rmode_ == RelocInfo::INTERNAL_REFERENCE) {
393 Label* label = reinterpret_cast<Label*>(x.x_); 393 Label* label = reinterpret_cast<Label*>(x.immediate());
394 emit_code_relative_offset(label); 394 emit_code_relative_offset(label);
395 return; 395 return;
396 } 396 }
397 if (!RelocInfo::IsNone(x.rmode_)) RecordRelocInfo(x.rmode_); 397 if (!RelocInfo::IsNone(x.rmode_)) RecordRelocInfo(x.rmode_);
398 emit(x.x_); 398 if (x.is_heap_number()) {
399 RequestHeapNumber(x.heap_number());
400 emit(0);
401 } else {
402 emit(x.immediate());
403 }
399 } 404 }
400 405
401 406
402 void Assembler::emit_code_relative_offset(Label* label) { 407 void Assembler::emit_code_relative_offset(Label* label) {
403 if (label->is_bound()) { 408 if (label->is_bound()) {
404 int32_t pos; 409 int32_t pos;
405 pos = label->pos() + Code::kHeaderSize - kHeapObjectTag; 410 pos = label->pos() + Code::kHeaderSize - kHeapObjectTag;
406 emit(pos); 411 emit(pos);
407 } else { 412 } else {
408 emit_disp(label, Displacement::CODE_RELATIVE); 413 emit_disp(label, Displacement::CODE_RELATIVE);
409 } 414 }
410 } 415 }
411 416
412 void Assembler::emit_b(Immediate x) { 417 void Assembler::emit_b(Immediate x) {
413 DCHECK(x.is_int8() || x.is_uint8()); 418 DCHECK(x.is_int8() || x.is_uint8());
414 uint8_t value = static_cast<uint8_t>(x.x_); 419 uint8_t value = static_cast<uint8_t>(x.immediate());
415 *pc_++ = value; 420 *pc_++ = value;
416 } 421 }
417 422
418 void Assembler::emit_w(const Immediate& x) { 423 void Assembler::emit_w(const Immediate& x) {
419 DCHECK(RelocInfo::IsNone(x.rmode_)); 424 DCHECK(RelocInfo::IsNone(x.rmode_));
420 uint16_t value = static_cast<uint16_t>(x.x_); 425 uint16_t value = static_cast<uint16_t>(x.immediate());
421 reinterpret_cast<uint16_t*>(pc_)[0] = value; 426 reinterpret_cast<uint16_t*>(pc_)[0] = value;
422 pc_ += sizeof(uint16_t); 427 pc_ += sizeof(uint16_t);
423 } 428 }
424 429
425 430
426 Address Assembler::target_address_at(Address pc, Address constant_pool) { 431 Address Assembler::target_address_at(Address pc, Address constant_pool) {
427 return pc + sizeof(int32_t) + *reinterpret_cast<int32_t*>(pc); 432 return pc + sizeof(int32_t) + *reinterpret_cast<int32_t*>(pc);
428 } 433 }
429 434
430 435
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
537 Operand::Operand(int32_t disp, RelocInfo::Mode rmode) { 542 Operand::Operand(int32_t disp, RelocInfo::Mode rmode) {
538 // [disp/r] 543 // [disp/r]
539 set_modrm(0, ebp); 544 set_modrm(0, ebp);
540 set_dispr(disp, rmode); 545 set_dispr(disp, rmode);
541 } 546 }
542 547
543 548
544 Operand::Operand(Immediate imm) { 549 Operand::Operand(Immediate imm) {
545 // [disp/r] 550 // [disp/r]
546 set_modrm(0, ebp); 551 set_modrm(0, ebp);
547 set_dispr(imm.x_, imm.rmode_); 552 set_dispr(imm.immediate(), imm.rmode_);
548 } 553 }
549 } // namespace internal 554 } // namespace internal
550 } // namespace v8 555 } // namespace v8
551 556
552 #endif // V8_IA32_ASSEMBLER_IA32_INL_H_ 557 #endif // V8_IA32_ASSEMBLER_IA32_INL_H_
OLDNEW
« no previous file with comments | « src/ia32/assembler-ia32.cc ('k') | src/ia32/codegen-ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698