Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: src/ia32/disasm-ia32.cc

Issue 2744643004: [ia32] Add some SSE2, SSE4 instructions and AVX version for SIMD (Closed)
Patch Set: Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 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 <assert.h> 5 #include <assert.h>
6 #include <stdarg.h> 6 #include <stdarg.h>
7 #include <stdio.h> 7 #include <stdio.h>
8 8
9 #if V8_TARGET_ARCH_IA32 9 #if V8_TARGET_ARCH_IA32
10 10
(...skipping 784 matching lines...) Expand 10 before | Expand all | Expand 10 after
795 case 0xbf: 795 case 0xbf:
796 AppendToBuffer("vfnmsub231s%c %s,%s,", float_size_code(), 796 AppendToBuffer("vfnmsub231s%c %s,%s,", float_size_code(),
797 NameOfXMMRegister(regop), NameOfXMMRegister(vvvv)); 797 NameOfXMMRegister(regop), NameOfXMMRegister(vvvv));
798 current += PrintRightXMMOperand(current); 798 current += PrintRightXMMOperand(current);
799 break; 799 break;
800 case 0xf7: 800 case 0xf7:
801 AppendToBuffer("shlx %s,", NameOfCPURegister(regop)); 801 AppendToBuffer("shlx %s,", NameOfCPURegister(regop));
802 current += PrintRightOperand(current); 802 current += PrintRightOperand(current);
803 AppendToBuffer(",%s", NameOfCPURegister(vvvv)); 803 AppendToBuffer(",%s", NameOfCPURegister(vvvv));
804 break; 804 break;
805 #define DECLARE_SSE_AVX_DIS_CASE(instruction, notUsed1, notUsed2, notUsed3, \
806 opcode) \
807 case 0x##opcode: { \
808 AppendToBuffer("v" #instruction " %s,%s,", NameOfXMMRegister(regop), \
809 NameOfXMMRegister(vvvv)); \
810 current += PrintRightXMMOperand(current); \
811 break; \
812 }
813
814 SSE4_INSTRUCTION_LIST(DECLARE_SSE_AVX_DIS_CASE)
815 #undef DECLARE_SSE_AVX_DIS_CASE
805 default: 816 default:
806 UnimplementedInstruction(); 817 UnimplementedInstruction();
807 } 818 }
808 } else if (vex_f2() && vex_0f()) { 819 } else if (vex_f2() && vex_0f()) {
809 int mod, regop, rm, vvvv = vex_vreg(); 820 int mod, regop, rm, vvvv = vex_vreg();
810 get_modrm(*current, &mod, &regop, &rm); 821 get_modrm(*current, &mod, &regop, &rm);
811 switch (opcode) { 822 switch (opcode) {
812 case 0x58: 823 case 0x58:
813 AppendToBuffer("vaddsd %s,%s,", NameOfXMMRegister(regop), 824 AppendToBuffer("vaddsd %s,%s,", NameOfXMMRegister(regop),
814 NameOfXMMRegister(vvvv)); 825 NameOfXMMRegister(vvvv));
(...skipping 874 matching lines...) Expand 10 before | Expand all | Expand 10 after
1689 data++; 1700 data++;
1690 AppendToBuffer("%s ", "test_w"); 1701 AppendToBuffer("%s ", "test_w");
1691 data += PrintRightOperand(data); 1702 data += PrintRightOperand(data);
1692 int imm = *reinterpret_cast<int16_t*>(data); 1703 int imm = *reinterpret_cast<int16_t*>(data);
1693 AppendToBuffer(",0x%x", imm); 1704 AppendToBuffer(",0x%x", imm);
1694 data += 2; 1705 data += 2;
1695 } else if (*data == 0x0F) { 1706 } else if (*data == 0x0F) {
1696 data++; 1707 data++;
1697 if (*data == 0x38) { 1708 if (*data == 0x38) {
1698 data++; 1709 data++;
1699 if (*data == 0x17) { 1710 byte op = *data;
1700 data++; 1711 data++;
1701 int mod, regop, rm; 1712 int mod, regop, rm;
1702 get_modrm(*data, &mod, &regop, &rm); 1713 get_modrm(*data, &mod, &regop, &rm);
1703 AppendToBuffer("ptest %s,%s", 1714 switch (op) {
1704 NameOfXMMRegister(regop), 1715 case 0x17:
1705 NameOfXMMRegister(rm)); 1716 AppendToBuffer("ptest %s,%s", NameOfXMMRegister(regop),
1706 data++; 1717 NameOfXMMRegister(rm));
1707 } else if (*data == 0x2A) { 1718 data++;
1708 // movntdqa 1719 break;
1709 UnimplementedInstruction(); 1720 #define SSE4_DIS_CASE(instruction, notUsed1, notUsed2, notUsed3, opcode) \
1710 } else { 1721 case 0x##opcode: { \
1711 UnimplementedInstruction(); 1722 AppendToBuffer(#instruction " %s,", NameOfXMMRegister(regop)); \
1723 data += PrintRightXMMOperand(data); \
1724 break; \
1725 }
1726
1727 SSE4_INSTRUCTION_LIST(SSE4_DIS_CASE)
1728 #undef SSE4_DIS_CASE
1729 default:
1730 UnimplementedInstruction();
1712 } 1731 }
1713 } else if (*data == 0x3A) { 1732 } else if (*data == 0x3A) {
1714 data++; 1733 data++;
1715 if (*data == 0x0A) { 1734 if (*data == 0x0A) {
1716 data++; 1735 data++;
1717 int mod, regop, rm; 1736 int mod, regop, rm;
1718 get_modrm(*data, &mod, &regop, &rm); 1737 get_modrm(*data, &mod, &regop, &rm);
1719 int8_t imm8 = static_cast<int8_t>(data[1]); 1738 int8_t imm8 = static_cast<int8_t>(data[1]);
1720 AppendToBuffer("roundss %s,%s,%d", NameOfXMMRegister(regop), 1739 AppendToBuffer("roundss %s,%s,%d", NameOfXMMRegister(regop),
1721 NameOfXMMRegister(rm), static_cast<int>(imm8)); 1740 NameOfXMMRegister(rm), static_cast<int>(imm8));
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
1838 AppendToBuffer("punpckldq %s,%s", NameOfXMMRegister(regop), 1857 AppendToBuffer("punpckldq %s,%s", NameOfXMMRegister(regop),
1839 NameOfXMMRegister(rm)); 1858 NameOfXMMRegister(rm));
1840 data++; 1859 data++;
1841 } else if (*data == 0x6A) { 1860 } else if (*data == 0x6A) {
1842 data++; 1861 data++;
1843 int mod, regop, rm; 1862 int mod, regop, rm;
1844 get_modrm(*data, &mod, &regop, &rm); 1863 get_modrm(*data, &mod, &regop, &rm);
1845 AppendToBuffer("punpckhdq %s,%s", NameOfXMMRegister(regop), 1864 AppendToBuffer("punpckhdq %s,%s", NameOfXMMRegister(regop),
1846 NameOfXMMRegister(rm)); 1865 NameOfXMMRegister(rm));
1847 data++; 1866 data++;
1848 } else if (*data == 0x76) {
1849 data++;
1850 int mod, regop, rm;
1851 get_modrm(*data, &mod, &regop, &rm);
1852 AppendToBuffer("pcmpeqd %s,%s",
1853 NameOfXMMRegister(regop),
1854 NameOfXMMRegister(rm));
1855 data++;
1856 } else if (*data == 0x90) { 1867 } else if (*data == 0x90) {
1857 data++; 1868 data++;
1858 AppendToBuffer("nop"); // 2 byte nop. 1869 AppendToBuffer("nop"); // 2 byte nop.
1859 } else if (*data == 0xF3) { 1870 } else if (*data == 0xF3) {
1860 data++; 1871 data++;
1861 int mod, regop, rm; 1872 int mod, regop, rm;
1862 get_modrm(*data, &mod, &regop, &rm); 1873 get_modrm(*data, &mod, &regop, &rm);
1863 AppendToBuffer("psllq %s,%s", 1874 AppendToBuffer("psllq %s,%s",
1864 NameOfXMMRegister(regop), 1875 NameOfXMMRegister(regop),
1865 NameOfXMMRegister(rm)); 1876 NameOfXMMRegister(rm));
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1907 data += PrintRightOperand(data); 1918 data += PrintRightOperand(data);
1908 AppendToBuffer(",%s", NameOfXMMRegister(regop)); 1919 AppendToBuffer(",%s", NameOfXMMRegister(regop));
1909 } else if (*data == 0xC4) { 1920 } else if (*data == 0xC4) {
1910 data++; 1921 data++;
1911 int mod, regop, rm; 1922 int mod, regop, rm;
1912 get_modrm(*data, &mod, &regop, &rm); 1923 get_modrm(*data, &mod, &regop, &rm);
1913 AppendToBuffer("pinsrw %s,", NameOfXMMRegister(regop)); 1924 AppendToBuffer("pinsrw %s,", NameOfXMMRegister(regop));
1914 data += PrintRightOperand(data); 1925 data += PrintRightOperand(data);
1915 AppendToBuffer(",%d", *reinterpret_cast<int8_t*>(data)); 1926 AppendToBuffer(",%d", *reinterpret_cast<int8_t*>(data));
1916 data++; 1927 data++;
1917 } else if (*data == 0xDB) {
1918 data++;
1919 int mod, regop, rm;
1920 get_modrm(*data, &mod, &regop, &rm);
1921 AppendToBuffer("pand %s,%s",
1922 NameOfXMMRegister(regop),
1923 NameOfXMMRegister(rm));
1924 data++;
1925 } else if (*data == 0xE7) { 1928 } else if (*data == 0xE7) {
1926 data++; 1929 data++;
1927 int mod, regop, rm; 1930 int mod, regop, rm;
1928 get_modrm(*data, &mod, &regop, &rm); 1931 get_modrm(*data, &mod, &regop, &rm);
1929 if (mod == 3) { 1932 if (mod == 3) {
1930 // movntdq 1933 // movntdq
1931 UnimplementedInstruction(); 1934 UnimplementedInstruction();
1932 } else { 1935 } else {
1933 UnimplementedInstruction(); 1936 UnimplementedInstruction();
1934 } 1937 }
1935 } else if (*data == 0xEF) {
1936 data++;
1937 int mod, regop, rm;
1938 get_modrm(*data, &mod, &regop, &rm);
1939 AppendToBuffer("pxor %s,%s",
1940 NameOfXMMRegister(regop),
1941 NameOfXMMRegister(rm));
1942 data++;
1943 } else if (*data == 0xEB) {
1944 data++;
1945 int mod, regop, rm;
1946 get_modrm(*data, &mod, &regop, &rm);
1947 AppendToBuffer("por %s,%s",
1948 NameOfXMMRegister(regop),
1949 NameOfXMMRegister(rm));
1950 data++;
1951 } else if (*data == 0xFA) {
1952 data++;
1953 int mod, regop, rm;
1954 get_modrm(*data, &mod, &regop, &rm);
1955 AppendToBuffer("psubd %s,", NameOfXMMRegister(regop));
1956 data += PrintRightXMMOperand(data);
1957 } else if (*data == 0xFE) {
1958 data++;
1959 int mod, regop, rm;
1960 get_modrm(*data, &mod, &regop, &rm);
1961 AppendToBuffer("paddd %s,", NameOfXMMRegister(regop));
1962 data += PrintRightXMMOperand(data);
1963 } else if (*data == 0xB1) { 1938 } else if (*data == 0xB1) {
1964 data++; 1939 data++;
1965 data += PrintOperands("cmpxchg_w", OPER_REG_OP_ORDER, data); 1940 data += PrintOperands("cmpxchg_w", OPER_REG_OP_ORDER, data);
1966 } else { 1941 } else {
1967 UnimplementedInstruction(); 1942 byte op = *data;
1943 data++;
1944 int mod, regop, rm;
1945 get_modrm(*data, &mod, &regop, &rm);
1946 switch (op) {
1947 #define SSE2_DIS_CASE(instruction, notUsed1, notUsed2, opcode) \
1948 case 0x##opcode: { \
1949 AppendToBuffer(#instruction " %s,", NameOfXMMRegister(regop)); \
1950 data += PrintRightXMMOperand(data); \
1951 break; \
1952 }
1953
1954 SSE2_INSTRUCTION_LIST(SSE2_DIS_CASE)
1955 #undef SSE2_DIS_CASE
1956 default:
1957 UnimplementedInstruction();
1958 }
1968 } 1959 }
1969 } else { 1960 } else {
1970 UnimplementedInstruction(); 1961 UnimplementedInstruction();
1971 } 1962 }
1972 break; 1963 break;
1973 1964
1974 case 0xFE: 1965 case 0xFE:
1975 { data++; 1966 { data++;
1976 int mod, regop, rm; 1967 int mod, regop, rm;
1977 get_modrm(*data, &mod, &regop, &rm); 1968 get_modrm(*data, &mod, &regop, &rm);
(...skipping 388 matching lines...) Expand 10 before | Expand all | Expand 10 after
2366 fprintf(f, " "); 2357 fprintf(f, " ");
2367 } 2358 }
2368 fprintf(f, " %s\n", buffer.start()); 2359 fprintf(f, " %s\n", buffer.start());
2369 } 2360 }
2370 } 2361 }
2371 2362
2372 2363
2373 } // namespace disasm 2364 } // namespace disasm
2374 2365
2375 #endif // V8_TARGET_ARCH_IA32 2366 #endif // V8_TARGET_ARCH_IA32
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698