| OLD | NEW |
| 1 // Copyright (c) 1994-2006 Sun Microsystems Inc. | 1 // Copyright (c) 1994-2006 Sun Microsystems Inc. |
| 2 // All Rights Reserved. | 2 // All Rights Reserved. |
| 3 // | 3 // |
| 4 // Redistribution and use in source and binary forms, with or without | 4 // Redistribution and use in source and binary forms, with or without |
| 5 // modification, are permitted provided that the following conditions | 5 // modification, are permitted provided that the following conditions |
| 6 // are met: | 6 // are met: |
| 7 // | 7 // |
| 8 // - Redistributions of source code must retain the above copyright notice, | 8 // - Redistributions of source code must retain the above copyright notice, |
| 9 // this list of conditions and the following disclaimer. | 9 // this list of conditions and the following disclaimer. |
| 10 // | 10 // |
| (...skipping 18 matching lines...) Expand all Loading... |
| 29 // STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | 29 // STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| 30 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED | 30 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED |
| 31 // OF THE POSSIBILITY OF SUCH DAMAGE. | 31 // OF THE POSSIBILITY OF SUCH DAMAGE. |
| 32 | 32 |
| 33 // The original source code covered by the above license above has been modified | 33 // The original source code covered by the above license above has been modified |
| 34 // significantly by Google Inc. | 34 // significantly by Google Inc. |
| 35 // Copyright 2012 the V8 project authors. All rights reserved. | 35 // Copyright 2012 the V8 project authors. All rights reserved. |
| 36 | 36 |
| 37 #include "v8.h" | 37 #include "v8.h" |
| 38 | 38 |
| 39 #if V8_TARGET_ARCH_IA32 | 39 #if V8_TARGET_ARCH_X87 |
| 40 | 40 |
| 41 #include "disassembler.h" | 41 #include "disassembler.h" |
| 42 #include "macro-assembler.h" | 42 #include "macro-assembler.h" |
| 43 #include "serialize.h" | 43 #include "serialize.h" |
| 44 | 44 |
| 45 namespace v8 { | 45 namespace v8 { |
| 46 namespace internal { | 46 namespace internal { |
| 47 | 47 |
| 48 // ----------------------------------------------------------------------------- | 48 // ----------------------------------------------------------------------------- |
| 49 // Implementation of CpuFeatures | 49 // Implementation of CpuFeatures |
| 50 | 50 |
| 51 void CpuFeatures::ProbeImpl(bool cross_compile) { | 51 void CpuFeatures::ProbeImpl(bool cross_compile) { |
| 52 CPU cpu; | 52 CPU cpu; |
| 53 CHECK(cpu.has_sse2()); // SSE2 support is mandatory. | 53 // SAHF must be available in compat/legacy mode. |
| 54 CHECK(cpu.has_cmov()); // CMOV support is mandatory. | 54 CHECK(cpu.has_sahf()); |
| 55 CHECK(cpu.has_sahf()); // SAHF must be available in compat/legacy mode. | |
| 56 supported_ |= 1u << SAHF; | 55 supported_ |= 1u << SAHF; |
| 57 supported_ |= OS::CpuFeaturesImpliedByPlatform(); | 56 supported_ |= OS::CpuFeaturesImpliedByPlatform(); |
| 58 | 57 |
| 59 // Only use statically determined features for cross compile (snapshot). | 58 // Only use statically determined features for cross compile (snapshot). |
| 60 if (cross_compile) return; | 59 if (cross_compile) return; |
| 61 | |
| 62 if (cpu.has_sse41() && FLAG_enable_sse4_1) supported_ |= 1u << SSE4_1; | |
| 63 if (cpu.has_sse3() && FLAG_enable_sse3) supported_ |= 1u << SSE3; | |
| 64 } | 60 } |
| 65 | 61 |
| 66 | 62 |
| 67 void CpuFeatures::PrintTarget() { } | 63 void CpuFeatures::PrintTarget() { } |
| 68 void CpuFeatures::PrintFeatures() { } | 64 void CpuFeatures::PrintFeatures() { } |
| 69 | 65 |
| 70 | 66 |
| 71 // ----------------------------------------------------------------------------- | 67 // ----------------------------------------------------------------------------- |
| 72 // Implementation of Displacement | 68 // Implementation of Displacement |
| 73 | 69 |
| (...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 285 while (*a == 0x66) a++; | 281 while (*a == 0x66) a++; |
| 286 if (*a == 0x90) return true; | 282 if (*a == 0x90) return true; |
| 287 if (a[0] == 0xf && a[1] == 0x1f) return true; | 283 if (a[0] == 0xf && a[1] == 0x1f) return true; |
| 288 return false; | 284 return false; |
| 289 } | 285 } |
| 290 | 286 |
| 291 | 287 |
| 292 void Assembler::Nop(int bytes) { | 288 void Assembler::Nop(int bytes) { |
| 293 EnsureSpace ensure_space(this); | 289 EnsureSpace ensure_space(this); |
| 294 | 290 |
| 295 // Multi byte nops from http://support.amd.com/us/Processor_TechDocs/40546.pdf | 291 // Older CPUs that do not support SSE2 may not support multibyte NOP |
| 296 while (bytes > 0) { | 292 // instructions. |
| 297 switch (bytes) { | 293 for (; bytes > 0; bytes--) { |
| 298 case 2: | 294 EMIT(0x90); |
| 299 EMIT(0x66); | |
| 300 case 1: | |
| 301 EMIT(0x90); | |
| 302 return; | |
| 303 case 3: | |
| 304 EMIT(0xf); | |
| 305 EMIT(0x1f); | |
| 306 EMIT(0); | |
| 307 return; | |
| 308 case 4: | |
| 309 EMIT(0xf); | |
| 310 EMIT(0x1f); | |
| 311 EMIT(0x40); | |
| 312 EMIT(0); | |
| 313 return; | |
| 314 case 6: | |
| 315 EMIT(0x66); | |
| 316 case 5: | |
| 317 EMIT(0xf); | |
| 318 EMIT(0x1f); | |
| 319 EMIT(0x44); | |
| 320 EMIT(0); | |
| 321 EMIT(0); | |
| 322 return; | |
| 323 case 7: | |
| 324 EMIT(0xf); | |
| 325 EMIT(0x1f); | |
| 326 EMIT(0x80); | |
| 327 EMIT(0); | |
| 328 EMIT(0); | |
| 329 EMIT(0); | |
| 330 EMIT(0); | |
| 331 return; | |
| 332 default: | |
| 333 case 11: | |
| 334 EMIT(0x66); | |
| 335 bytes--; | |
| 336 case 10: | |
| 337 EMIT(0x66); | |
| 338 bytes--; | |
| 339 case 9: | |
| 340 EMIT(0x66); | |
| 341 bytes--; | |
| 342 case 8: | |
| 343 EMIT(0xf); | |
| 344 EMIT(0x1f); | |
| 345 EMIT(0x84); | |
| 346 EMIT(0); | |
| 347 EMIT(0); | |
| 348 EMIT(0); | |
| 349 EMIT(0); | |
| 350 EMIT(0); | |
| 351 bytes -= 8; | |
| 352 } | |
| 353 } | 295 } |
| 296 return; |
| 354 } | 297 } |
| 355 | 298 |
| 356 | 299 |
| 357 void Assembler::CodeTargetAlign() { | 300 void Assembler::CodeTargetAlign() { |
| 358 Align(16); // Preferred alignment of jump targets on ia32. | 301 Align(16); // Preferred alignment of jump targets on ia32. |
| 359 } | 302 } |
| 360 | 303 |
| 361 | 304 |
| 362 void Assembler::cpuid() { | 305 void Assembler::cpuid() { |
| 363 EnsureSpace ensure_space(this); | 306 EnsureSpace ensure_space(this); |
| (...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 583 | 526 |
| 584 | 527 |
| 585 void Assembler::movzx_w(Register dst, const Operand& src) { | 528 void Assembler::movzx_w(Register dst, const Operand& src) { |
| 586 EnsureSpace ensure_space(this); | 529 EnsureSpace ensure_space(this); |
| 587 EMIT(0x0F); | 530 EMIT(0x0F); |
| 588 EMIT(0xB7); | 531 EMIT(0xB7); |
| 589 emit_operand(dst, src); | 532 emit_operand(dst, src); |
| 590 } | 533 } |
| 591 | 534 |
| 592 | 535 |
| 593 void Assembler::cmov(Condition cc, Register dst, const Operand& src) { | |
| 594 EnsureSpace ensure_space(this); | |
| 595 // Opcode: 0f 40 + cc /r. | |
| 596 EMIT(0x0F); | |
| 597 EMIT(0x40 + cc); | |
| 598 emit_operand(dst, src); | |
| 599 } | |
| 600 | |
| 601 | |
| 602 void Assembler::cld() { | 536 void Assembler::cld() { |
| 603 EnsureSpace ensure_space(this); | 537 EnsureSpace ensure_space(this); |
| 604 EMIT(0xFC); | 538 EMIT(0xFC); |
| 605 } | 539 } |
| 606 | 540 |
| 607 | 541 |
| 608 void Assembler::rep_movs() { | 542 void Assembler::rep_movs() { |
| 609 EnsureSpace ensure_space(this); | 543 EnsureSpace ensure_space(this); |
| 610 EMIT(0xF3); | 544 EMIT(0xF3); |
| 611 EMIT(0xA5); | 545 EMIT(0xA5); |
| (...skipping 1264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1876 | 1810 |
| 1877 void Assembler::setcc(Condition cc, Register reg) { | 1811 void Assembler::setcc(Condition cc, Register reg) { |
| 1878 ASSERT(reg.is_byte_register()); | 1812 ASSERT(reg.is_byte_register()); |
| 1879 EnsureSpace ensure_space(this); | 1813 EnsureSpace ensure_space(this); |
| 1880 EMIT(0x0F); | 1814 EMIT(0x0F); |
| 1881 EMIT(0x90 | cc); | 1815 EMIT(0x90 | cc); |
| 1882 EMIT(0xC0 | reg.code()); | 1816 EMIT(0xC0 | reg.code()); |
| 1883 } | 1817 } |
| 1884 | 1818 |
| 1885 | 1819 |
| 1886 void Assembler::cvttss2si(Register dst, const Operand& src) { | |
| 1887 EnsureSpace ensure_space(this); | |
| 1888 EMIT(0xF3); | |
| 1889 EMIT(0x0F); | |
| 1890 EMIT(0x2C); | |
| 1891 emit_operand(dst, src); | |
| 1892 } | |
| 1893 | |
| 1894 | |
| 1895 void Assembler::cvttsd2si(Register dst, const Operand& src) { | |
| 1896 EnsureSpace ensure_space(this); | |
| 1897 EMIT(0xF2); | |
| 1898 EMIT(0x0F); | |
| 1899 EMIT(0x2C); | |
| 1900 emit_operand(dst, src); | |
| 1901 } | |
| 1902 | |
| 1903 | |
| 1904 void Assembler::cvtsd2si(Register dst, XMMRegister src) { | |
| 1905 EnsureSpace ensure_space(this); | |
| 1906 EMIT(0xF2); | |
| 1907 EMIT(0x0F); | |
| 1908 EMIT(0x2D); | |
| 1909 emit_sse_operand(dst, src); | |
| 1910 } | |
| 1911 | |
| 1912 | |
| 1913 void Assembler::cvtsi2sd(XMMRegister dst, const Operand& src) { | |
| 1914 EnsureSpace ensure_space(this); | |
| 1915 EMIT(0xF2); | |
| 1916 EMIT(0x0F); | |
| 1917 EMIT(0x2A); | |
| 1918 emit_sse_operand(dst, src); | |
| 1919 } | |
| 1920 | |
| 1921 | |
| 1922 void Assembler::cvtss2sd(XMMRegister dst, XMMRegister src) { | |
| 1923 EnsureSpace ensure_space(this); | |
| 1924 EMIT(0xF3); | |
| 1925 EMIT(0x0F); | |
| 1926 EMIT(0x5A); | |
| 1927 emit_sse_operand(dst, src); | |
| 1928 } | |
| 1929 | |
| 1930 | |
| 1931 void Assembler::cvtsd2ss(XMMRegister dst, XMMRegister src) { | |
| 1932 EnsureSpace ensure_space(this); | |
| 1933 EMIT(0xF2); | |
| 1934 EMIT(0x0F); | |
| 1935 EMIT(0x5A); | |
| 1936 emit_sse_operand(dst, src); | |
| 1937 } | |
| 1938 | |
| 1939 | |
| 1940 void Assembler::addsd(XMMRegister dst, XMMRegister src) { | |
| 1941 EnsureSpace ensure_space(this); | |
| 1942 EMIT(0xF2); | |
| 1943 EMIT(0x0F); | |
| 1944 EMIT(0x58); | |
| 1945 emit_sse_operand(dst, src); | |
| 1946 } | |
| 1947 | |
| 1948 | |
| 1949 void Assembler::addsd(XMMRegister dst, const Operand& src) { | |
| 1950 EnsureSpace ensure_space(this); | |
| 1951 EMIT(0xF2); | |
| 1952 EMIT(0x0F); | |
| 1953 EMIT(0x58); | |
| 1954 emit_sse_operand(dst, src); | |
| 1955 } | |
| 1956 | |
| 1957 | |
| 1958 void Assembler::mulsd(XMMRegister dst, XMMRegister src) { | |
| 1959 EnsureSpace ensure_space(this); | |
| 1960 EMIT(0xF2); | |
| 1961 EMIT(0x0F); | |
| 1962 EMIT(0x59); | |
| 1963 emit_sse_operand(dst, src); | |
| 1964 } | |
| 1965 | |
| 1966 | |
| 1967 void Assembler::mulsd(XMMRegister dst, const Operand& src) { | |
| 1968 EnsureSpace ensure_space(this); | |
| 1969 EMIT(0xF2); | |
| 1970 EMIT(0x0F); | |
| 1971 EMIT(0x59); | |
| 1972 emit_sse_operand(dst, src); | |
| 1973 } | |
| 1974 | |
| 1975 | |
| 1976 void Assembler::subsd(XMMRegister dst, XMMRegister src) { | |
| 1977 EnsureSpace ensure_space(this); | |
| 1978 EMIT(0xF2); | |
| 1979 EMIT(0x0F); | |
| 1980 EMIT(0x5C); | |
| 1981 emit_sse_operand(dst, src); | |
| 1982 } | |
| 1983 | |
| 1984 | |
| 1985 void Assembler::divsd(XMMRegister dst, XMMRegister src) { | |
| 1986 EnsureSpace ensure_space(this); | |
| 1987 EMIT(0xF2); | |
| 1988 EMIT(0x0F); | |
| 1989 EMIT(0x5E); | |
| 1990 emit_sse_operand(dst, src); | |
| 1991 } | |
| 1992 | |
| 1993 | |
| 1994 void Assembler::xorpd(XMMRegister dst, XMMRegister src) { | |
| 1995 EnsureSpace ensure_space(this); | |
| 1996 EMIT(0x66); | |
| 1997 EMIT(0x0F); | |
| 1998 EMIT(0x57); | |
| 1999 emit_sse_operand(dst, src); | |
| 2000 } | |
| 2001 | |
| 2002 | |
| 2003 void Assembler::andps(XMMRegister dst, const Operand& src) { | |
| 2004 EnsureSpace ensure_space(this); | |
| 2005 EMIT(0x0F); | |
| 2006 EMIT(0x54); | |
| 2007 emit_sse_operand(dst, src); | |
| 2008 } | |
| 2009 | |
| 2010 | |
| 2011 void Assembler::orps(XMMRegister dst, const Operand& src) { | |
| 2012 EnsureSpace ensure_space(this); | |
| 2013 EMIT(0x0F); | |
| 2014 EMIT(0x56); | |
| 2015 emit_sse_operand(dst, src); | |
| 2016 } | |
| 2017 | |
| 2018 | |
| 2019 void Assembler::xorps(XMMRegister dst, const Operand& src) { | |
| 2020 EnsureSpace ensure_space(this); | |
| 2021 EMIT(0x0F); | |
| 2022 EMIT(0x57); | |
| 2023 emit_sse_operand(dst, src); | |
| 2024 } | |
| 2025 | |
| 2026 | |
| 2027 void Assembler::addps(XMMRegister dst, const Operand& src) { | |
| 2028 EnsureSpace ensure_space(this); | |
| 2029 EMIT(0x0F); | |
| 2030 EMIT(0x58); | |
| 2031 emit_sse_operand(dst, src); | |
| 2032 } | |
| 2033 | |
| 2034 | |
| 2035 void Assembler::subps(XMMRegister dst, const Operand& src) { | |
| 2036 EnsureSpace ensure_space(this); | |
| 2037 EMIT(0x0F); | |
| 2038 EMIT(0x5C); | |
| 2039 emit_sse_operand(dst, src); | |
| 2040 } | |
| 2041 | |
| 2042 | |
| 2043 void Assembler::mulps(XMMRegister dst, const Operand& src) { | |
| 2044 EnsureSpace ensure_space(this); | |
| 2045 EMIT(0x0F); | |
| 2046 EMIT(0x59); | |
| 2047 emit_sse_operand(dst, src); | |
| 2048 } | |
| 2049 | |
| 2050 | |
| 2051 void Assembler::divps(XMMRegister dst, const Operand& src) { | |
| 2052 EnsureSpace ensure_space(this); | |
| 2053 EMIT(0x0F); | |
| 2054 EMIT(0x5E); | |
| 2055 emit_sse_operand(dst, src); | |
| 2056 } | |
| 2057 | |
| 2058 | |
| 2059 void Assembler::sqrtsd(XMMRegister dst, XMMRegister src) { | |
| 2060 EnsureSpace ensure_space(this); | |
| 2061 EMIT(0xF2); | |
| 2062 EMIT(0x0F); | |
| 2063 EMIT(0x51); | |
| 2064 emit_sse_operand(dst, src); | |
| 2065 } | |
| 2066 | |
| 2067 | |
| 2068 void Assembler::andpd(XMMRegister dst, XMMRegister src) { | |
| 2069 EnsureSpace ensure_space(this); | |
| 2070 EMIT(0x66); | |
| 2071 EMIT(0x0F); | |
| 2072 EMIT(0x54); | |
| 2073 emit_sse_operand(dst, src); | |
| 2074 } | |
| 2075 | |
| 2076 | |
| 2077 void Assembler::orpd(XMMRegister dst, XMMRegister src) { | |
| 2078 EnsureSpace ensure_space(this); | |
| 2079 EMIT(0x66); | |
| 2080 EMIT(0x0F); | |
| 2081 EMIT(0x56); | |
| 2082 emit_sse_operand(dst, src); | |
| 2083 } | |
| 2084 | |
| 2085 | |
| 2086 void Assembler::ucomisd(XMMRegister dst, const Operand& src) { | |
| 2087 EnsureSpace ensure_space(this); | |
| 2088 EMIT(0x66); | |
| 2089 EMIT(0x0F); | |
| 2090 EMIT(0x2E); | |
| 2091 emit_sse_operand(dst, src); | |
| 2092 } | |
| 2093 | |
| 2094 | |
| 2095 void Assembler::roundsd(XMMRegister dst, XMMRegister src, RoundingMode mode) { | |
| 2096 ASSERT(IsEnabled(SSE4_1)); | |
| 2097 EnsureSpace ensure_space(this); | |
| 2098 EMIT(0x66); | |
| 2099 EMIT(0x0F); | |
| 2100 EMIT(0x3A); | |
| 2101 EMIT(0x0B); | |
| 2102 emit_sse_operand(dst, src); | |
| 2103 // Mask precision exeption. | |
| 2104 EMIT(static_cast<byte>(mode) | 0x8); | |
| 2105 } | |
| 2106 | |
| 2107 | |
| 2108 void Assembler::movmskpd(Register dst, XMMRegister src) { | |
| 2109 EnsureSpace ensure_space(this); | |
| 2110 EMIT(0x66); | |
| 2111 EMIT(0x0F); | |
| 2112 EMIT(0x50); | |
| 2113 emit_sse_operand(dst, src); | |
| 2114 } | |
| 2115 | |
| 2116 | |
| 2117 void Assembler::movmskps(Register dst, XMMRegister src) { | |
| 2118 EnsureSpace ensure_space(this); | |
| 2119 EMIT(0x0F); | |
| 2120 EMIT(0x50); | |
| 2121 emit_sse_operand(dst, src); | |
| 2122 } | |
| 2123 | |
| 2124 | |
| 2125 void Assembler::pcmpeqd(XMMRegister dst, XMMRegister src) { | |
| 2126 EnsureSpace ensure_space(this); | |
| 2127 EMIT(0x66); | |
| 2128 EMIT(0x0F); | |
| 2129 EMIT(0x76); | |
| 2130 emit_sse_operand(dst, src); | |
| 2131 } | |
| 2132 | |
| 2133 | |
| 2134 void Assembler::cmpltsd(XMMRegister dst, XMMRegister src) { | |
| 2135 EnsureSpace ensure_space(this); | |
| 2136 EMIT(0xF2); | |
| 2137 EMIT(0x0F); | |
| 2138 EMIT(0xC2); | |
| 2139 emit_sse_operand(dst, src); | |
| 2140 EMIT(1); // LT == 1 | |
| 2141 } | |
| 2142 | |
| 2143 | |
| 2144 void Assembler::movaps(XMMRegister dst, XMMRegister src) { | |
| 2145 EnsureSpace ensure_space(this); | |
| 2146 EMIT(0x0F); | |
| 2147 EMIT(0x28); | |
| 2148 emit_sse_operand(dst, src); | |
| 2149 } | |
| 2150 | |
| 2151 | |
| 2152 void Assembler::shufps(XMMRegister dst, XMMRegister src, byte imm8) { | |
| 2153 ASSERT(is_uint8(imm8)); | |
| 2154 EnsureSpace ensure_space(this); | |
| 2155 EMIT(0x0F); | |
| 2156 EMIT(0xC6); | |
| 2157 emit_sse_operand(dst, src); | |
| 2158 EMIT(imm8); | |
| 2159 } | |
| 2160 | |
| 2161 | |
| 2162 void Assembler::movdqa(const Operand& dst, XMMRegister src) { | |
| 2163 EnsureSpace ensure_space(this); | |
| 2164 EMIT(0x66); | |
| 2165 EMIT(0x0F); | |
| 2166 EMIT(0x7F); | |
| 2167 emit_sse_operand(src, dst); | |
| 2168 } | |
| 2169 | |
| 2170 | |
| 2171 void Assembler::movdqa(XMMRegister dst, const Operand& src) { | |
| 2172 EnsureSpace ensure_space(this); | |
| 2173 EMIT(0x66); | |
| 2174 EMIT(0x0F); | |
| 2175 EMIT(0x6F); | |
| 2176 emit_sse_operand(dst, src); | |
| 2177 } | |
| 2178 | |
| 2179 | |
| 2180 void Assembler::movdqu(const Operand& dst, XMMRegister src ) { | |
| 2181 EnsureSpace ensure_space(this); | |
| 2182 EMIT(0xF3); | |
| 2183 EMIT(0x0F); | |
| 2184 EMIT(0x7F); | |
| 2185 emit_sse_operand(src, dst); | |
| 2186 } | |
| 2187 | |
| 2188 | |
| 2189 void Assembler::movdqu(XMMRegister dst, const Operand& src) { | |
| 2190 EnsureSpace ensure_space(this); | |
| 2191 EMIT(0xF3); | |
| 2192 EMIT(0x0F); | |
| 2193 EMIT(0x6F); | |
| 2194 emit_sse_operand(dst, src); | |
| 2195 } | |
| 2196 | |
| 2197 | |
| 2198 void Assembler::movntdqa(XMMRegister dst, const Operand& src) { | |
| 2199 ASSERT(IsEnabled(SSE4_1)); | |
| 2200 EnsureSpace ensure_space(this); | |
| 2201 EMIT(0x66); | |
| 2202 EMIT(0x0F); | |
| 2203 EMIT(0x38); | |
| 2204 EMIT(0x2A); | |
| 2205 emit_sse_operand(dst, src); | |
| 2206 } | |
| 2207 | |
| 2208 | |
| 2209 void Assembler::movntdq(const Operand& dst, XMMRegister src) { | |
| 2210 EnsureSpace ensure_space(this); | |
| 2211 EMIT(0x66); | |
| 2212 EMIT(0x0F); | |
| 2213 EMIT(0xE7); | |
| 2214 emit_sse_operand(src, dst); | |
| 2215 } | |
| 2216 | |
| 2217 | |
| 2218 void Assembler::prefetch(const Operand& src, int level) { | |
| 2219 ASSERT(is_uint2(level)); | |
| 2220 EnsureSpace ensure_space(this); | |
| 2221 EMIT(0x0F); | |
| 2222 EMIT(0x18); | |
| 2223 // Emit hint number in Reg position of RegR/M. | |
| 2224 XMMRegister code = XMMRegister::from_code(level); | |
| 2225 emit_sse_operand(code, src); | |
| 2226 } | |
| 2227 | |
| 2228 | |
| 2229 void Assembler::movsd(const Operand& dst, XMMRegister src ) { | |
| 2230 EnsureSpace ensure_space(this); | |
| 2231 EMIT(0xF2); // double | |
| 2232 EMIT(0x0F); | |
| 2233 EMIT(0x11); // store | |
| 2234 emit_sse_operand(src, dst); | |
| 2235 } | |
| 2236 | |
| 2237 | |
| 2238 void Assembler::movsd(XMMRegister dst, const Operand& src) { | |
| 2239 EnsureSpace ensure_space(this); | |
| 2240 EMIT(0xF2); // double | |
| 2241 EMIT(0x0F); | |
| 2242 EMIT(0x10); // load | |
| 2243 emit_sse_operand(dst, src); | |
| 2244 } | |
| 2245 | |
| 2246 | |
| 2247 void Assembler::movss(const Operand& dst, XMMRegister src ) { | |
| 2248 EnsureSpace ensure_space(this); | |
| 2249 EMIT(0xF3); // float | |
| 2250 EMIT(0x0F); | |
| 2251 EMIT(0x11); // store | |
| 2252 emit_sse_operand(src, dst); | |
| 2253 } | |
| 2254 | |
| 2255 | |
| 2256 void Assembler::movss(XMMRegister dst, const Operand& src) { | |
| 2257 EnsureSpace ensure_space(this); | |
| 2258 EMIT(0xF3); // float | |
| 2259 EMIT(0x0F); | |
| 2260 EMIT(0x10); // load | |
| 2261 emit_sse_operand(dst, src); | |
| 2262 } | |
| 2263 | |
| 2264 | |
| 2265 void Assembler::movd(XMMRegister dst, const Operand& src) { | |
| 2266 EnsureSpace ensure_space(this); | |
| 2267 EMIT(0x66); | |
| 2268 EMIT(0x0F); | |
| 2269 EMIT(0x6E); | |
| 2270 emit_sse_operand(dst, src); | |
| 2271 } | |
| 2272 | |
| 2273 | |
| 2274 void Assembler::movd(const Operand& dst, XMMRegister src) { | |
| 2275 EnsureSpace ensure_space(this); | |
| 2276 EMIT(0x66); | |
| 2277 EMIT(0x0F); | |
| 2278 EMIT(0x7E); | |
| 2279 emit_sse_operand(src, dst); | |
| 2280 } | |
| 2281 | |
| 2282 | |
| 2283 void Assembler::extractps(Register dst, XMMRegister src, byte imm8) { | |
| 2284 ASSERT(IsEnabled(SSE4_1)); | |
| 2285 ASSERT(is_uint8(imm8)); | |
| 2286 EnsureSpace ensure_space(this); | |
| 2287 EMIT(0x66); | |
| 2288 EMIT(0x0F); | |
| 2289 EMIT(0x3A); | |
| 2290 EMIT(0x17); | |
| 2291 emit_sse_operand(src, dst); | |
| 2292 EMIT(imm8); | |
| 2293 } | |
| 2294 | |
| 2295 | |
| 2296 void Assembler::pand(XMMRegister dst, XMMRegister src) { | |
| 2297 EnsureSpace ensure_space(this); | |
| 2298 EMIT(0x66); | |
| 2299 EMIT(0x0F); | |
| 2300 EMIT(0xDB); | |
| 2301 emit_sse_operand(dst, src); | |
| 2302 } | |
| 2303 | |
| 2304 | |
| 2305 void Assembler::pxor(XMMRegister dst, XMMRegister src) { | |
| 2306 EnsureSpace ensure_space(this); | |
| 2307 EMIT(0x66); | |
| 2308 EMIT(0x0F); | |
| 2309 EMIT(0xEF); | |
| 2310 emit_sse_operand(dst, src); | |
| 2311 } | |
| 2312 | |
| 2313 | |
| 2314 void Assembler::por(XMMRegister dst, XMMRegister src) { | |
| 2315 EnsureSpace ensure_space(this); | |
| 2316 EMIT(0x66); | |
| 2317 EMIT(0x0F); | |
| 2318 EMIT(0xEB); | |
| 2319 emit_sse_operand(dst, src); | |
| 2320 } | |
| 2321 | |
| 2322 | |
| 2323 void Assembler::ptest(XMMRegister dst, XMMRegister src) { | |
| 2324 ASSERT(IsEnabled(SSE4_1)); | |
| 2325 EnsureSpace ensure_space(this); | |
| 2326 EMIT(0x66); | |
| 2327 EMIT(0x0F); | |
| 2328 EMIT(0x38); | |
| 2329 EMIT(0x17); | |
| 2330 emit_sse_operand(dst, src); | |
| 2331 } | |
| 2332 | |
| 2333 | |
| 2334 void Assembler::psllq(XMMRegister reg, int8_t shift) { | |
| 2335 EnsureSpace ensure_space(this); | |
| 2336 EMIT(0x66); | |
| 2337 EMIT(0x0F); | |
| 2338 EMIT(0x73); | |
| 2339 emit_sse_operand(esi, reg); // esi == 6 | |
| 2340 EMIT(shift); | |
| 2341 } | |
| 2342 | |
| 2343 | |
| 2344 void Assembler::psllq(XMMRegister dst, XMMRegister src) { | |
| 2345 EnsureSpace ensure_space(this); | |
| 2346 EMIT(0x66); | |
| 2347 EMIT(0x0F); | |
| 2348 EMIT(0xF3); | |
| 2349 emit_sse_operand(dst, src); | |
| 2350 } | |
| 2351 | |
| 2352 | |
| 2353 void Assembler::psrlq(XMMRegister reg, int8_t shift) { | |
| 2354 EnsureSpace ensure_space(this); | |
| 2355 EMIT(0x66); | |
| 2356 EMIT(0x0F); | |
| 2357 EMIT(0x73); | |
| 2358 emit_sse_operand(edx, reg); // edx == 2 | |
| 2359 EMIT(shift); | |
| 2360 } | |
| 2361 | |
| 2362 | |
| 2363 void Assembler::psrlq(XMMRegister dst, XMMRegister src) { | |
| 2364 EnsureSpace ensure_space(this); | |
| 2365 EMIT(0x66); | |
| 2366 EMIT(0x0F); | |
| 2367 EMIT(0xD3); | |
| 2368 emit_sse_operand(dst, src); | |
| 2369 } | |
| 2370 | |
| 2371 | |
| 2372 void Assembler::pshufd(XMMRegister dst, XMMRegister src, uint8_t shuffle) { | |
| 2373 EnsureSpace ensure_space(this); | |
| 2374 EMIT(0x66); | |
| 2375 EMIT(0x0F); | |
| 2376 EMIT(0x70); | |
| 2377 emit_sse_operand(dst, src); | |
| 2378 EMIT(shuffle); | |
| 2379 } | |
| 2380 | |
| 2381 | |
| 2382 void Assembler::pextrd(const Operand& dst, XMMRegister src, int8_t offset) { | |
| 2383 ASSERT(IsEnabled(SSE4_1)); | |
| 2384 EnsureSpace ensure_space(this); | |
| 2385 EMIT(0x66); | |
| 2386 EMIT(0x0F); | |
| 2387 EMIT(0x3A); | |
| 2388 EMIT(0x16); | |
| 2389 emit_sse_operand(src, dst); | |
| 2390 EMIT(offset); | |
| 2391 } | |
| 2392 | |
| 2393 | |
| 2394 void Assembler::pinsrd(XMMRegister dst, const Operand& src, int8_t offset) { | |
| 2395 ASSERT(IsEnabled(SSE4_1)); | |
| 2396 EnsureSpace ensure_space(this); | |
| 2397 EMIT(0x66); | |
| 2398 EMIT(0x0F); | |
| 2399 EMIT(0x3A); | |
| 2400 EMIT(0x22); | |
| 2401 emit_sse_operand(dst, src); | |
| 2402 EMIT(offset); | |
| 2403 } | |
| 2404 | |
| 2405 | |
| 2406 void Assembler::emit_sse_operand(XMMRegister reg, const Operand& adr) { | |
| 2407 Register ireg = { reg.code() }; | |
| 2408 emit_operand(ireg, adr); | |
| 2409 } | |
| 2410 | |
| 2411 | |
| 2412 void Assembler::emit_sse_operand(XMMRegister dst, XMMRegister src) { | |
| 2413 EMIT(0xC0 | dst.code() << 3 | src.code()); | |
| 2414 } | |
| 2415 | |
| 2416 | |
| 2417 void Assembler::emit_sse_operand(Register dst, XMMRegister src) { | |
| 2418 EMIT(0xC0 | dst.code() << 3 | src.code()); | |
| 2419 } | |
| 2420 | |
| 2421 | |
| 2422 void Assembler::emit_sse_operand(XMMRegister dst, Register src) { | |
| 2423 EMIT(0xC0 | (dst.code() << 3) | src.code()); | |
| 2424 } | |
| 2425 | |
| 2426 | |
| 2427 void Assembler::Print() { | 1820 void Assembler::Print() { |
| 2428 Disassembler::Decode(isolate(), stdout, buffer_, pc_); | 1821 Disassembler::Decode(isolate(), stdout, buffer_, pc_); |
| 2429 } | 1822 } |
| 2430 | 1823 |
| 2431 | 1824 |
| 2432 void Assembler::RecordJSReturn() { | 1825 void Assembler::RecordJSReturn() { |
| 2433 positions_recorder()->WriteRecordedPositions(); | 1826 positions_recorder()->WriteRecordedPositions(); |
| 2434 EnsureSpace ensure_space(this); | 1827 EnsureSpace ensure_space(this); |
| 2435 RecordRelocInfo(RelocInfo::JS_RETURN); | 1828 RecordRelocInfo(RelocInfo::JS_RETURN); |
| 2436 } | 1829 } |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2580 void Assembler::dd(uint32_t data) { | 1973 void Assembler::dd(uint32_t data) { |
| 2581 EnsureSpace ensure_space(this); | 1974 EnsureSpace ensure_space(this); |
| 2582 emit(data); | 1975 emit(data); |
| 2583 } | 1976 } |
| 2584 | 1977 |
| 2585 | 1978 |
| 2586 void Assembler::RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data) { | 1979 void Assembler::RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data) { |
| 2587 ASSERT(!RelocInfo::IsNone(rmode)); | 1980 ASSERT(!RelocInfo::IsNone(rmode)); |
| 2588 // Don't record external references unless the heap will be serialized. | 1981 // Don't record external references unless the heap will be serialized. |
| 2589 if (rmode == RelocInfo::EXTERNAL_REFERENCE && | 1982 if (rmode == RelocInfo::EXTERNAL_REFERENCE && |
| 2590 !serializer_enabled() && !emit_debug_code()) { | 1983 !Serializer::enabled(isolate()) && !emit_debug_code()) { |
| 2591 return; | 1984 return; |
| 2592 } | 1985 } |
| 2593 RelocInfo rinfo(pc_, rmode, data, NULL); | 1986 RelocInfo rinfo(pc_, rmode, data, NULL); |
| 2594 reloc_info_writer.Write(&rinfo); | 1987 reloc_info_writer.Write(&rinfo); |
| 2595 } | 1988 } |
| 2596 | 1989 |
| 2597 | 1990 |
| 2598 Handle<ConstantPoolArray> Assembler::NewConstantPool(Isolate* isolate) { | 1991 Handle<ConstantPoolArray> Assembler::NewConstantPool(Isolate* isolate) { |
| 2599 // No out-of-line constant pool support. | 1992 // No out-of-line constant pool support. |
| 2600 ASSERT(!FLAG_enable_ool_constant_pool); | 1993 ASSERT(!FLAG_enable_ool_constant_pool); |
| 2601 return isolate->factory()->empty_constant_pool_array(); | 1994 return isolate->factory()->empty_constant_pool_array(); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 2629 if (coverage_log != NULL) { | 2022 if (coverage_log != NULL) { |
| 2630 fprintf(coverage_log, "%s\n", file_line); | 2023 fprintf(coverage_log, "%s\n", file_line); |
| 2631 fflush(coverage_log); | 2024 fflush(coverage_log); |
| 2632 } | 2025 } |
| 2633 } | 2026 } |
| 2634 | 2027 |
| 2635 #endif | 2028 #endif |
| 2636 | 2029 |
| 2637 } } // namespace v8::internal | 2030 } } // namespace v8::internal |
| 2638 | 2031 |
| 2639 #endif // V8_TARGET_ARCH_IA32 | 2032 #endif // V8_TARGET_ARCH_X87 |
| OLD | NEW |