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 |