OLD | NEW |
---|---|
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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/code-generator.h" | 5 #include "src/compiler/code-generator.h" |
6 | 6 |
7 #include <limits> | 7 #include <limits> |
8 | 8 |
9 #include "src/compilation-info.h" | 9 #include "src/compilation-info.h" |
10 #include "src/compiler/code-generator-impl.h" | 10 #include "src/compiler/code-generator-impl.h" |
(...skipping 2116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2127 break; | 2127 break; |
2128 case kX64Poke: { | 2128 case kX64Poke: { |
2129 int const slot = MiscField::decode(instr->opcode()); | 2129 int const slot = MiscField::decode(instr->opcode()); |
2130 if (HasImmediateInput(instr, 0)) { | 2130 if (HasImmediateInput(instr, 0)) { |
2131 __ movq(Operand(rsp, slot * kPointerSize), i.InputImmediate(0)); | 2131 __ movq(Operand(rsp, slot * kPointerSize), i.InputImmediate(0)); |
2132 } else { | 2132 } else { |
2133 __ movq(Operand(rsp, slot * kPointerSize), i.InputRegister(0)); | 2133 __ movq(Operand(rsp, slot * kPointerSize), i.InputRegister(0)); |
2134 } | 2134 } |
2135 break; | 2135 break; |
2136 } | 2136 } |
2137 case kX64Xchgb: { | |
2138 size_t index = 0; | |
2139 Operand operand = i.MemoryOperand(&index); | |
2140 __ xchgb(i.InputRegister(index), operand); | |
2141 break; | |
2142 } | |
2143 case kX64Xchgw: { | |
2144 size_t index = 0; | |
2145 Operand operand = i.MemoryOperand(&index); | |
2146 __ xchgw(i.InputRegister(index), operand); | |
2147 break; | |
2148 } | |
2149 case kX64Xchgl: { | |
2150 size_t index = 0; | |
2151 Operand operand = i.MemoryOperand(&index); | |
2152 __ xchgl(i.InputRegister(index), operand); | |
2153 break; | |
2154 } | |
2155 case kX64Int32x4Create: { | 2137 case kX64Int32x4Create: { |
2156 CpuFeatureScope sse_scope(masm(), SSE4_1); | 2138 CpuFeatureScope sse_scope(masm(), SSE4_1); |
2157 XMMRegister dst = i.OutputSimd128Register(); | 2139 XMMRegister dst = i.OutputSimd128Register(); |
2158 __ Movd(dst, i.InputRegister(0)); | 2140 __ Movd(dst, i.InputRegister(0)); |
2159 __ shufps(dst, dst, 0x0); | 2141 __ shufps(dst, dst, 0x0); |
2160 break; | 2142 break; |
2161 } | 2143 } |
2162 case kX64Int32x4ExtractLane: { | 2144 case kX64Int32x4ExtractLane: { |
2163 CpuFeatureScope sse_scope(masm(), SSE4_1); | 2145 CpuFeatureScope sse_scope(masm(), SSE4_1); |
2164 __ Pextrd(i.OutputRegister(), i.InputSimd128Register(0), i.InputInt8(1)); | 2146 __ Pextrd(i.OutputRegister(), i.InputSimd128Register(0), i.InputInt8(1)); |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2222 break; | 2204 break; |
2223 case kCheckedStoreFloat32: | 2205 case kCheckedStoreFloat32: |
2224 ASSEMBLE_CHECKED_STORE_FLOAT(Movss); | 2206 ASSEMBLE_CHECKED_STORE_FLOAT(Movss); |
2225 break; | 2207 break; |
2226 case kCheckedStoreFloat64: | 2208 case kCheckedStoreFloat64: |
2227 ASSEMBLE_CHECKED_STORE_FLOAT(Movsd); | 2209 ASSEMBLE_CHECKED_STORE_FLOAT(Movsd); |
2228 break; | 2210 break; |
2229 case kX64StackCheck: | 2211 case kX64StackCheck: |
2230 __ CompareRoot(rsp, Heap::kStackLimitRootIndex); | 2212 __ CompareRoot(rsp, Heap::kStackLimitRootIndex); |
2231 break; | 2213 break; |
2214 #define EXCHANGE_OPERANDS \ | |
2215 size_t index = 0; \ | |
2216 Register r = i.InputRegister(index++); \ | |
2217 Operand operand = i.MemoryOperand(&index); | |
2218 case kAtomicExchangeInt8: { | |
2219 EXCHANGE_OPERANDS | |
2220 __ xchgb(r, operand, true); | |
binji
2017/01/17 21:45:50
just add the appropriate extension instruction her
aseemgarg
2017/01/21 08:40:37
Done.
| |
2221 break; | |
2222 } | |
2223 case kAtomicExchangeUint8: { | |
2224 EXCHANGE_OPERANDS | |
2225 __ xchgb(r, operand, false); | |
2226 break; | |
2227 } | |
2228 case kAtomicExchangeInt16: { | |
2229 EXCHANGE_OPERANDS | |
2230 __ xchgw(r, operand, true); | |
2231 break; | |
2232 } | |
2233 case kAtomicExchangeUint16: { | |
2234 EXCHANGE_OPERANDS | |
2235 __ xchgw(r, operand, false); | |
2236 break; | |
2237 } | |
2238 case kAtomicExchangeWord32: { | |
2239 EXCHANGE_OPERANDS | |
2240 __ xchgl(r, operand); | |
2241 break; | |
2242 } | |
2243 #undef EXCHANGE_OPERANDS | |
2232 case kAtomicLoadInt8: | 2244 case kAtomicLoadInt8: |
2233 case kAtomicLoadUint8: | 2245 case kAtomicLoadUint8: |
2234 case kAtomicLoadInt16: | 2246 case kAtomicLoadInt16: |
2235 case kAtomicLoadUint16: | 2247 case kAtomicLoadUint16: |
2236 case kAtomicLoadWord32: | 2248 case kAtomicLoadWord32: |
2237 case kAtomicStoreWord8: | 2249 case kAtomicStoreWord8: |
2238 case kAtomicStoreWord16: | 2250 case kAtomicStoreWord16: |
2239 case kAtomicStoreWord32: | 2251 case kAtomicStoreWord32: |
2240 UNREACHABLE(); // Won't be generated by instruction selector. | 2252 UNREACHABLE(); // Won't be generated by instruction selector. |
2241 break; | 2253 break; |
(...skipping 612 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2854 int padding_size = last_lazy_deopt_pc_ + space_needed - current_pc; | 2866 int padding_size = last_lazy_deopt_pc_ + space_needed - current_pc; |
2855 __ Nop(padding_size); | 2867 __ Nop(padding_size); |
2856 } | 2868 } |
2857 } | 2869 } |
2858 | 2870 |
2859 #undef __ | 2871 #undef __ |
2860 | 2872 |
2861 } // namespace compiler | 2873 } // namespace compiler |
2862 } // namespace internal | 2874 } // namespace internal |
2863 } // namespace v8 | 2875 } // namespace v8 |
OLD | NEW |