| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/compiler/wasm-compiler.h" | 5 #include "src/compiler/wasm-compiler.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 | 8 |
| 9 #include "src/assembler-inl.h" | 9 #include "src/assembler-inl.h" |
| 10 #include "src/base/platform/elapsed-timer.h" | 10 #include "src/base/platform/elapsed-timer.h" |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 172 return builder_->Control(); | 172 return builder_->Control(); |
| 173 } | 173 } |
| 174 | 174 |
| 175 // Add a check that traps if {node} is zero. | 175 // Add a check that traps if {node} is zero. |
| 176 Node* ZeroCheck64(wasm::TrapReason reason, Node* node, | 176 Node* ZeroCheck64(wasm::TrapReason reason, Node* node, |
| 177 wasm::WasmCodePosition position) { | 177 wasm::WasmCodePosition position) { |
| 178 return TrapIfEq64(reason, node, 0, position); | 178 return TrapIfEq64(reason, node, 0, position); |
| 179 } | 179 } |
| 180 | 180 |
| 181 Builtins::Name GetBuiltinIdForTrap(wasm::TrapReason reason) { | 181 Builtins::Name GetBuiltinIdForTrap(wasm::TrapReason reason) { |
| 182 if (builder_->module_ && !builder_->module_->instance->context.is_null()) { | 182 bool in_cctest = |
| 183 switch (reason) { | 183 !builder_->module_ || builder_->module_->instance->context.is_null(); |
| 184 #define TRAPREASON_TO_MESSAGE(name) \ | 184 if (in_cctest) { |
| 185 case wasm::k##name: \ | 185 // We use Builtins::builtin_count as a marker to tell the code generator |
| 186 return Builtins::kThrowWasm##name; | |
| 187 FOREACH_WASM_TRAPREASON(TRAPREASON_TO_MESSAGE) | |
| 188 #undef TRAPREASON_TO_MESSAGE | |
| 189 default: | |
| 190 UNREACHABLE(); | |
| 191 return Builtins::builtin_count; | |
| 192 } | |
| 193 } else { | |
| 194 // We use Runtime::kNumFunctions as a marker to tell the code generator | |
| 195 // to generate a call to a testing c-function instead of a runtime | 186 // to generate a call to a testing c-function instead of a runtime |
| 196 // function. This code should only be called from a cctest. | 187 // function. This code should only be called from a cctest. |
| 197 return Builtins::builtin_count; | 188 return Builtins::builtin_count; |
| 198 } | 189 } |
| 190 |
| 191 switch (reason) { |
| 192 #define TRAPREASON_TO_MESSAGE(name) \ |
| 193 case wasm::k##name: \ |
| 194 return Builtins::kThrowWasm##name; |
| 195 FOREACH_WASM_TRAPREASON(TRAPREASON_TO_MESSAGE) |
| 196 #undef TRAPREASON_TO_MESSAGE |
| 197 default: |
| 198 UNREACHABLE(); |
| 199 return Builtins::builtin_count; |
| 200 } |
| 199 } | 201 } |
| 200 | 202 |
| 201 #if V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_ARM || \ | 203 #if V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_ARM || \ |
| 202 V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64 || \ | 204 V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64 || \ |
| 203 V8_TARGET_ARCH_PPC || V8_TARGET_ARCH_PPC64 || V8_TARGET_ARCH_S390 || \ | 205 V8_TARGET_ARCH_PPC || V8_TARGET_ARCH_PPC64 || V8_TARGET_ARCH_S390 || \ |
| 204 V8_TARGET_ARCH_S390X || V8_TARGET_ARCH_X87 | 206 V8_TARGET_ARCH_S390X || V8_TARGET_ARCH_X87 |
| 205 #define WASM_TRAP_IF_SUPPORTED | 207 #define WASM_TRAP_IF_SUPPORTED |
| 206 #endif | 208 #endif |
| 207 | 209 |
| 208 // Add a trap if {cond} is true. | 210 // Add a trap if {cond} is true. |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 365 jsgraph_(jsgraph), | 367 jsgraph_(jsgraph), |
| 366 module_(module_env), | 368 module_(module_env), |
| 367 signature_tables_(zone), | 369 signature_tables_(zone), |
| 368 function_tables_(zone), | 370 function_tables_(zone), |
| 369 function_table_sizes_(zone), | 371 function_table_sizes_(zone), |
| 370 cur_buffer_(def_buffer_), | 372 cur_buffer_(def_buffer_), |
| 371 cur_bufsize_(kDefaultBufferSize), | 373 cur_bufsize_(kDefaultBufferSize), |
| 372 trap_(new (zone) WasmTrapHelper(this)), | 374 trap_(new (zone) WasmTrapHelper(this)), |
| 373 sig_(sig), | 375 sig_(sig), |
| 374 source_position_table_(source_position_table) { | 376 source_position_table_(source_position_table) { |
| 375 for (size_t i = 0; i < sig->parameter_count(); i++) { | 377 for (size_t i = sig->parameter_count(); i > 0 && !has_simd_; --i) { |
| 376 if (sig->GetParam(i) == wasm::kWasmS128) has_simd_ = true; | 378 if (sig->GetParam(i - 1) == wasm::kWasmS128) has_simd_ = true; |
| 377 } | 379 } |
| 378 for (size_t i = 0; i < sig->return_count(); i++) { | 380 for (size_t i = sig->return_count(); i > 0 && !has_simd_; --i) { |
| 379 if (sig->GetReturn(i) == wasm::kWasmS128) has_simd_ = true; | 381 if (sig->GetReturn(i - 1) == wasm::kWasmS128) has_simd_ = true; |
| 380 } | 382 } |
| 381 DCHECK_NOT_NULL(jsgraph_); | 383 DCHECK_NOT_NULL(jsgraph_); |
| 382 } | 384 } |
| 383 | 385 |
| 384 Node* WasmGraphBuilder::Error() { return jsgraph()->Dead(); } | 386 Node* WasmGraphBuilder::Error() { return jsgraph()->Dead(); } |
| 385 | 387 |
| 386 Node* WasmGraphBuilder::Start(unsigned params) { | 388 Node* WasmGraphBuilder::Start(unsigned params) { |
| 387 Node* start = graph()->NewNode(jsgraph()->common()->Start(params)); | 389 Node* start = graph()->NewNode(jsgraph()->common()->Start(params)); |
| 388 graph()->SetStart(start); | 390 graph()->SetStart(start); |
| 389 return start; | 391 return start; |
| (...skipping 2667 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3057 RelocInfo::WASM_MEMORY_REFERENCE); | 3059 RelocInfo::WASM_MEMORY_REFERENCE); |
| 3058 } | 3060 } |
| 3059 } | 3061 } |
| 3060 | 3062 |
| 3061 Node* WasmGraphBuilder::CurrentMemoryPages() { | 3063 Node* WasmGraphBuilder::CurrentMemoryPages() { |
| 3062 Runtime::FunctionId function_id = Runtime::kWasmMemorySize; | 3064 Runtime::FunctionId function_id = Runtime::kWasmMemorySize; |
| 3063 const Runtime::Function* function = Runtime::FunctionForId(function_id); | 3065 const Runtime::Function* function = Runtime::FunctionForId(function_id); |
| 3064 CallDescriptor* desc = Linkage::GetRuntimeCallDescriptor( | 3066 CallDescriptor* desc = Linkage::GetRuntimeCallDescriptor( |
| 3065 jsgraph()->zone(), function_id, function->nargs, Operator::kNoThrow, | 3067 jsgraph()->zone(), function_id, function->nargs, Operator::kNoThrow, |
| 3066 CallDescriptor::kNoFlags); | 3068 CallDescriptor::kNoFlags); |
| 3067 wasm::ModuleEnv* module = module_; | |
| 3068 Node* inputs[] = { | 3069 Node* inputs[] = { |
| 3069 jsgraph()->CEntryStubConstant(function->result_size), // C entry | 3070 jsgraph()->CEntryStubConstant(function->result_size), // C entry |
| 3070 jsgraph()->ExternalConstant( | 3071 jsgraph()->ExternalConstant( |
| 3071 ExternalReference(function_id, jsgraph()->isolate())), // ref | 3072 ExternalReference(function_id, jsgraph()->isolate())), // ref |
| 3072 jsgraph()->Int32Constant(function->nargs), // arity | 3073 jsgraph()->Int32Constant(function->nargs), // arity |
| 3073 jsgraph()->HeapConstant(module->instance->context), // context | 3074 jsgraph()->HeapConstant(module_->instance->context), // context |
| 3074 *effect_, | 3075 *effect_, |
| 3075 *control_}; | 3076 *control_}; |
| 3076 Node* call = graph()->NewNode(jsgraph()->common()->Call(desc), | 3077 Node* call = graph()->NewNode(jsgraph()->common()->Call(desc), |
| 3077 static_cast<int>(arraysize(inputs)), inputs); | 3078 static_cast<int>(arraysize(inputs)), inputs); |
| 3078 | 3079 |
| 3079 Node* result = BuildChangeSmiToInt32(call); | 3080 Node* result = BuildChangeSmiToInt32(call); |
| 3080 | 3081 |
| 3081 *effect_ = call; | 3082 *effect_ = call; |
| 3082 return result; | 3083 return result; |
| 3083 } | 3084 } |
| (...skipping 1081 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4165 function_->code_end_offset - function_->code_start_offset, | 4166 function_->code_end_offset - function_->code_start_offset, |
| 4166 codegen_ms); | 4167 codegen_ms); |
| 4167 } | 4168 } |
| 4168 | 4169 |
| 4169 return code; | 4170 return code; |
| 4170 } | 4171 } |
| 4171 | 4172 |
| 4172 } // namespace compiler | 4173 } // namespace compiler |
| 4173 } // namespace internal | 4174 } // namespace internal |
| 4174 } // namespace v8 | 4175 } // namespace v8 |
| OLD | NEW |