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

Unified Diff: src/wasm/asm-wasm-builder.cc

Issue 1729833002: Add wasm internal opcodes for asm.js stdlib functions we're missing. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: fix Created 4 years, 10 months 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/snapshot/serializer-common.cc ('k') | src/wasm/ast-decoder.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/wasm/asm-wasm-builder.cc
diff --git a/src/wasm/asm-wasm-builder.cc b/src/wasm/asm-wasm-builder.cc
index 91c3a8ee16ddb658e4431b47a120137c080f30a0..0bca2cfdaa50c562827c2d1d20201f0ed2d265ae 100644
--- a/src/wasm/asm-wasm-builder.cc
+++ b/src/wasm/asm-wasm-builder.cc
@@ -846,36 +846,44 @@ class AsmWasmBuilderImpl : public AstVisitor {
return false;
}
case AsmTyper::kMathAcos: {
- UNREACHABLE();
- break; // TODO(bradnelson): Implement as external.
+ DCHECK_EQ(kAstF64, call_type);
+ current_function_builder_->Emit(kExprF64Acos);
+ break;
}
case AsmTyper::kMathAsin: {
- UNREACHABLE();
- break; // TODO(bradnelson): Implement as external.
+ DCHECK_EQ(kAstF64, call_type);
+ current_function_builder_->Emit(kExprF64Asin);
+ break;
}
case AsmTyper::kMathAtan: {
- UNREACHABLE();
- break; // TODO(bradnelson): Implement as external.
+ DCHECK_EQ(kAstF64, call_type);
+ current_function_builder_->Emit(kExprF64Atan);
+ break;
}
case AsmTyper::kMathCos: {
- UNREACHABLE();
- break; // TODO(bradnelson): Implement as external.
+ DCHECK_EQ(kAstF64, call_type);
+ current_function_builder_->Emit(kExprF64Cos);
+ break;
}
case AsmTyper::kMathSin: {
- UNREACHABLE();
- break; // TODO(bradnelson): Implement as external.
+ DCHECK_EQ(kAstF64, call_type);
+ current_function_builder_->Emit(kExprF64Sin);
+ break;
}
case AsmTyper::kMathTan: {
- UNREACHABLE();
- break; // TODO(bradnelson): Implement as external.
+ DCHECK_EQ(kAstF64, call_type);
+ current_function_builder_->Emit(kExprF64Tan);
+ break;
}
case AsmTyper::kMathExp: {
- UNREACHABLE();
- break; // TODO(bradnelson): Implement as external.
+ DCHECK_EQ(kAstF64, call_type);
+ current_function_builder_->Emit(kExprF64Exp);
+ break;
}
case AsmTyper::kMathLog: {
- UNREACHABLE();
- break; // TODO(bradnelson): Implement as external.
+ DCHECK_EQ(kAstF64, call_type);
+ current_function_builder_->Emit(kExprF64Log);
+ break;
}
case AsmTyper::kMathCeil: {
if (call_type == kAstF32) {
@@ -908,8 +916,17 @@ class AsmWasmBuilderImpl : public AstVisitor {
break;
}
case AsmTyper::kMathAbs: {
- // TODO(bradnelson): Handle signed.
- if (call_type == kAstF32) {
+ // TODO(bradnelson): Should this be cast to float?
+ if (call_type == kAstI32) {
+ current_function_builder_->Emit(kExprIfElse);
+ current_function_builder_->Emit(kExprI32LtS);
+ Visit(args->at(0));
+ byte code[] = {WASM_I8(0)};
+ current_function_builder_->EmitCode(code, sizeof(code));
+ current_function_builder_->Emit(kExprI32Sub);
+ current_function_builder_->EmitCode(code, sizeof(code));
+ Visit(args->at(0));
+ } else if (call_type == kAstF32) {
current_function_builder_->Emit(kExprF32Abs);
} else if (call_type == kAstF64) {
current_function_builder_->Emit(kExprF64Abs);
@@ -919,9 +936,13 @@ class AsmWasmBuilderImpl : public AstVisitor {
break;
}
case AsmTyper::kMathMin: {
- // TODO(bradnelson): Handle signed.
// TODO(bradnelson): Change wasm to match Math.min in asm.js mode.
- if (call_type == kAstF32) {
+ if (call_type == kAstI32) {
+ current_function_builder_->Emit(kExprIfElse);
+ current_function_builder_->Emit(kExprI32LeS);
+ Visit(args->at(0));
+ Visit(args->at(1));
+ } else if (call_type == kAstF32) {
current_function_builder_->Emit(kExprF32Min);
} else if (call_type == kAstF64) {
current_function_builder_->Emit(kExprF64Min);
@@ -931,9 +952,13 @@ class AsmWasmBuilderImpl : public AstVisitor {
break;
}
case AsmTyper::kMathMax: {
- // TODO(bradnelson): Handle signed.
// TODO(bradnelson): Change wasm to match Math.max in asm.js mode.
- if (call_type == kAstF32) {
+ if (call_type == kAstI32) {
+ current_function_builder_->Emit(kExprIfElse);
+ current_function_builder_->Emit(kExprI32GtS);
+ Visit(args->at(0));
+ Visit(args->at(1));
+ } else if (call_type == kAstF32) {
current_function_builder_->Emit(kExprF32Max);
} else if (call_type == kAstF64) {
current_function_builder_->Emit(kExprF64Max);
@@ -943,12 +968,14 @@ class AsmWasmBuilderImpl : public AstVisitor {
break;
}
case AsmTyper::kMathAtan2: {
- UNREACHABLE();
- break; // TODO(bradnelson): Implement as external.
+ DCHECK_EQ(kAstF64, call_type);
+ current_function_builder_->Emit(kExprF64Atan2);
+ break;
}
case AsmTyper::kMathPow: {
- UNREACHABLE();
- break; // TODO(bradnelson): Implement as external.
+ DCHECK_EQ(kAstF64, call_type);
+ current_function_builder_->Emit(kExprF64Pow);
+ break;
}
case AsmTyper::kMathImul: {
current_function_builder_->Emit(kExprI32Mul);
@@ -1243,7 +1270,7 @@ class AsmWasmBuilderImpl : public AstVisitor {
} else if (type == kUint32) {
current_function_builder_->Emit(kExprI32RemU);
} else if (type == kFloat64) {
- ModF64(expr);
+ current_function_builder_->Emit(kExprF64Mod);
return;
} else {
UNREACHABLE();
@@ -1262,32 +1289,6 @@ class AsmWasmBuilderImpl : public AstVisitor {
}
}
- void ModF64(BinaryOperation* expr) {
- current_function_builder_->EmitWithU8(kExprBlock, 3);
- uint16_t index_0 = current_function_builder_->AddLocal(kAstF64);
- uint16_t index_1 = current_function_builder_->AddLocal(kAstF64);
- current_function_builder_->Emit(kExprSetLocal);
- AddLeb128(index_0, true);
- RECURSE(Visit(expr->left()));
- current_function_builder_->Emit(kExprSetLocal);
- AddLeb128(index_1, true);
- RECURSE(Visit(expr->right()));
- current_function_builder_->Emit(kExprF64Sub);
- current_function_builder_->Emit(kExprGetLocal);
- AddLeb128(index_0, true);
- current_function_builder_->Emit(kExprF64Mul);
- current_function_builder_->Emit(kExprGetLocal);
- AddLeb128(index_1, true);
- // Use trunc instead of two casts
- current_function_builder_->Emit(kExprF64SConvertI32);
- current_function_builder_->Emit(kExprI32SConvertF64);
- current_function_builder_->Emit(kExprF64Div);
- current_function_builder_->Emit(kExprGetLocal);
- AddLeb128(index_0, true);
- current_function_builder_->Emit(kExprGetLocal);
- AddLeb128(index_1, true);
- }
-
void AddLeb128(uint32_t index, bool is_local) {
std::vector<uint8_t> index_vec = UnsignedLEB128From(index);
if (is_local) {
« no previous file with comments | « src/snapshot/serializer-common.cc ('k') | src/wasm/ast-decoder.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698