OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/compiler/code-generator.h" | 5 #include "src/compiler/code-generator.h" |
6 | 6 |
7 #include "src/compiler/code-generator-impl.h" | 7 #include "src/compiler/code-generator-impl.h" |
8 #include "src/compiler/linkage.h" | 8 #include "src/compiler/linkage.h" |
9 #include "src/compiler/pipeline.h" | 9 #include "src/compiler/pipeline.h" |
10 | 10 |
(...skipping 491 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
502 | 502 |
503 return deoptimization_id; | 503 return deoptimization_id; |
504 } | 504 } |
505 | 505 |
506 | 506 |
507 void CodeGenerator::AddTranslationForOperand(Translation* translation, | 507 void CodeGenerator::AddTranslationForOperand(Translation* translation, |
508 Instruction* instr, | 508 Instruction* instr, |
509 InstructionOperand* op, | 509 InstructionOperand* op, |
510 MachineType type) { | 510 MachineType type) { |
511 if (op->IsStackSlot()) { | 511 if (op->IsStackSlot()) { |
512 if (type == kMachBool || type == kMachInt32 || type == kMachInt8 || | 512 // TODO(jarin) kMachBool and kRepBit should materialize true and false |
513 type == kMachInt16) { | 513 // rather than creating an int value. |
| 514 if (type == kMachBool || type == kRepBit || type == kMachInt32 || |
| 515 type == kMachInt8 || type == kMachInt16) { |
514 translation->StoreInt32StackSlot(op->index()); | 516 translation->StoreInt32StackSlot(op->index()); |
515 } else if (type == kMachUint32 || type == kMachUint16 || | 517 } else if (type == kMachUint32 || type == kMachUint16 || |
516 type == kMachUint8) { | 518 type == kMachUint8) { |
517 translation->StoreUint32StackSlot(op->index()); | 519 translation->StoreUint32StackSlot(op->index()); |
518 } else if ((type & kRepMask) == kRepTagged) { | 520 } else if ((type & kRepMask) == kRepTagged) { |
519 translation->StoreStackSlot(op->index()); | 521 translation->StoreStackSlot(op->index()); |
520 } else { | 522 } else { |
521 CHECK(false); | 523 CHECK(false); |
522 } | 524 } |
523 } else if (op->IsDoubleStackSlot()) { | 525 } else if (op->IsDoubleStackSlot()) { |
524 DCHECK((type & (kRepFloat32 | kRepFloat64)) != 0); | 526 DCHECK((type & (kRepFloat32 | kRepFloat64)) != 0); |
525 translation->StoreDoubleStackSlot(op->index()); | 527 translation->StoreDoubleStackSlot(op->index()); |
526 } else if (op->IsRegister()) { | 528 } else if (op->IsRegister()) { |
527 InstructionOperandConverter converter(this, instr); | 529 InstructionOperandConverter converter(this, instr); |
528 if (type == kMachBool || type == kMachInt32 || type == kMachInt8 || | 530 // TODO(jarin) kMachBool and kRepBit should materialize true and false |
529 type == kMachInt16) { | 531 // rather than creating an int value. |
| 532 if (type == kMachBool || type == kRepBit || type == kMachInt32 || |
| 533 type == kMachInt8 || type == kMachInt16) { |
530 translation->StoreInt32Register(converter.ToRegister(op)); | 534 translation->StoreInt32Register(converter.ToRegister(op)); |
531 } else if (type == kMachUint32 || type == kMachUint16 || | 535 } else if (type == kMachUint32 || type == kMachUint16 || |
532 type == kMachUint8) { | 536 type == kMachUint8) { |
533 translation->StoreUint32Register(converter.ToRegister(op)); | 537 translation->StoreUint32Register(converter.ToRegister(op)); |
534 } else if ((type & kRepMask) == kRepTagged) { | 538 } else if ((type & kRepMask) == kRepTagged) { |
535 translation->StoreRegister(converter.ToRegister(op)); | 539 translation->StoreRegister(converter.ToRegister(op)); |
536 } else { | 540 } else { |
537 CHECK(false); | 541 CHECK(false); |
538 } | 542 } |
539 } else if (op->IsDoubleRegister()) { | 543 } else if (op->IsDoubleRegister()) { |
540 DCHECK((type & (kRepFloat32 | kRepFloat64)) != 0); | 544 DCHECK((type & (kRepFloat32 | kRepFloat64)) != 0); |
541 InstructionOperandConverter converter(this, instr); | 545 InstructionOperandConverter converter(this, instr); |
542 translation->StoreDoubleRegister(converter.ToDoubleRegister(op)); | 546 translation->StoreDoubleRegister(converter.ToDoubleRegister(op)); |
543 } else if (op->IsImmediate()) { | 547 } else if (op->IsImmediate()) { |
544 InstructionOperandConverter converter(this, instr); | 548 InstructionOperandConverter converter(this, instr); |
545 Constant constant = converter.ToConstant(op); | 549 Constant constant = converter.ToConstant(op); |
546 Handle<Object> constant_object; | 550 Handle<Object> constant_object; |
547 switch (constant.type()) { | 551 switch (constant.type()) { |
548 case Constant::kInt32: | 552 case Constant::kInt32: |
549 DCHECK(type == kMachInt32 || type == kMachUint32); | 553 DCHECK(type == kMachInt32 || type == kMachUint32 || type == kRepBit); |
550 constant_object = | 554 constant_object = |
551 isolate()->factory()->NewNumberFromInt(constant.ToInt32()); | 555 isolate()->factory()->NewNumberFromInt(constant.ToInt32()); |
552 break; | 556 break; |
553 case Constant::kFloat64: | 557 case Constant::kFloat64: |
554 DCHECK(type == kMachFloat64 || type == kMachAnyTagged); | 558 DCHECK(type == kMachFloat64 || type == kMachAnyTagged || |
| 559 type == kRepTagged || type == (kTypeInt32 | kRepTagged) || |
| 560 type == (kTypeUint32 | kRepTagged)); |
555 constant_object = isolate()->factory()->NewNumber(constant.ToFloat64()); | 561 constant_object = isolate()->factory()->NewNumber(constant.ToFloat64()); |
556 break; | 562 break; |
557 case Constant::kHeapObject: | 563 case Constant::kHeapObject: |
558 DCHECK((type & kRepMask) == kRepTagged); | 564 DCHECK((type & kRepMask) == kRepTagged); |
559 constant_object = constant.ToHeapObject(); | 565 constant_object = constant.ToHeapObject(); |
560 break; | 566 break; |
561 default: | 567 default: |
562 CHECK(false); | 568 CHECK(false); |
563 } | 569 } |
564 int literal_id = DefineDeoptimizationLiteral(constant_object); | 570 int literal_id = DefineDeoptimizationLiteral(constant_object); |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
633 : masm_(gen->masm()), next_(gen->ools_) { | 639 : masm_(gen->masm()), next_(gen->ools_) { |
634 gen->ools_ = this; | 640 gen->ools_ = this; |
635 } | 641 } |
636 | 642 |
637 | 643 |
638 OutOfLineCode::~OutOfLineCode() {} | 644 OutOfLineCode::~OutOfLineCode() {} |
639 | 645 |
640 } // namespace compiler | 646 } // namespace compiler |
641 } // namespace internal | 647 } // namespace internal |
642 } // namespace v8 | 648 } // namespace v8 |
OLD | NEW |