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

Unified Diff: src/compiler/wasm-compiler.cc

Issue 1519013003: [wasm] Change the return type of traps for tests, and added ftoi64 instructions. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@f32toui64
Patch Set: Fixed nits. Created 5 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.h ('k') | test/cctest/wasm/test-run-wasm.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/compiler/wasm-compiler.cc
diff --git a/src/compiler/wasm-compiler.cc b/src/compiler/wasm-compiler.cc
index d2f2eda136a7b72daae0df5ac18625df26a65bec..732cc767bd6ccbf4fbed647707d3b922ee1a3463 100644
--- a/src/compiler/wasm-compiler.cc
+++ b/src/compiler/wasm-compiler.cc
@@ -223,10 +223,31 @@ class WasmTrapHelper : public ZoneObject {
end = thrw;
} else {
// End the control flow with returning 0xdeadbeef
- Node* ret_dead = graph()->NewNode(common()->Return(),
- jsgraph()->Int32Constant(0xdeadbeef),
- *effect_ptr, *control_ptr);
- end = ret_dead;
+ Node* ret_value;
+ if (builder_->GetFunctionSignature()->return_count() > 0) {
+ switch (builder_->GetFunctionSignature()->GetReturn()) {
+ case wasm::kAstI32:
+ ret_value = jsgraph()->Int32Constant(0xdeadbeef);
+ break;
+ case wasm::kAstI64:
+ ret_value = jsgraph()->Int64Constant(0xdeadbeefdeadbeef);
+ break;
+ case wasm::kAstF32:
+ ret_value = jsgraph()->Float32Constant(bit_cast<float>(0xdeadbeef));
+ break;
+ case wasm::kAstF64:
+ ret_value = jsgraph()->Float64Constant(
+ bit_cast<double>(0xdeadbeefdeadbeef));
+ break;
+ default:
+ UNREACHABLE();
+ ret_value = nullptr;
+ }
+ } else {
+ ret_value = jsgraph()->Int32Constant(0xdeadbeef);
+ }
+ end = graph()->NewNode(jsgraph()->common()->Return(), ret_value,
+ *effect_ptr, *control_ptr);
}
MergeControlToEnd(jsgraph(), end);
@@ -234,7 +255,8 @@ class WasmTrapHelper : public ZoneObject {
};
-WasmGraphBuilder::WasmGraphBuilder(Zone* zone, JSGraph* jsgraph)
+WasmGraphBuilder::WasmGraphBuilder(Zone* zone, JSGraph* jsgraph,
+ wasm::FunctionSig* function_signature)
: zone_(zone),
jsgraph_(jsgraph),
module_(nullptr),
@@ -245,7 +267,8 @@ WasmGraphBuilder::WasmGraphBuilder(Zone* zone, JSGraph* jsgraph)
effect_(nullptr),
cur_buffer_(def_buffer_),
cur_bufsize_(kDefaultBufferSize),
- trap_(new (zone) WasmTrapHelper(this)) {
+ trap_(new (zone) WasmTrapHelper(this)),
+ function_signature_(function_signature) {
DCHECK_NOT_NULL(jsgraph_);
}
@@ -843,6 +866,42 @@ Node* WasmGraphBuilder::Unop(wasm::WasmOpcode opcode, Node* input) {
case wasm::kExprF64UConvertI64:
op = m->RoundUint64ToFloat64();
break;
+ case wasm::kExprI64SConvertF32: {
+ Node* trunc = graph()->NewNode(m->TryTruncateFloat32ToInt64(), input);
+ Node* result =
+ graph()->NewNode(jsgraph()->common()->Projection(0), trunc);
+ Node* overflow =
+ graph()->NewNode(jsgraph()->common()->Projection(1), trunc);
+ trap_->ZeroCheck64(kTrapFloatUnrepresentable, overflow);
+ return result;
+ }
+ case wasm::kExprI64SConvertF64: {
+ Node* trunc = graph()->NewNode(m->TryTruncateFloat64ToInt64(), input);
+ Node* result =
+ graph()->NewNode(jsgraph()->common()->Projection(0), trunc);
+ Node* overflow =
+ graph()->NewNode(jsgraph()->common()->Projection(1), trunc);
+ trap_->ZeroCheck64(kTrapFloatUnrepresentable, overflow);
+ return result;
+ }
+ case wasm::kExprI64UConvertF32: {
+ Node* trunc = graph()->NewNode(m->TryTruncateFloat32ToUint64(), input);
+ Node* result =
+ graph()->NewNode(jsgraph()->common()->Projection(0), trunc);
+ Node* overflow =
+ graph()->NewNode(jsgraph()->common()->Projection(1), trunc);
+ trap_->ZeroCheck64(kTrapFloatUnrepresentable, overflow);
+ return result;
+ }
+ case wasm::kExprI64UConvertF64: {
+ Node* trunc = graph()->NewNode(m->TryTruncateFloat64ToUint64(), input);
+ Node* result =
+ graph()->NewNode(jsgraph()->common()->Projection(0), trunc);
+ Node* overflow =
+ graph()->NewNode(jsgraph()->common()->Projection(1), trunc);
+ trap_->ZeroCheck64(kTrapFloatUnrepresentable, overflow);
+ return result;
+ }
case wasm::kExprF64ReinterpretI64:
op = m->BitcastInt64ToFloat64();
break;
@@ -1616,7 +1675,7 @@ Handle<JSFunction> CompileJSToWasmWrapper(Isolate* isolate,
Node* control = nullptr;
Node* effect = nullptr;
- WasmGraphBuilder builder(&zone, &jsgraph);
+ WasmGraphBuilder builder(&zone, &jsgraph, func->sig);
builder.set_control_ptr(&control);
builder.set_effect_ptr(&effect);
builder.set_module(module);
@@ -1698,7 +1757,7 @@ Handle<Code> CompileWasmToJSWrapper(Isolate* isolate, wasm::ModuleEnv* module,
Node* control = nullptr;
Node* effect = nullptr;
- WasmGraphBuilder builder(&zone, &jsgraph);
+ WasmGraphBuilder builder(&zone, &jsgraph, func->sig);
builder.set_control_ptr(&control);
builder.set_effect_ptr(&effect);
builder.set_module(module);
@@ -1786,7 +1845,7 @@ Handle<Code> CompileWasmFunction(wasm::ErrorThrower& thrower, Isolate* isolate,
&zone, MachineType::PointerRepresentation(),
InstructionSelector::SupportedMachineOperatorFlags());
JSGraph jsgraph(isolate, &graph, &common, nullptr, nullptr, &machine);
- WasmGraphBuilder builder(&zone, &jsgraph);
+ WasmGraphBuilder builder(&zone, &jsgraph, function.sig);
wasm::TreeResult result = wasm::BuildTFGraph(
&builder, &env, // --
module_env->module->module_start, // --
« no previous file with comments | « src/compiler/wasm-compiler.h ('k') | test/cctest/wasm/test-run-wasm.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698