Chromium Code Reviews| 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 "src/isolate-inl.h" | 7 #include "src/isolate-inl.h" |
| 8 | 8 |
| 9 #include "src/base/platform/elapsed-timer.h" | 9 #include "src/base/platform/elapsed-timer.h" |
| 10 #include "src/base/platform/platform.h" | 10 #include "src/base/platform/platform.h" |
| (...skipping 2877 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2888 BoundsCheckMem(memtype, index, offset, position); | 2888 BoundsCheckMem(memtype, index, offset, position); |
| 2889 bool aligned = static_cast<int>(alignment) >= | 2889 bool aligned = static_cast<int>(alignment) >= |
| 2890 ElementSizeLog2Of(memtype.representation()); | 2890 ElementSizeLog2Of(memtype.representation()); |
| 2891 | 2891 |
| 2892 if (aligned || | 2892 if (aligned || |
| 2893 jsgraph()->machine()->UnalignedLoadSupported(memtype, alignment)) { | 2893 jsgraph()->machine()->UnalignedLoadSupported(memtype, alignment)) { |
| 2894 load = graph()->NewNode(jsgraph()->machine()->Load(memtype), | 2894 load = graph()->NewNode(jsgraph()->machine()->Load(memtype), |
| 2895 MemBuffer(offset), index, *effect_, *control_); | 2895 MemBuffer(offset), index, *effect_, *control_); |
| 2896 *effect_ = load; | 2896 *effect_ = load; |
| 2897 } else { | 2897 } else { |
| 2898 load = BuildUnalignedLoad(type, memtype, index, offset, alignment); | 2898 if (jsgraph()->machine()->UnalignedLoad(memtype).IsSupported()) { |
| 2899 load = graph()->NewNode(jsgraph()->machine()->UnalignedLoad(memtype).op(), | |
| 2900 MemBuffer(offset), index, *effect_, *control_); | |
| 2901 *effect_ = load; | |
| 2902 } else { | |
| 2903 load = BuildUnalignedLoad(type, memtype, index, offset, alignment); | |
|
titzer
2016/07/11 08:40:00
I thought this routine would go away. Is it the ca
ivica.bogosavljevic
2016/07/11 09:34:43
Agreed. In that case we'll make UnalignedLoad/Unal
| |
| 2904 } | |
| 2899 } | 2905 } |
| 2900 #if defined(V8_TARGET_BIG_ENDIAN) | 2906 #if defined(V8_TARGET_BIG_ENDIAN) |
| 2901 // TODO(john.yan) Implement byte swap turbofan operator | 2907 // TODO(john.yan) Implement byte swap turbofan operator |
| 2902 // and use it if available for better performance | 2908 // and use it if available for better performance |
| 2903 load = BuildChangeEndianness(load, memtype, type); | 2909 load = BuildChangeEndianness(load, memtype, type); |
| 2904 #endif | 2910 #endif |
| 2905 | 2911 |
| 2906 if (type == wasm::kAstI64 && | 2912 if (type == wasm::kAstI64 && |
| 2907 ElementSizeLog2Of(memtype.representation()) < 3) { | 2913 ElementSizeLog2Of(memtype.representation()) < 3) { |
| 2908 // TODO(titzer): TF zeroes the upper bits of 64-bit loads for subword sizes. | 2914 // TODO(titzer): TF zeroes the upper bits of 64-bit loads for subword sizes. |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3029 #endif | 3035 #endif |
| 3030 | 3036 |
| 3031 if (aligned || | 3037 if (aligned || |
| 3032 jsgraph()->machine()->UnalignedStoreSupported(memtype, alignment)) { | 3038 jsgraph()->machine()->UnalignedStoreSupported(memtype, alignment)) { |
| 3033 StoreRepresentation rep(memtype.representation(), kNoWriteBarrier); | 3039 StoreRepresentation rep(memtype.representation(), kNoWriteBarrier); |
| 3034 store = | 3040 store = |
| 3035 graph()->NewNode(jsgraph()->machine()->Store(rep), MemBuffer(offset), | 3041 graph()->NewNode(jsgraph()->machine()->Store(rep), MemBuffer(offset), |
| 3036 index, val, *effect_, *control_); | 3042 index, val, *effect_, *control_); |
| 3037 *effect_ = store; | 3043 *effect_ = store; |
| 3038 } else { | 3044 } else { |
| 3039 store = BuildUnalignedStore(memtype, index, offset, alignment, val); | 3045 UnalignedStoreRepresentation rep(memtype.representation()); |
| 3046 | |
| 3047 if (jsgraph()->machine()->UnalignedStore(rep).IsSupported()) { | |
| 3048 store = | |
| 3049 graph()->NewNode(jsgraph()->machine()->UnalignedStore(rep).op(), | |
| 3050 MemBuffer(offset), index, val, *effect_, *control_); | |
| 3051 *effect_ = store; | |
| 3052 } else { | |
| 3053 store = BuildUnalignedStore(memtype, index, offset, alignment, val); | |
| 3054 } | |
| 3040 } | 3055 } |
| 3041 | 3056 |
| 3042 return store; | 3057 return store; |
| 3043 } | 3058 } |
| 3044 | 3059 |
| 3045 Node* WasmGraphBuilder::BuildAsmjsLoadMem(MachineType type, Node* index) { | 3060 Node* WasmGraphBuilder::BuildAsmjsLoadMem(MachineType type, Node* index) { |
| 3046 // TODO(turbofan): fold bounds checks for constant asm.js loads. | 3061 // TODO(turbofan): fold bounds checks for constant asm.js loads. |
| 3047 // asm.js semantics use CheckedLoad (i.e. OOB reads return 0ish). | 3062 // asm.js semantics use CheckedLoad (i.e. OOB reads return 0ish). |
| 3048 const Operator* op = jsgraph()->machine()->CheckedLoad(type); | 3063 const Operator* op = jsgraph()->machine()->CheckedLoad(type); |
| 3049 Node* load = graph()->NewNode(op, MemBuffer(0), index, MemSize(0), *effect_, | 3064 Node* load = graph()->NewNode(op, MemBuffer(0), index, MemSize(0), *effect_, |
| (...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3464 function_->code_start_offset), | 3479 function_->code_start_offset), |
| 3465 compile_ms); | 3480 compile_ms); |
| 3466 } | 3481 } |
| 3467 | 3482 |
| 3468 return code; | 3483 return code; |
| 3469 } | 3484 } |
| 3470 | 3485 |
| 3471 } // namespace compiler | 3486 } // namespace compiler |
| 3472 } // namespace internal | 3487 } // namespace internal |
| 3473 } // namespace v8 | 3488 } // namespace v8 |
| OLD | NEW |