| 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 "src/ast/scopes.h" | 7 #include "src/ast/scopes.h" |
| 8 #include "src/compiler/code-generator-impl.h" | 8 #include "src/compiler/code-generator-impl.h" |
| 9 #include "src/compiler/gap-resolver.h" | 9 #include "src/compiler/gap-resolver.h" |
| 10 #include "src/compiler/node-matchers.h" | 10 #include "src/compiler/node-matchers.h" |
| (...skipping 26 matching lines...) Expand all Loading... |
| 37 Immediate InputImmediate(size_t index) { | 37 Immediate InputImmediate(size_t index) { |
| 38 return ToImmediate(instr_->InputAt(index)); | 38 return ToImmediate(instr_->InputAt(index)); |
| 39 } | 39 } |
| 40 | 40 |
| 41 Operand OutputOperand() { return ToOperand(instr_->Output()); } | 41 Operand OutputOperand() { return ToOperand(instr_->Output()); } |
| 42 | 42 |
| 43 Operand ToOperand(InstructionOperand* op, int extra = 0) { | 43 Operand ToOperand(InstructionOperand* op, int extra = 0) { |
| 44 if (op->IsRegister()) { | 44 if (op->IsRegister()) { |
| 45 DCHECK(extra == 0); | 45 DCHECK(extra == 0); |
| 46 return Operand(ToRegister(op)); | 46 return Operand(ToRegister(op)); |
| 47 } else if (op->IsDoubleRegister()) { | 47 } else if (op->IsFPRegister()) { |
| 48 DCHECK(extra == 0); | 48 DCHECK(extra == 0); |
| 49 return Operand(ToDoubleRegister(op)); | 49 return Operand(ToDoubleRegister(op)); |
| 50 } | 50 } |
| 51 DCHECK(op->IsStackSlot() || op->IsDoubleStackSlot()); | 51 DCHECK(op->IsStackSlot() || op->IsFPStackSlot()); |
| 52 return SlotToOperand(AllocatedOperand::cast(op)->index(), extra); | 52 return SlotToOperand(AllocatedOperand::cast(op)->index(), extra); |
| 53 } | 53 } |
| 54 | 54 |
| 55 Operand SlotToOperand(int slot, int extra = 0) { | 55 Operand SlotToOperand(int slot, int extra = 0) { |
| 56 FrameOffset offset = frame_access_state()->GetFrameOffset(slot); | 56 FrameOffset offset = frame_access_state()->GetFrameOffset(slot); |
| 57 return Operand(offset.from_stack_pointer() ? esp : ebp, | 57 return Operand(offset.from_stack_pointer() ? esp : ebp, |
| 58 offset.offset() + extra); | 58 offset.offset() + extra); |
| 59 } | 59 } |
| 60 | 60 |
| 61 Operand HighOperand(InstructionOperand* op) { | 61 Operand HighOperand(InstructionOperand* op) { |
| 62 DCHECK(op->IsDoubleStackSlot()); | 62 DCHECK(op->IsFPStackSlot()); |
| 63 return ToOperand(op, kPointerSize); | 63 return ToOperand(op, kPointerSize); |
| 64 } | 64 } |
| 65 | 65 |
| 66 Immediate ToImmediate(InstructionOperand* operand) { | 66 Immediate ToImmediate(InstructionOperand* operand) { |
| 67 Constant constant = ToConstant(operand); | 67 Constant constant = ToConstant(operand); |
| 68 if (constant.type() == Constant::kInt32 && | 68 if (constant.type() == Constant::kInt32 && |
| 69 (constant.rmode() == RelocInfo::WASM_MEMORY_REFERENCE || | 69 (constant.rmode() == RelocInfo::WASM_MEMORY_REFERENCE || |
| 70 constant.rmode() == RelocInfo::WASM_MEMORY_SIZE_REFERENCE)) { | 70 constant.rmode() == RelocInfo::WASM_MEMORY_SIZE_REFERENCE)) { |
| 71 return Immediate(reinterpret_cast<Address>(constant.ToInt32()), | 71 return Immediate(reinterpret_cast<Address>(constant.ToInt32()), |
| 72 constant.rmode()); | 72 constant.rmode()); |
| (...skipping 901 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 974 __ Cvtui2ss(i.OutputDoubleRegister(), scratch0, scratch1); | 974 __ Cvtui2ss(i.OutputDoubleRegister(), scratch0, scratch1); |
| 975 break; | 975 break; |
| 976 } | 976 } |
| 977 case kSSEInt32ToFloat64: | 977 case kSSEInt32ToFloat64: |
| 978 __ cvtsi2sd(i.OutputDoubleRegister(), i.InputOperand(0)); | 978 __ cvtsi2sd(i.OutputDoubleRegister(), i.InputOperand(0)); |
| 979 break; | 979 break; |
| 980 case kSSEUint32ToFloat64: | 980 case kSSEUint32ToFloat64: |
| 981 __ LoadUint32(i.OutputDoubleRegister(), i.InputOperand(0)); | 981 __ LoadUint32(i.OutputDoubleRegister(), i.InputOperand(0)); |
| 982 break; | 982 break; |
| 983 case kSSEFloat64ExtractLowWord32: | 983 case kSSEFloat64ExtractLowWord32: |
| 984 if (instr->InputAt(0)->IsDoubleStackSlot()) { | 984 if (instr->InputAt(0)->IsFPStackSlot()) { |
| 985 __ mov(i.OutputRegister(), i.InputOperand(0)); | 985 __ mov(i.OutputRegister(), i.InputOperand(0)); |
| 986 } else { | 986 } else { |
| 987 __ movd(i.OutputRegister(), i.InputDoubleRegister(0)); | 987 __ movd(i.OutputRegister(), i.InputDoubleRegister(0)); |
| 988 } | 988 } |
| 989 break; | 989 break; |
| 990 case kSSEFloat64ExtractHighWord32: | 990 case kSSEFloat64ExtractHighWord32: |
| 991 if (instr->InputAt(0)->IsDoubleStackSlot()) { | 991 if (instr->InputAt(0)->IsFPStackSlot()) { |
| 992 __ mov(i.OutputRegister(), i.InputOperand(0, kDoubleSize / 2)); | 992 __ mov(i.OutputRegister(), i.InputOperand(0, kDoubleSize / 2)); |
| 993 } else { | 993 } else { |
| 994 __ Pextrd(i.OutputRegister(), i.InputDoubleRegister(0), 1); | 994 __ Pextrd(i.OutputRegister(), i.InputDoubleRegister(0), 1); |
| 995 } | 995 } |
| 996 break; | 996 break; |
| 997 case kSSEFloat64InsertLowWord32: | 997 case kSSEFloat64InsertLowWord32: |
| 998 __ Pinsrd(i.OutputDoubleRegister(), i.InputOperand(1), 0); | 998 __ Pinsrd(i.OutputDoubleRegister(), i.InputOperand(1), 0); |
| 999 break; | 999 break; |
| 1000 case kSSEFloat64InsertHighWord32: | 1000 case kSSEFloat64InsertHighWord32: |
| 1001 __ Pinsrd(i.OutputDoubleRegister(), i.InputOperand(1), 1); | 1001 __ Pinsrd(i.OutputDoubleRegister(), i.InputOperand(1), 1); |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1170 case kIA32Movss: | 1170 case kIA32Movss: |
| 1171 if (instr->HasOutput()) { | 1171 if (instr->HasOutput()) { |
| 1172 __ movss(i.OutputDoubleRegister(), i.MemoryOperand()); | 1172 __ movss(i.OutputDoubleRegister(), i.MemoryOperand()); |
| 1173 } else { | 1173 } else { |
| 1174 size_t index = 0; | 1174 size_t index = 0; |
| 1175 Operand operand = i.MemoryOperand(&index); | 1175 Operand operand = i.MemoryOperand(&index); |
| 1176 __ movss(operand, i.InputDoubleRegister(index)); | 1176 __ movss(operand, i.InputDoubleRegister(index)); |
| 1177 } | 1177 } |
| 1178 break; | 1178 break; |
| 1179 case kIA32BitcastFI: | 1179 case kIA32BitcastFI: |
| 1180 if (instr->InputAt(0)->IsDoubleStackSlot()) { | 1180 if (instr->InputAt(0)->IsFPStackSlot()) { |
| 1181 __ mov(i.OutputRegister(), i.InputOperand(0)); | 1181 __ mov(i.OutputRegister(), i.InputOperand(0)); |
| 1182 } else { | 1182 } else { |
| 1183 __ movd(i.OutputRegister(), i.InputDoubleRegister(0)); | 1183 __ movd(i.OutputRegister(), i.InputDoubleRegister(0)); |
| 1184 } | 1184 } |
| 1185 break; | 1185 break; |
| 1186 case kIA32BitcastIF: | 1186 case kIA32BitcastIF: |
| 1187 if (instr->InputAt(0)->IsRegister()) { | 1187 if (instr->InputAt(0)->IsRegister()) { |
| 1188 __ movd(i.OutputDoubleRegister(), i.InputRegister(0)); | 1188 __ movd(i.OutputDoubleRegister(), i.InputRegister(0)); |
| 1189 } else { | 1189 } else { |
| 1190 __ movss(i.OutputDoubleRegister(), i.InputOperand(0)); | 1190 __ movss(i.OutputDoubleRegister(), i.InputOperand(0)); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 1219 __ shl(i.OutputRegister(), 3); | 1219 __ shl(i.OutputRegister(), 3); |
| 1220 } else { | 1220 } else { |
| 1221 __ lea(i.OutputRegister(), i.MemoryOperand()); | 1221 __ lea(i.OutputRegister(), i.MemoryOperand()); |
| 1222 } | 1222 } |
| 1223 } else { | 1223 } else { |
| 1224 __ lea(i.OutputRegister(), i.MemoryOperand()); | 1224 __ lea(i.OutputRegister(), i.MemoryOperand()); |
| 1225 } | 1225 } |
| 1226 break; | 1226 break; |
| 1227 } | 1227 } |
| 1228 case kIA32PushFloat32: | 1228 case kIA32PushFloat32: |
| 1229 if (instr->InputAt(0)->IsDoubleRegister()) { | 1229 if (instr->InputAt(0)->IsFPRegister()) { |
| 1230 __ sub(esp, Immediate(kDoubleSize)); | 1230 __ sub(esp, Immediate(kDoubleSize)); |
| 1231 __ movss(Operand(esp, 0), i.InputDoubleRegister(0)); | 1231 __ movss(Operand(esp, 0), i.InputDoubleRegister(0)); |
| 1232 frame_access_state()->IncreaseSPDelta(kDoubleSize / kPointerSize); | 1232 frame_access_state()->IncreaseSPDelta(kDoubleSize / kPointerSize); |
| 1233 } else if (HasImmediateInput(instr, 0)) { | 1233 } else if (HasImmediateInput(instr, 0)) { |
| 1234 __ Move(kScratchDoubleReg, i.InputDouble(0)); | 1234 __ Move(kScratchDoubleReg, i.InputDouble(0)); |
| 1235 __ sub(esp, Immediate(kDoubleSize)); | 1235 __ sub(esp, Immediate(kDoubleSize)); |
| 1236 __ movss(Operand(esp, 0), kScratchDoubleReg); | 1236 __ movss(Operand(esp, 0), kScratchDoubleReg); |
| 1237 frame_access_state()->IncreaseSPDelta(kDoubleSize / kPointerSize); | 1237 frame_access_state()->IncreaseSPDelta(kDoubleSize / kPointerSize); |
| 1238 } else { | 1238 } else { |
| 1239 __ movsd(kScratchDoubleReg, i.InputOperand(0)); | 1239 __ movsd(kScratchDoubleReg, i.InputOperand(0)); |
| 1240 __ sub(esp, Immediate(kDoubleSize)); | 1240 __ sub(esp, Immediate(kDoubleSize)); |
| 1241 __ movss(Operand(esp, 0), kScratchDoubleReg); | 1241 __ movss(Operand(esp, 0), kScratchDoubleReg); |
| 1242 frame_access_state()->IncreaseSPDelta(kDoubleSize / kPointerSize); | 1242 frame_access_state()->IncreaseSPDelta(kDoubleSize / kPointerSize); |
| 1243 } | 1243 } |
| 1244 break; | 1244 break; |
| 1245 case kIA32PushFloat64: | 1245 case kIA32PushFloat64: |
| 1246 if (instr->InputAt(0)->IsDoubleRegister()) { | 1246 if (instr->InputAt(0)->IsFPRegister()) { |
| 1247 __ sub(esp, Immediate(kDoubleSize)); | 1247 __ sub(esp, Immediate(kDoubleSize)); |
| 1248 __ movsd(Operand(esp, 0), i.InputDoubleRegister(0)); | 1248 __ movsd(Operand(esp, 0), i.InputDoubleRegister(0)); |
| 1249 frame_access_state()->IncreaseSPDelta(kDoubleSize / kPointerSize); | 1249 frame_access_state()->IncreaseSPDelta(kDoubleSize / kPointerSize); |
| 1250 } else if (HasImmediateInput(instr, 0)) { | 1250 } else if (HasImmediateInput(instr, 0)) { |
| 1251 __ Move(kScratchDoubleReg, i.InputDouble(0)); | 1251 __ Move(kScratchDoubleReg, i.InputDouble(0)); |
| 1252 __ sub(esp, Immediate(kDoubleSize)); | 1252 __ sub(esp, Immediate(kDoubleSize)); |
| 1253 __ movsd(Operand(esp, 0), kScratchDoubleReg); | 1253 __ movsd(Operand(esp, 0), kScratchDoubleReg); |
| 1254 frame_access_state()->IncreaseSPDelta(kDoubleSize / kPointerSize); | 1254 frame_access_state()->IncreaseSPDelta(kDoubleSize / kPointerSize); |
| 1255 } else { | 1255 } else { |
| 1256 __ movsd(kScratchDoubleReg, i.InputOperand(0)); | 1256 __ movsd(kScratchDoubleReg, i.InputOperand(0)); |
| 1257 __ sub(esp, Immediate(kDoubleSize)); | 1257 __ sub(esp, Immediate(kDoubleSize)); |
| 1258 __ movsd(Operand(esp, 0), kScratchDoubleReg); | 1258 __ movsd(Operand(esp, 0), kScratchDoubleReg); |
| 1259 frame_access_state()->IncreaseSPDelta(kDoubleSize / kPointerSize); | 1259 frame_access_state()->IncreaseSPDelta(kDoubleSize / kPointerSize); |
| 1260 } | 1260 } |
| 1261 break; | 1261 break; |
| 1262 case kIA32Push: | 1262 case kIA32Push: |
| 1263 if (instr->InputAt(0)->IsDoubleRegister()) { | 1263 if (instr->InputAt(0)->IsFPRegister()) { |
| 1264 __ sub(esp, Immediate(kDoubleSize)); | 1264 __ sub(esp, Immediate(kDoubleSize)); |
| 1265 __ movsd(Operand(esp, 0), i.InputDoubleRegister(0)); | 1265 __ movsd(Operand(esp, 0), i.InputDoubleRegister(0)); |
| 1266 frame_access_state()->IncreaseSPDelta(kDoubleSize / kPointerSize); | 1266 frame_access_state()->IncreaseSPDelta(kDoubleSize / kPointerSize); |
| 1267 } else if (HasImmediateInput(instr, 0)) { | 1267 } else if (HasImmediateInput(instr, 0)) { |
| 1268 __ push(i.InputImmediate(0)); | 1268 __ push(i.InputImmediate(0)); |
| 1269 frame_access_state()->IncreaseSPDelta(1); | 1269 frame_access_state()->IncreaseSPDelta(1); |
| 1270 } else { | 1270 } else { |
| 1271 __ push(i.InputOperand(0)); | 1271 __ push(i.InputOperand(0)); |
| 1272 frame_access_state()->IncreaseSPDelta(1); | 1272 frame_access_state()->IncreaseSPDelta(1); |
| 1273 } | 1273 } |
| (...skipping 535 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1809 } | 1809 } |
| 1810 } else if (destination->IsRegister()) { | 1810 } else if (destination->IsRegister()) { |
| 1811 Register dst = g.ToRegister(destination); | 1811 Register dst = g.ToRegister(destination); |
| 1812 __ Move(dst, g.ToImmediate(source)); | 1812 __ Move(dst, g.ToImmediate(source)); |
| 1813 } else if (destination->IsStackSlot()) { | 1813 } else if (destination->IsStackSlot()) { |
| 1814 Operand dst = g.ToOperand(destination); | 1814 Operand dst = g.ToOperand(destination); |
| 1815 __ Move(dst, g.ToImmediate(source)); | 1815 __ Move(dst, g.ToImmediate(source)); |
| 1816 } else if (src_constant.type() == Constant::kFloat32) { | 1816 } else if (src_constant.type() == Constant::kFloat32) { |
| 1817 // TODO(turbofan): Can we do better here? | 1817 // TODO(turbofan): Can we do better here? |
| 1818 uint32_t src = bit_cast<uint32_t>(src_constant.ToFloat32()); | 1818 uint32_t src = bit_cast<uint32_t>(src_constant.ToFloat32()); |
| 1819 if (destination->IsDoubleRegister()) { | 1819 if (destination->IsFPRegister()) { |
| 1820 XMMRegister dst = g.ToDoubleRegister(destination); | 1820 XMMRegister dst = g.ToDoubleRegister(destination); |
| 1821 __ Move(dst, src); | 1821 __ Move(dst, src); |
| 1822 } else { | 1822 } else { |
| 1823 DCHECK(destination->IsDoubleStackSlot()); | 1823 DCHECK(destination->IsFPStackSlot()); |
| 1824 Operand dst = g.ToOperand(destination); | 1824 Operand dst = g.ToOperand(destination); |
| 1825 __ Move(dst, Immediate(src)); | 1825 __ Move(dst, Immediate(src)); |
| 1826 } | 1826 } |
| 1827 } else { | 1827 } else { |
| 1828 DCHECK_EQ(Constant::kFloat64, src_constant.type()); | 1828 DCHECK_EQ(Constant::kFloat64, src_constant.type()); |
| 1829 uint64_t src = bit_cast<uint64_t>(src_constant.ToFloat64()); | 1829 uint64_t src = bit_cast<uint64_t>(src_constant.ToFloat64()); |
| 1830 uint32_t lower = static_cast<uint32_t>(src); | 1830 uint32_t lower = static_cast<uint32_t>(src); |
| 1831 uint32_t upper = static_cast<uint32_t>(src >> 32); | 1831 uint32_t upper = static_cast<uint32_t>(src >> 32); |
| 1832 if (destination->IsDoubleRegister()) { | 1832 if (destination->IsFPRegister()) { |
| 1833 XMMRegister dst = g.ToDoubleRegister(destination); | 1833 XMMRegister dst = g.ToDoubleRegister(destination); |
| 1834 __ Move(dst, src); | 1834 __ Move(dst, src); |
| 1835 } else { | 1835 } else { |
| 1836 DCHECK(destination->IsDoubleStackSlot()); | 1836 DCHECK(destination->IsFPStackSlot()); |
| 1837 Operand dst0 = g.ToOperand(destination); | 1837 Operand dst0 = g.ToOperand(destination); |
| 1838 Operand dst1 = g.HighOperand(destination); | 1838 Operand dst1 = g.HighOperand(destination); |
| 1839 __ Move(dst0, Immediate(lower)); | 1839 __ Move(dst0, Immediate(lower)); |
| 1840 __ Move(dst1, Immediate(upper)); | 1840 __ Move(dst1, Immediate(upper)); |
| 1841 } | 1841 } |
| 1842 } | 1842 } |
| 1843 } else if (source->IsDoubleRegister()) { | 1843 } else if (source->IsFPRegister()) { |
| 1844 XMMRegister src = g.ToDoubleRegister(source); | 1844 XMMRegister src = g.ToDoubleRegister(source); |
| 1845 if (destination->IsDoubleRegister()) { | 1845 if (destination->IsFPRegister()) { |
| 1846 XMMRegister dst = g.ToDoubleRegister(destination); | 1846 XMMRegister dst = g.ToDoubleRegister(destination); |
| 1847 __ movaps(dst, src); | 1847 __ movaps(dst, src); |
| 1848 } else { | 1848 } else { |
| 1849 DCHECK(destination->IsDoubleStackSlot()); | 1849 DCHECK(destination->IsFPStackSlot()); |
| 1850 Operand dst = g.ToOperand(destination); | 1850 Operand dst = g.ToOperand(destination); |
| 1851 __ movsd(dst, src); | 1851 __ movsd(dst, src); |
| 1852 } | 1852 } |
| 1853 } else if (source->IsDoubleStackSlot()) { | 1853 } else if (source->IsFPStackSlot()) { |
| 1854 DCHECK(destination->IsDoubleRegister() || destination->IsDoubleStackSlot()); | 1854 DCHECK(destination->IsFPRegister() || destination->IsFPStackSlot()); |
| 1855 Operand src = g.ToOperand(source); | 1855 Operand src = g.ToOperand(source); |
| 1856 if (destination->IsDoubleRegister()) { | 1856 if (destination->IsFPRegister()) { |
| 1857 XMMRegister dst = g.ToDoubleRegister(destination); | 1857 XMMRegister dst = g.ToDoubleRegister(destination); |
| 1858 __ movsd(dst, src); | 1858 __ movsd(dst, src); |
| 1859 } else { | 1859 } else { |
| 1860 Operand dst = g.ToOperand(destination); | 1860 Operand dst = g.ToOperand(destination); |
| 1861 __ movsd(kScratchDoubleReg, src); | 1861 __ movsd(kScratchDoubleReg, src); |
| 1862 __ movsd(dst, kScratchDoubleReg); | 1862 __ movsd(dst, kScratchDoubleReg); |
| 1863 } | 1863 } |
| 1864 } else { | 1864 } else { |
| 1865 UNREACHABLE(); | 1865 UNREACHABLE(); |
| 1866 } | 1866 } |
| (...skipping 27 matching lines...) Expand all Loading... |
| 1894 Operand dst1 = g.ToOperand(destination); | 1894 Operand dst1 = g.ToOperand(destination); |
| 1895 __ push(dst1); | 1895 __ push(dst1); |
| 1896 frame_access_state()->IncreaseSPDelta(1); | 1896 frame_access_state()->IncreaseSPDelta(1); |
| 1897 Operand src1 = g.ToOperand(source); | 1897 Operand src1 = g.ToOperand(source); |
| 1898 __ push(src1); | 1898 __ push(src1); |
| 1899 Operand dst2 = g.ToOperand(destination); | 1899 Operand dst2 = g.ToOperand(destination); |
| 1900 __ pop(dst2); | 1900 __ pop(dst2); |
| 1901 frame_access_state()->IncreaseSPDelta(-1); | 1901 frame_access_state()->IncreaseSPDelta(-1); |
| 1902 Operand src2 = g.ToOperand(source); | 1902 Operand src2 = g.ToOperand(source); |
| 1903 __ pop(src2); | 1903 __ pop(src2); |
| 1904 } else if (source->IsDoubleRegister() && destination->IsDoubleRegister()) { | 1904 } else if (source->IsFPRegister() && destination->IsFPRegister()) { |
| 1905 // XMM register-register swap. | 1905 // XMM register-register swap. |
| 1906 XMMRegister src = g.ToDoubleRegister(source); | 1906 XMMRegister src = g.ToDoubleRegister(source); |
| 1907 XMMRegister dst = g.ToDoubleRegister(destination); | 1907 XMMRegister dst = g.ToDoubleRegister(destination); |
| 1908 __ movaps(kScratchDoubleReg, src); | 1908 __ movaps(kScratchDoubleReg, src); |
| 1909 __ movaps(src, dst); | 1909 __ movaps(src, dst); |
| 1910 __ movaps(dst, kScratchDoubleReg); | 1910 __ movaps(dst, kScratchDoubleReg); |
| 1911 } else if (source->IsDoubleRegister() && destination->IsDoubleStackSlot()) { | 1911 } else if (source->IsFPRegister() && destination->IsFPStackSlot()) { |
| 1912 // XMM register-memory swap. | 1912 // XMM register-memory swap. |
| 1913 XMMRegister reg = g.ToDoubleRegister(source); | 1913 XMMRegister reg = g.ToDoubleRegister(source); |
| 1914 Operand other = g.ToOperand(destination); | 1914 Operand other = g.ToOperand(destination); |
| 1915 __ movsd(kScratchDoubleReg, other); | 1915 __ movsd(kScratchDoubleReg, other); |
| 1916 __ movsd(other, reg); | 1916 __ movsd(other, reg); |
| 1917 __ movaps(reg, kScratchDoubleReg); | 1917 __ movaps(reg, kScratchDoubleReg); |
| 1918 } else if (source->IsDoubleStackSlot() && destination->IsDoubleStackSlot()) { | 1918 } else if (source->IsFPStackSlot() && destination->IsFPStackSlot()) { |
| 1919 // Double-width memory-to-memory. | 1919 // Double-width memory-to-memory. |
| 1920 Operand src0 = g.ToOperand(source); | 1920 Operand src0 = g.ToOperand(source); |
| 1921 Operand src1 = g.HighOperand(source); | 1921 Operand src1 = g.HighOperand(source); |
| 1922 Operand dst0 = g.ToOperand(destination); | 1922 Operand dst0 = g.ToOperand(destination); |
| 1923 Operand dst1 = g.HighOperand(destination); | 1923 Operand dst1 = g.HighOperand(destination); |
| 1924 __ movsd(kScratchDoubleReg, dst0); // Save destination in scratch register. | 1924 __ movsd(kScratchDoubleReg, dst0); // Save destination in scratch register. |
| 1925 __ push(src0); // Then use stack to copy source to destination. | 1925 __ push(src0); // Then use stack to copy source to destination. |
| 1926 __ pop(dst0); | 1926 __ pop(dst0); |
| 1927 __ push(src1); | 1927 __ push(src1); |
| 1928 __ pop(dst1); | 1928 __ pop(dst1); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 1954 int padding_size = last_lazy_deopt_pc_ + space_needed - current_pc; | 1954 int padding_size = last_lazy_deopt_pc_ + space_needed - current_pc; |
| 1955 __ Nop(padding_size); | 1955 __ Nop(padding_size); |
| 1956 } | 1956 } |
| 1957 } | 1957 } |
| 1958 | 1958 |
| 1959 #undef __ | 1959 #undef __ |
| 1960 | 1960 |
| 1961 } // namespace compiler | 1961 } // namespace compiler |
| 1962 } // namespace internal | 1962 } // namespace internal |
| 1963 } // namespace v8 | 1963 } // namespace v8 |
| OLD | NEW |