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

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

Issue 773783002: [ia32] Introduce FMA3 instructions on scalar data elements. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 6 years 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
« no previous file with comments | « src/ia32/assembler-ia32.cc ('k') | test/cctest/test-assembler-ia32.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 #include "src/v8.h" 9 #include "src/v8.h"
10 10
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after
312 } 312 }
313 313
314 bool vex_f2() { 314 bool vex_f2() {
315 DCHECK(vex_byte0_ == 0xc4 || vex_byte0_ == 0xc5); 315 DCHECK(vex_byte0_ == 0xc4 || vex_byte0_ == 0xc5);
316 byte checked = vex_byte0_ == 0xc4 ? vex_byte2_ : vex_byte1_; 316 byte checked = vex_byte0_ == 0xc4 ? vex_byte2_ : vex_byte1_;
317 return (checked & 3) == 3; 317 return (checked & 3) == 3;
318 } 318 }
319 319
320 bool vex_w() { 320 bool vex_w() {
321 if (vex_byte0_ == 0xc5) return false; 321 if (vex_byte0_ == 0xc5) return false;
322 return (vex_byte2_ & 0x80) == 1; 322 return (vex_byte2_ & 0x80) != 0;
323 } 323 }
324 324
325 bool vex_0f() { 325 bool vex_0f() {
326 if (vex_byte0_ == 0xc5) return true; 326 if (vex_byte0_ == 0xc5) return true;
327 return (vex_byte1_ & 3) == 1; 327 return (vex_byte1_ & 3) == 1;
328 } 328 }
329 329
330 bool vex_0f38() { 330 bool vex_0f38() {
331 if (vex_byte0_ == 0xc5) return false; 331 if (vex_byte0_ == 0xc5) return false;
332 return (vex_byte1_ & 3) == 2; 332 return (vex_byte1_ & 3) == 2;
(...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after
733 byte cond = *(data + 1) & 0x0F; 733 byte cond = *(data + 1) & 0x0F;
734 const char* mnem = conditional_move_mnem[cond]; 734 const char* mnem = conditional_move_mnem[cond];
735 int op_size = PrintOperands(mnem, REG_OPER_OP_ORDER, data + 2); 735 int op_size = PrintOperands(mnem, REG_OPER_OP_ORDER, data + 2);
736 return 2 + op_size; // includes 0x0F 736 return 2 + op_size; // includes 0x0F
737 } 737 }
738 738
739 739
740 int DisassemblerIA32::AVXInstruction(byte* data) { 740 int DisassemblerIA32::AVXInstruction(byte* data) {
741 byte opcode = *data; 741 byte opcode = *data;
742 byte* current = data + 1; 742 byte* current = data + 1;
743 if (vex_f2() && vex_0f()) { 743 if (vex_66() && vex_0f38()) {
744 int mod, regop, rm, vvvv = vex_vreg(); 744 int mod, regop, rm, vvvv = vex_vreg();
745 get_modrm(*current, &mod, &regop, &rm); 745 get_modrm(*current, &mod, &regop, &rm);
746 switch (opcode) { 746 switch (opcode) {
747 case 0x99:
748 AppendToBuffer("vfmadd132s%c %s,%s,", float_size_code(),
749 NameOfXMMRegister(regop), NameOfXMMRegister(vvvv));
750 current += PrintRightXMMOperand(current);
751 break;
752 case 0xa9:
753 AppendToBuffer("vfmadd213s%c %s,%s,", float_size_code(),
754 NameOfXMMRegister(regop), NameOfXMMRegister(vvvv));
755 current += PrintRightXMMOperand(current);
756 break;
757 case 0xb9:
758 AppendToBuffer("vfmadd231s%c %s,%s,", float_size_code(),
759 NameOfXMMRegister(regop), NameOfXMMRegister(vvvv));
760 current += PrintRightXMMOperand(current);
761 break;
762 case 0x9b:
763 AppendToBuffer("vfmsub132s%c %s,%s,", float_size_code(),
764 NameOfXMMRegister(regop), NameOfXMMRegister(vvvv));
765 current += PrintRightXMMOperand(current);
766 break;
767 case 0xab:
768 AppendToBuffer("vfmsub213s%c %s,%s,", float_size_code(),
769 NameOfXMMRegister(regop), NameOfXMMRegister(vvvv));
770 current += PrintRightXMMOperand(current);
771 break;
772 case 0xbb:
773 AppendToBuffer("vfmsub231s%c %s,%s,", float_size_code(),
774 NameOfXMMRegister(regop), NameOfXMMRegister(vvvv));
775 current += PrintRightXMMOperand(current);
776 break;
777 case 0x9d:
778 AppendToBuffer("vfnmadd132s%c %s,%s,", float_size_code(),
779 NameOfXMMRegister(regop), NameOfXMMRegister(vvvv));
780 current += PrintRightXMMOperand(current);
781 break;
782 case 0xad:
783 AppendToBuffer("vfnmadd213s%c %s,%s,", float_size_code(),
784 NameOfXMMRegister(regop), NameOfXMMRegister(vvvv));
785 current += PrintRightXMMOperand(current);
786 break;
787 case 0xbd:
788 AppendToBuffer("vfnmadd231s%c %s,%s,", float_size_code(),
789 NameOfXMMRegister(regop), NameOfXMMRegister(vvvv));
790 current += PrintRightXMMOperand(current);
791 break;
792 case 0x9f:
793 AppendToBuffer("vfnmsub132s%c %s,%s,", float_size_code(),
794 NameOfXMMRegister(regop), NameOfXMMRegister(vvvv));
795 current += PrintRightXMMOperand(current);
796 break;
797 case 0xaf:
798 AppendToBuffer("vfnmsub213s%c %s,%s,", float_size_code(),
799 NameOfXMMRegister(regop), NameOfXMMRegister(vvvv));
800 current += PrintRightXMMOperand(current);
801 break;
802 case 0xbf:
803 AppendToBuffer("vfnmsub231s%c %s,%s,", float_size_code(),
804 NameOfXMMRegister(regop), NameOfXMMRegister(vvvv));
805 current += PrintRightXMMOperand(current);
806 break;
807 default:
808 UnimplementedInstruction();
809 }
810 } else if (vex_f2() && vex_0f()) {
811 int mod, regop, rm, vvvv = vex_vreg();
812 get_modrm(*current, &mod, &regop, &rm);
813 switch (opcode) {
747 case 0x58: 814 case 0x58:
748 AppendToBuffer("vaddsd %s,%s,", NameOfXMMRegister(regop), 815 AppendToBuffer("vaddsd %s,%s,", NameOfXMMRegister(regop),
749 NameOfXMMRegister(vvvv)); 816 NameOfXMMRegister(vvvv));
750 current += PrintRightXMMOperand(current); 817 current += PrintRightXMMOperand(current);
751 break; 818 break;
752 case 0x59: 819 case 0x59:
753 AppendToBuffer("vmulsd %s,%s,", NameOfXMMRegister(regop), 820 AppendToBuffer("vmulsd %s,%s,", NameOfXMMRegister(regop),
754 NameOfXMMRegister(vvvv)); 821 NameOfXMMRegister(vvvv));
755 current += PrintRightXMMOperand(current); 822 current += PrintRightXMMOperand(current);
756 break; 823 break;
(...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after
1152 AppendToBuffer("%s", f0mnem); 1219 AppendToBuffer("%s", f0mnem);
1153 data += 2; 1220 data += 2;
1154 } else if (f0byte == 0x28) { 1221 } else if (f0byte == 0x28) {
1155 data += 2; 1222 data += 2;
1156 int mod, regop, rm; 1223 int mod, regop, rm;
1157 get_modrm(*data, &mod, &regop, &rm); 1224 get_modrm(*data, &mod, &regop, &rm);
1158 AppendToBuffer("movaps %s,%s", 1225 AppendToBuffer("movaps %s,%s",
1159 NameOfXMMRegister(regop), 1226 NameOfXMMRegister(regop),
1160 NameOfXMMRegister(rm)); 1227 NameOfXMMRegister(rm));
1161 data++; 1228 data++;
1229 } else if (f0byte == 0x2e) {
1230 data += 2;
1231 int mod, regop, rm;
1232 get_modrm(*data, &mod, &regop, &rm);
1233 AppendToBuffer("ucomiss %s,", NameOfXMMRegister(regop));
1234 data += PrintRightXMMOperand(data);
1162 } else if (f0byte >= 0x53 && f0byte <= 0x5F) { 1235 } else if (f0byte >= 0x53 && f0byte <= 0x5F) {
1163 const char* const pseudo_op[] = { 1236 const char* const pseudo_op[] = {
1164 "rcpps", 1237 "rcpps",
1165 "andps", 1238 "andps",
1166 "andnps", 1239 "andnps",
1167 "orps", 1240 "orps",
1168 "xorps", 1241 "xorps",
1169 "addps", 1242 "addps",
1170 "mulps", 1243 "mulps",
1171 "cvtps2pd", 1244 "cvtps2pd",
(...skipping 550 matching lines...) Expand 10 before | Expand all | Expand 10 after
1722 int mod, regop, rm; 1795 int mod, regop, rm;
1723 get_modrm(*data, &mod, &regop, &rm); 1796 get_modrm(*data, &mod, &regop, &rm);
1724 AppendToBuffer("movss %s,", NameOfXMMRegister(regop)); 1797 AppendToBuffer("movss %s,", NameOfXMMRegister(regop));
1725 data += PrintRightXMMOperand(data); 1798 data += PrintRightXMMOperand(data);
1726 } else if (b2 == 0x2C) { 1799 } else if (b2 == 0x2C) {
1727 data += 3; 1800 data += 3;
1728 int mod, regop, rm; 1801 int mod, regop, rm;
1729 get_modrm(*data, &mod, &regop, &rm); 1802 get_modrm(*data, &mod, &regop, &rm);
1730 AppendToBuffer("cvttss2si %s,", NameOfCPURegister(regop)); 1803 AppendToBuffer("cvttss2si %s,", NameOfCPURegister(regop));
1731 data += PrintRightXMMOperand(data); 1804 data += PrintRightXMMOperand(data);
1805 } else if (b2 == 0x58) {
1806 data += 3;
1807 int mod, regop, rm;
1808 get_modrm(*data, &mod, &regop, &rm);
1809 AppendToBuffer("addss %s,", NameOfXMMRegister(regop));
1810 data += PrintRightXMMOperand(data);
1811 } else if (b2 == 0x59) {
1812 data += 3;
1813 int mod, regop, rm;
1814 get_modrm(*data, &mod, &regop, &rm);
1815 AppendToBuffer("mulss %s,", NameOfXMMRegister(regop));
1816 data += PrintRightXMMOperand(data);
1732 } else if (b2 == 0x5A) { 1817 } else if (b2 == 0x5A) {
1733 data += 3; 1818 data += 3;
1734 int mod, regop, rm; 1819 int mod, regop, rm;
1735 get_modrm(*data, &mod, &regop, &rm); 1820 get_modrm(*data, &mod, &regop, &rm);
1736 AppendToBuffer("cvtss2sd %s,", NameOfXMMRegister(regop)); 1821 AppendToBuffer("cvtss2sd %s,", NameOfXMMRegister(regop));
1737 data += PrintRightXMMOperand(data); 1822 data += PrintRightXMMOperand(data);
1823 } else if (b2 == 0x5c) {
1824 data += 3;
1825 int mod, regop, rm;
1826 get_modrm(*data, &mod, &regop, &rm);
1827 AppendToBuffer("subss %s,", NameOfXMMRegister(regop));
1828 data += PrintRightXMMOperand(data);
1829 } else if (b2 == 0x5e) {
1830 data += 3;
1831 int mod, regop, rm;
1832 get_modrm(*data, &mod, &regop, &rm);
1833 AppendToBuffer("divss %s,", NameOfXMMRegister(regop));
1834 data += PrintRightXMMOperand(data);
1738 } else if (b2 == 0x6F) { 1835 } else if (b2 == 0x6F) {
1739 data += 3; 1836 data += 3;
1740 int mod, regop, rm; 1837 int mod, regop, rm;
1741 get_modrm(*data, &mod, &regop, &rm); 1838 get_modrm(*data, &mod, &regop, &rm);
1742 AppendToBuffer("movdqu %s,", NameOfXMMRegister(regop)); 1839 AppendToBuffer("movdqu %s,", NameOfXMMRegister(regop));
1743 data += PrintRightXMMOperand(data); 1840 data += PrintRightXMMOperand(data);
1744 } else if (b2 == 0x7F) { 1841 } else if (b2 == 0x7F) {
1745 AppendToBuffer("movdqu "); 1842 AppendToBuffer("movdqu ");
1746 data += 3; 1843 data += 3;
1747 int mod, regop, rm; 1844 int mod, regop, rm;
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
1891 fprintf(f, " "); 1988 fprintf(f, " ");
1892 } 1989 }
1893 fprintf(f, " %s\n", buffer.start()); 1990 fprintf(f, " %s\n", buffer.start());
1894 } 1991 }
1895 } 1992 }
1896 1993
1897 1994
1898 } // namespace disasm 1995 } // namespace disasm
1899 1996
1900 #endif // V8_TARGET_ARCH_IA32 1997 #endif // V8_TARGET_ARCH_IA32
OLDNEW
« no previous file with comments | « src/ia32/assembler-ia32.cc ('k') | test/cctest/test-assembler-ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698