Index: src/compiler/x64/code-generator-x64.cc |
diff --git a/src/compiler/x64/code-generator-x64.cc b/src/compiler/x64/code-generator-x64.cc |
index 212a06eac3cd4a92231c75e56d497e93c2ea58a5..33e219e7ed6a519bdd060c18998315df9e16c941 100644 |
--- a/src/compiler/x64/code-generator-x64.cc |
+++ b/src/compiler/x64/code-generator-x64.cc |
@@ -271,13 +271,13 @@ class OutOfLineRecordWrite final : public OutOfLineCode { |
class WasmOutOfLineTrap final : public OutOfLineCode { |
public: |
WasmOutOfLineTrap(CodeGenerator* gen, int pc, bool frame_elided, |
- Register context, int32_t position) |
+ int32_t position, Instruction* instr) |
: OutOfLineCode(gen), |
gen_(gen), |
pc_(pc), |
frame_elided_(frame_elided), |
- context_(context), |
- position_(position) {} |
+ position_(position), |
+ instr_(instr) {} |
// TODO(eholk): Refactor this method to take the code generator as a |
// parameter. |
@@ -294,27 +294,32 @@ class WasmOutOfLineTrap final : public OutOfLineCode { |
int trap_reason = wasm::WasmOpcodes::TrapReasonToMessageId(trap_id); |
__ Push(Smi::FromInt(trap_reason)); |
__ Push(Smi::FromInt(position_)); |
- __ Move(rsi, context_); |
+ __ Move(rsi, gen_->isolate()->native_context()); |
__ CallRuntime(Runtime::kThrowWasmError); |
+ |
+ if (instr_->reference_map() != nullptr) { |
+ gen_->RecordSafepoint(instr_->reference_map(), Safepoint::kSimple, 0, |
+ Safepoint::kNoLazyDeopt); |
+ } |
} |
private: |
CodeGenerator* gen_; |
int pc_; |
bool frame_elided_; |
- Register context_; |
int32_t position_; |
+ Instruction* instr_; |
}; |
void EmitOOLTrapIfNeeded(Zone* zone, CodeGenerator* codegen, |
- InstructionCode opcode, X64OperandConverter& i, |
- int pc) { |
- X64MemoryProtection protection = |
+ InstructionCode opcode, size_t input_count, |
+ X64OperandConverter& i, int pc, Instruction* instr) { |
+ const X64MemoryProtection protection = |
static_cast<X64MemoryProtection>(MiscField::decode(opcode)); |
if (protection == X64MemoryProtection::kProtected) { |
- bool frame_elided = !codegen->frame_access_state()->has_frame(); |
- new (zone) WasmOutOfLineTrap(codegen, pc, frame_elided, i.InputRegister(2), |
- i.InputInt32(3)); |
+ const bool frame_elided = !codegen->frame_access_state()->has_frame(); |
+ const int32_t position = i.InputInt32(input_count - 1); |
+ new (zone) WasmOutOfLineTrap(codegen, pc, frame_elided, position, instr); |
} |
} |
} // namespace |
@@ -1853,25 +1858,31 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( |
__ Subsd(i.InputDoubleRegister(0), kScratchDoubleReg); |
break; |
case kX64Movsxbl: |
+ EmitOOLTrapIfNeeded(zone(), this, opcode, instr->InputCount(), i, |
+ __ pc_offset(), instr); |
ASSEMBLE_MOVX(movsxbl); |
- EmitOOLTrapIfNeeded(zone(), this, opcode, i, __ pc_offset()); |
__ AssertZeroExtended(i.OutputRegister()); |
break; |
case kX64Movzxbl: |
+ EmitOOLTrapIfNeeded(zone(), this, opcode, instr->InputCount(), i, |
+ __ pc_offset(), instr); |
ASSEMBLE_MOVX(movzxbl); |
- EmitOOLTrapIfNeeded(zone(), this, opcode, i, __ pc_offset()); |
__ AssertZeroExtended(i.OutputRegister()); |
break; |
case kX64Movsxbq: |
+ EmitOOLTrapIfNeeded(zone(), this, opcode, instr->InputCount(), i, |
+ __ pc_offset(), instr); |
ASSEMBLE_MOVX(movsxbq); |
- EmitOOLTrapIfNeeded(zone(), this, opcode, i, __ pc_offset()); |
break; |
case kX64Movzxbq: |
+ EmitOOLTrapIfNeeded(zone(), this, opcode, instr->InputCount(), i, |
+ __ pc_offset(), instr); |
ASSEMBLE_MOVX(movzxbq); |
- EmitOOLTrapIfNeeded(zone(), this, opcode, i, __ pc_offset()); |
__ AssertZeroExtended(i.OutputRegister()); |
break; |
case kX64Movb: { |
+ EmitOOLTrapIfNeeded(zone(), this, opcode, instr->InputCount(), i, |
+ __ pc_offset(), instr); |
size_t index = 0; |
Operand operand = i.MemoryOperand(&index); |
if (HasImmediateInput(instr, index)) { |
@@ -1879,29 +1890,34 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( |
} else { |
__ movb(operand, i.InputRegister(index)); |
} |
- EmitOOLTrapIfNeeded(zone(), this, opcode, i, __ pc_offset()); |
break; |
} |
case kX64Movsxwl: |
+ EmitOOLTrapIfNeeded(zone(), this, opcode, instr->InputCount(), i, |
+ __ pc_offset(), instr); |
ASSEMBLE_MOVX(movsxwl); |
- EmitOOLTrapIfNeeded(zone(), this, opcode, i, __ pc_offset()); |
__ AssertZeroExtended(i.OutputRegister()); |
break; |
case kX64Movzxwl: |
+ EmitOOLTrapIfNeeded(zone(), this, opcode, instr->InputCount(), i, |
+ __ pc_offset(), instr); |
ASSEMBLE_MOVX(movzxwl); |
- EmitOOLTrapIfNeeded(zone(), this, opcode, i, __ pc_offset()); |
__ AssertZeroExtended(i.OutputRegister()); |
break; |
case kX64Movsxwq: |
+ EmitOOLTrapIfNeeded(zone(), this, opcode, instr->InputCount(), i, |
+ __ pc_offset(), instr); |
ASSEMBLE_MOVX(movsxwq); |
- EmitOOLTrapIfNeeded(zone(), this, opcode, i, __ pc_offset()); |
break; |
case kX64Movzxwq: |
+ EmitOOLTrapIfNeeded(zone(), this, opcode, instr->InputCount(), i, |
+ __ pc_offset(), instr); |
ASSEMBLE_MOVX(movzxwq); |
- EmitOOLTrapIfNeeded(zone(), this, opcode, i, __ pc_offset()); |
__ AssertZeroExtended(i.OutputRegister()); |
break; |
case kX64Movw: { |
+ EmitOOLTrapIfNeeded(zone(), this, opcode, instr->InputCount(), i, |
+ __ pc_offset(), instr); |
size_t index = 0; |
Operand operand = i.MemoryOperand(&index); |
if (HasImmediateInput(instr, index)) { |
@@ -1909,10 +1925,11 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( |
} else { |
__ movw(operand, i.InputRegister(index)); |
} |
- EmitOOLTrapIfNeeded(zone(), this, opcode, i, __ pc_offset()); |
break; |
} |
case kX64Movl: |
+ EmitOOLTrapIfNeeded(zone(), this, opcode, instr->InputCount(), i, |
+ __ pc_offset(), instr); |
if (instr->HasOutput()) { |
if (instr->addressing_mode() == kMode_None) { |
if (instr->InputAt(0)->IsRegister()) { |
@@ -1923,7 +1940,6 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( |
} else { |
__ movl(i.OutputRegister(), i.MemoryOperand()); |
} |
- EmitOOLTrapIfNeeded(zone(), this, opcode, i, __ pc_offset()); |
__ AssertZeroExtended(i.OutputRegister()); |
} else { |
size_t index = 0; |
@@ -1933,14 +1949,16 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( |
} else { |
__ movl(operand, i.InputRegister(index)); |
} |
- EmitOOLTrapIfNeeded(zone(), this, opcode, i, __ pc_offset()); |
} |
break; |
case kX64Movsxlq: |
+ EmitOOLTrapIfNeeded(zone(), this, opcode, instr->InputCount(), i, |
+ __ pc_offset(), instr); |
ASSEMBLE_MOVX(movsxlq); |
- EmitOOLTrapIfNeeded(zone(), this, opcode, i, __ pc_offset()); |
break; |
case kX64Movq: |
+ EmitOOLTrapIfNeeded(zone(), this, opcode, instr->InputCount(), i, |
+ __ pc_offset(), instr); |
if (instr->HasOutput()) { |
__ movq(i.OutputRegister(), i.MemoryOperand()); |
} else { |
@@ -1952,9 +1970,10 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( |
__ movq(operand, i.InputRegister(index)); |
} |
} |
- EmitOOLTrapIfNeeded(zone(), this, opcode, i, __ pc_offset()); |
break; |
case kX64Movss: |
+ EmitOOLTrapIfNeeded(zone(), this, opcode, instr->InputCount(), i, |
+ __ pc_offset(), instr); |
if (instr->HasOutput()) { |
__ movss(i.OutputDoubleRegister(), i.MemoryOperand()); |
} else { |
@@ -1962,9 +1981,10 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( |
Operand operand = i.MemoryOperand(&index); |
__ movss(operand, i.InputDoubleRegister(index)); |
} |
- EmitOOLTrapIfNeeded(zone(), this, opcode, i, __ pc_offset()); |
break; |
case kX64Movsd: |
+ EmitOOLTrapIfNeeded(zone(), this, opcode, instr->InputCount(), i, |
+ __ pc_offset(), instr); |
if (instr->HasOutput()) { |
__ Movsd(i.OutputDoubleRegister(), i.MemoryOperand()); |
} else { |
@@ -1972,7 +1992,6 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( |
Operand operand = i.MemoryOperand(&index); |
__ Movsd(operand, i.InputDoubleRegister(index)); |
} |
- EmitOOLTrapIfNeeded(zone(), this, opcode, i, __ pc_offset()); |
break; |
case kX64BitcastFI: |
if (instr->InputAt(0)->IsFPStackSlot()) { |