| 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/isolate-inl.h" | 9 #include "src/isolate-inl.h" |
| 10 | 10 |
| (...skipping 2759 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2770 Node* param = Param(i + 1); | 2770 Node* param = Param(i + 1); |
| 2771 Node* wasm_param = FromJS(param, context, sig->GetParam(i)); | 2771 Node* wasm_param = FromJS(param, context, sig->GetParam(i)); |
| 2772 args[pos++] = wasm_param; | 2772 args[pos++] = wasm_param; |
| 2773 if (jsgraph()->machine()->Is32() && sig->GetParam(i) == wasm::kWasmI64) { | 2773 if (jsgraph()->machine()->Is32() && sig->GetParam(i) == wasm::kWasmI64) { |
| 2774 // We make up the high word with SAR to get the proper sign extension. | 2774 // We make up the high word with SAR to get the proper sign extension. |
| 2775 args[pos++] = graph()->NewNode(jsgraph()->machine()->Word32Sar(), | 2775 args[pos++] = graph()->NewNode(jsgraph()->machine()->Word32Sar(), |
| 2776 wasm_param, jsgraph()->Int32Constant(31)); | 2776 wasm_param, jsgraph()->Int32Constant(31)); |
| 2777 } | 2777 } |
| 2778 } | 2778 } |
| 2779 | 2779 |
| 2780 // Set the ThreadInWasm flag before we do the actual call. |
| 2781 Node* parameters[] = {}; |
| 2782 BuildCallToRuntime(Runtime::kSetThreadInWasm, jsgraph(), |
| 2783 jsgraph()->isolate()->native_context(), parameters, 0, |
| 2784 effect_, *control_); |
| 2785 |
| 2780 args[pos++] = *effect_; | 2786 args[pos++] = *effect_; |
| 2781 args[pos++] = *control_; | 2787 args[pos++] = *control_; |
| 2782 | 2788 |
| 2783 // Call the WASM code. | 2789 // Call the WASM code. |
| 2784 CallDescriptor* desc = | 2790 CallDescriptor* desc = |
| 2785 wasm::ModuleEnv::GetWasmCallDescriptor(jsgraph()->zone(), sig); | 2791 wasm::ModuleEnv::GetWasmCallDescriptor(jsgraph()->zone(), sig); |
| 2786 if (jsgraph()->machine()->Is32()) { | 2792 if (jsgraph()->machine()->Is32()) { |
| 2787 desc = wasm::ModuleEnv::GetI32WasmCallDescriptor(jsgraph()->zone(), desc); | 2793 desc = wasm::ModuleEnv::GetI32WasmCallDescriptor(jsgraph()->zone(), desc); |
| 2788 } | 2794 } |
| 2789 Node* call = graph()->NewNode(jsgraph()->common()->Call(desc), count, args); | 2795 Node* call = graph()->NewNode(jsgraph()->common()->Call(desc), count, args); |
| 2790 *effect_ = call; | 2796 *effect_ = call; |
| 2797 |
| 2798 // Clear the ThreadInWasmFlag |
| 2799 BuildCallToRuntime(Runtime::kClearThreadInWasm, jsgraph(), |
| 2800 jsgraph()->isolate()->native_context(), parameters, 0, |
| 2801 effect_, *control_); |
| 2802 |
| 2791 Node* retval = call; | 2803 Node* retval = call; |
| 2792 if (jsgraph()->machine()->Is32() && sig->return_count() > 0 && | 2804 if (jsgraph()->machine()->Is32() && sig->return_count() > 0 && |
| 2793 sig->GetReturn(0) == wasm::kWasmI64) { | 2805 sig->GetReturn(0) == wasm::kWasmI64) { |
| 2794 // The return values comes as two values, we pick the low word. | 2806 // The return values comes as two values, we pick the low word. |
| 2795 retval = graph()->NewNode(jsgraph()->common()->Projection(0), retval, | 2807 retval = graph()->NewNode(jsgraph()->common()->Projection(0), retval, |
| 2796 graph()->start()); | 2808 graph()->start()); |
| 2797 } | 2809 } |
| 2798 Node* jsval = ToJS( | 2810 Node* jsval = ToJS( |
| 2799 retval, sig->return_count() == 0 ? wasm::kWasmStmt : sig->GetReturn()); | 2811 retval, sig->return_count() == 0 ? wasm::kWasmStmt : sig->GetReturn()); |
| 2800 Return(jsval); | 2812 Return(jsval); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2832 Isolate* isolate = jsgraph()->isolate(); | 2844 Isolate* isolate = jsgraph()->isolate(); |
| 2833 CallDescriptor* desc; | 2845 CallDescriptor* desc; |
| 2834 Node* start = Start(param_count + 3); | 2846 Node* start = Start(param_count + 3); |
| 2835 *effect_ = start; | 2847 *effect_ = start; |
| 2836 *control_ = start; | 2848 *control_ = start; |
| 2837 Node** args = Buffer(wasm_count + 7); | 2849 Node** args = Buffer(wasm_count + 7); |
| 2838 | 2850 |
| 2839 Node* call; | 2851 Node* call; |
| 2840 bool direct_call = false; | 2852 bool direct_call = false; |
| 2841 | 2853 |
| 2854 Node* parameters[] = {}; |
| 2855 BuildCallToRuntime(Runtime::kClearThreadInWasm, jsgraph(), |
| 2856 jsgraph()->isolate()->native_context(), parameters, 0, |
| 2857 effect_, *control_); |
| 2858 |
| 2842 if (target->IsJSFunction()) { | 2859 if (target->IsJSFunction()) { |
| 2843 Handle<JSFunction> function = Handle<JSFunction>::cast(target); | 2860 Handle<JSFunction> function = Handle<JSFunction>::cast(target); |
| 2844 if (function->shared()->internal_formal_parameter_count() == wasm_count) { | 2861 if (function->shared()->internal_formal_parameter_count() == wasm_count) { |
| 2845 direct_call = true; | 2862 direct_call = true; |
| 2846 int pos = 0; | 2863 int pos = 0; |
| 2847 args[pos++] = jsgraph()->Constant(target); // target callable. | 2864 args[pos++] = jsgraph()->Constant(target); // target callable. |
| 2848 // Receiver. | 2865 // Receiver. |
| 2849 if (is_sloppy(function->shared()->language_mode()) && | 2866 if (is_sloppy(function->shared()->language_mode()) && |
| 2850 !function->shared()->native()) { | 2867 !function->shared()->native()) { |
| 2851 args[pos++] = | 2868 args[pos++] = |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2896 args[pos++] = HeapConstant(isolate->native_context()); | 2913 args[pos++] = HeapConstant(isolate->native_context()); |
| 2897 args[pos++] = *effect_; | 2914 args[pos++] = *effect_; |
| 2898 args[pos++] = *control_; | 2915 args[pos++] = *control_; |
| 2899 | 2916 |
| 2900 call = graph()->NewNode(jsgraph()->common()->Call(desc), pos, args); | 2917 call = graph()->NewNode(jsgraph()->common()->Call(desc), pos, args); |
| 2901 } | 2918 } |
| 2902 | 2919 |
| 2903 *effect_ = call; | 2920 *effect_ = call; |
| 2904 SetSourcePosition(call, 0); | 2921 SetSourcePosition(call, 0); |
| 2905 | 2922 |
| 2923 BuildCallToRuntime(Runtime::kSetThreadInWasm, jsgraph(), |
| 2924 jsgraph()->isolate()->native_context(), parameters, 0, |
| 2925 effect_, *control_); |
| 2926 |
| 2906 // Convert the return value back. | 2927 // Convert the return value back. |
| 2907 Node* i32_zero = jsgraph()->Int32Constant(0); | 2928 Node* i32_zero = jsgraph()->Int32Constant(0); |
| 2908 Node* val = sig->return_count() == 0 | 2929 Node* val = sig->return_count() == 0 |
| 2909 ? i32_zero | 2930 ? i32_zero |
| 2910 : FromJS(call, HeapConstant(isolate->native_context()), | 2931 : FromJS(call, HeapConstant(isolate->native_context()), |
| 2911 sig->GetReturn()); | 2932 sig->GetReturn()); |
| 2912 Return(val); | 2933 Return(val); |
| 2913 } | 2934 } |
| 2914 | 2935 |
| 2915 Node* WasmGraphBuilder::MemBuffer(uint32_t offset) { | 2936 Node* WasmGraphBuilder::MemBuffer(uint32_t offset) { |
| (...skipping 770 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3686 Smi::FromInt(instruction.instr_offset)); | 3707 Smi::FromInt(instruction.instr_offset)); |
| 3687 fn_protected->set(Code::kTrapDataSize * i + Code::kTrapLandingOffset, | 3708 fn_protected->set(Code::kTrapDataSize * i + Code::kTrapLandingOffset, |
| 3688 Smi::FromInt(instruction.landing_offset)); | 3709 Smi::FromInt(instruction.landing_offset)); |
| 3689 } | 3710 } |
| 3690 return fn_protected; | 3711 return fn_protected; |
| 3691 } | 3712 } |
| 3692 | 3713 |
| 3693 } // namespace compiler | 3714 } // namespace compiler |
| 3694 } // namespace internal | 3715 } // namespace internal |
| 3695 } // namespace v8 | 3716 } // namespace v8 |
| OLD | NEW |