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

Unified Diff: src/compiler/x64/code-generator-x64.cc

Issue 2516413003: [wasm] Add ProtectedStore instruction (Closed)
Patch Set: Merging with master Created 4 years 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/compiler/wasm-compiler.cc ('k') | src/compiler/x64/instruction-codes-x64.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 745ac5084166e80b649898fbd5f163ac57ce0af4..2cbe2a05e31aec5ce814352500ab14f1d1bddc4e 100644
--- a/src/compiler/x64/code-generator-x64.cc
+++ b/src/compiler/x64/code-generator-x64.cc
@@ -302,6 +302,17 @@ class WasmOutOfLineTrap final : public OutOfLineCode {
int32_t position_;
};
+void EmitOOLTrapIfNeeded(Zone* zone, CodeGenerator* codegen,
+ InstructionCode opcode, X64OperandConverter& i,
+ Address pc) {
+ 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));
+ }
+}
} // namespace
@@ -1839,17 +1850,21 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
break;
case kX64Movsxbl:
ASSEMBLE_MOVX(movsxbl);
+ EmitOOLTrapIfNeeded(zone(), this, opcode, i, __ pc());
__ AssertZeroExtended(i.OutputRegister());
break;
case kX64Movzxbl:
ASSEMBLE_MOVX(movzxbl);
+ EmitOOLTrapIfNeeded(zone(), this, opcode, i, __ pc());
__ AssertZeroExtended(i.OutputRegister());
break;
case kX64Movsxbq:
ASSEMBLE_MOVX(movsxbq);
+ EmitOOLTrapIfNeeded(zone(), this, opcode, i, __ pc());
break;
case kX64Movzxbq:
ASSEMBLE_MOVX(movzxbq);
+ EmitOOLTrapIfNeeded(zone(), this, opcode, i, __ pc());
__ AssertZeroExtended(i.OutputRegister());
break;
case kX64Movb: {
@@ -1860,21 +1875,26 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
} else {
__ movb(operand, i.InputRegister(index));
}
+ EmitOOLTrapIfNeeded(zone(), this, opcode, i, __ pc());
break;
}
case kX64Movsxwl:
ASSEMBLE_MOVX(movsxwl);
+ EmitOOLTrapIfNeeded(zone(), this, opcode, i, __ pc());
__ AssertZeroExtended(i.OutputRegister());
break;
case kX64Movzxwl:
ASSEMBLE_MOVX(movzxwl);
+ EmitOOLTrapIfNeeded(zone(), this, opcode, i, __ pc());
__ AssertZeroExtended(i.OutputRegister());
break;
case kX64Movsxwq:
ASSEMBLE_MOVX(movsxwq);
+ EmitOOLTrapIfNeeded(zone(), this, opcode, i, __ pc());
break;
case kX64Movzxwq:
ASSEMBLE_MOVX(movzxwq);
+ EmitOOLTrapIfNeeded(zone(), this, opcode, i, __ pc());
__ AssertZeroExtended(i.OutputRegister());
break;
case kX64Movw: {
@@ -1885,10 +1905,10 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
} else {
__ movw(operand, i.InputRegister(index));
}
+ EmitOOLTrapIfNeeded(zone(), this, opcode, i, __ pc());
break;
}
case kX64Movl:
- case kX64TrapMovl:
if (instr->HasOutput()) {
if (instr->addressing_mode() == kMode_None) {
if (instr->InputAt(0)->IsRegister()) {
@@ -1897,15 +1917,9 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
__ movl(i.OutputRegister(), i.InputOperand(0));
}
} else {
- Address pc = __ pc();
__ movl(i.OutputRegister(), i.MemoryOperand());
-
- if (arch_opcode == kX64TrapMovl) {
- bool frame_elided = !frame_access_state()->has_frame();
- new (zone()) WasmOutOfLineTrap(this, pc, frame_elided,
- i.InputRegister(2), i.InputInt32(3));
- }
}
+ EmitOOLTrapIfNeeded(zone(), this, opcode, i, __ pc());
__ AssertZeroExtended(i.OutputRegister());
} else {
size_t index = 0;
@@ -1915,10 +1929,12 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
} else {
__ movl(operand, i.InputRegister(index));
}
+ EmitOOLTrapIfNeeded(zone(), this, opcode, i, __ pc());
}
break;
case kX64Movsxlq:
ASSEMBLE_MOVX(movsxlq);
+ EmitOOLTrapIfNeeded(zone(), this, opcode, i, __ pc());
break;
case kX64Movq:
if (instr->HasOutput()) {
@@ -1932,6 +1948,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
__ movq(operand, i.InputRegister(index));
}
}
+ EmitOOLTrapIfNeeded(zone(), this, opcode, i, __ pc());
break;
case kX64Movss:
if (instr->HasOutput()) {
@@ -1941,6 +1958,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
Operand operand = i.MemoryOperand(&index);
__ movss(operand, i.InputDoubleRegister(index));
}
+ EmitOOLTrapIfNeeded(zone(), this, opcode, i, __ pc());
break;
case kX64Movsd:
if (instr->HasOutput()) {
@@ -1950,6 +1968,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
Operand operand = i.MemoryOperand(&index);
__ Movsd(operand, i.InputDoubleRegister(index));
}
+ EmitOOLTrapIfNeeded(zone(), this, opcode, i, __ pc());
break;
case kX64BitcastFI:
if (instr->InputAt(0)->IsFPStackSlot()) {
« no previous file with comments | « src/compiler/wasm-compiler.cc ('k') | src/compiler/x64/instruction-codes-x64.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698