| Index: src/compiler/code-generator.cc
|
| diff --git a/src/compiler/code-generator.cc b/src/compiler/code-generator.cc
|
| index d68c92c6ef5c04e3452bd2039079ffcc0335173b..fc62119cd6c2bc32a1a1c5237ed5a4cea2ec16f9 100644
|
| --- a/src/compiler/code-generator.cc
|
| +++ b/src/compiler/code-generator.cc
|
| @@ -270,7 +270,7 @@ void CodeGenerator::AddSafepointAndDeopt(Instruction* instr) {
|
| // by calls.)
|
| for (size_t i = 0; i < descriptor->GetSize(); i++) {
|
| InstructionOperand* op = instr->InputAt(frame_state_offset + 1 + i);
|
| - CHECK(op->IsStackSlot() || op->IsImmediate());
|
| + CHECK(op->IsStackSlot() || op->IsDoubleStackSlot() || op->IsImmediate());
|
| }
|
| #endif
|
| safepoints()->RecordLazyDeoptimizationIndex(deopt_state_id);
|
| @@ -296,7 +296,15 @@ FrameStateDescriptor* CodeGenerator::GetFrameStateDescriptor(
|
| return code()->GetFrameStateDescriptor(state_id);
|
| }
|
|
|
| -static InstructionOperand* OperandForFrameState(
|
| +struct OperandAndType {
|
| + OperandAndType(InstructionOperand* operand, MachineType type)
|
| + : operand_(operand), type_(type) {}
|
| +
|
| + InstructionOperand* operand_;
|
| + MachineType type_;
|
| +};
|
| +
|
| +static OperandAndType TypedOperandForFrameState(
|
| FrameStateDescriptor* descriptor, Instruction* instr,
|
| size_t frame_state_offset, size_t index, OutputFrameStateCombine combine) {
|
| DCHECK(index < descriptor->GetSize(combine));
|
| @@ -307,7 +315,8 @@ static InstructionOperand* OperandForFrameState(
|
| descriptor->GetSize(OutputFrameStateCombine::Ignore());
|
| // If the index is past the existing stack items, return the output.
|
| if (index >= size_without_output) {
|
| - return instr->OutputAt(index - size_without_output);
|
| + return OperandAndType(instr->OutputAt(index - size_without_output),
|
| + kMachAnyTagged);
|
| }
|
| break;
|
| }
|
| @@ -316,11 +325,13 @@ static InstructionOperand* OperandForFrameState(
|
| descriptor->GetSize(combine) - 1 - combine.GetOffsetToPokeAt();
|
| if (index >= index_from_top &&
|
| index < index_from_top + instr->OutputCount()) {
|
| - return instr->OutputAt(index - index_from_top);
|
| + return OperandAndType(instr->OutputAt(index - index_from_top),
|
| + kMachAnyTagged);
|
| }
|
| break;
|
| }
|
| - return instr->InputAt(frame_state_offset + index);
|
| + return OperandAndType(instr->InputAt(frame_state_offset + index),
|
| + descriptor->GetType(index));
|
| }
|
|
|
|
|
| @@ -356,9 +367,9 @@ void CodeGenerator::BuildTranslationForFrameStateDescriptor(
|
|
|
| frame_state_offset += descriptor->outer_state()->GetTotalSize();
|
| for (size_t i = 0; i < descriptor->GetSize(state_combine); i++) {
|
| - InstructionOperand* op = OperandForFrameState(
|
| + OperandAndType op = TypedOperandForFrameState(
|
| descriptor, instr, frame_state_offset, i, state_combine);
|
| - AddTranslationForOperand(translation, instr, op);
|
| + AddTranslationForOperand(translation, instr, op.operand_, op.type_);
|
| }
|
| }
|
|
|
| @@ -387,15 +398,36 @@ int CodeGenerator::BuildTranslation(Instruction* instr, int pc_offset,
|
|
|
| void CodeGenerator::AddTranslationForOperand(Translation* translation,
|
| Instruction* instr,
|
| - InstructionOperand* op) {
|
| + InstructionOperand* op,
|
| + MachineType type) {
|
| if (op->IsStackSlot()) {
|
| - translation->StoreStackSlot(op->index());
|
| + if (type == kMachBool || type == kMachInt32 || type == kMachInt8 ||
|
| + type == kMachInt16) {
|
| + translation->StoreInt32StackSlot(op->index());
|
| + } else if (type == kMachUint32) {
|
| + translation->StoreUint32StackSlot(op->index());
|
| + } else if ((type & kRepMask) == kRepTagged) {
|
| + translation->StoreStackSlot(op->index());
|
| + } else {
|
| + CHECK(false);
|
| + }
|
| } else if (op->IsDoubleStackSlot()) {
|
| + DCHECK((type & (kRepFloat32 | kRepFloat64)) != 0);
|
| translation->StoreDoubleStackSlot(op->index());
|
| } else if (op->IsRegister()) {
|
| InstructionOperandConverter converter(this, instr);
|
| - translation->StoreRegister(converter.ToRegister(op));
|
| + if (type == kMachBool || type == kMachInt32 || type == kMachInt8 ||
|
| + type == kMachInt16) {
|
| + translation->StoreInt32Register(converter.ToRegister(op));
|
| + } else if (type == kMachUint32) {
|
| + translation->StoreUint32Register(converter.ToRegister(op));
|
| + } else if ((type & kRepMask) == kRepTagged) {
|
| + translation->StoreRegister(converter.ToRegister(op));
|
| + } else {
|
| + CHECK(false);
|
| + }
|
| } else if (op->IsDoubleRegister()) {
|
| + DCHECK((type & (kRepFloat32 | kRepFloat64)) != 0);
|
| InstructionOperandConverter converter(this, instr);
|
| translation->StoreDoubleRegister(converter.ToDoubleRegister(op));
|
| } else if (op->IsImmediate()) {
|
| @@ -404,22 +436,25 @@ void CodeGenerator::AddTranslationForOperand(Translation* translation,
|
| Handle<Object> constant_object;
|
| switch (constant.type()) {
|
| case Constant::kInt32:
|
| + DCHECK(type == kMachInt32 || type == kMachUint32);
|
| constant_object =
|
| isolate()->factory()->NewNumberFromInt(constant.ToInt32());
|
| break;
|
| case Constant::kFloat64:
|
| + DCHECK(type == kMachFloat64 || type == kMachAnyTagged);
|
| constant_object = isolate()->factory()->NewNumber(constant.ToFloat64());
|
| break;
|
| case Constant::kHeapObject:
|
| + DCHECK((type & kRepMask) == kRepTagged);
|
| constant_object = constant.ToHeapObject();
|
| break;
|
| default:
|
| - UNREACHABLE();
|
| + CHECK(false);
|
| }
|
| int literal_id = DefineDeoptimizationLiteral(constant_object);
|
| translation->StoreLiteral(literal_id);
|
| } else {
|
| - UNREACHABLE();
|
| + CHECK(false);
|
| }
|
| }
|
|
|
|
|