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

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

Issue 2546933002: [Turbofan] Add ARM NEON instructions for implementing SIMD. (Closed)
Patch Set: Second review comments. Created 4 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
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 // A Disassembler object is used to disassemble a block of code instruction by 5 // A Disassembler object is used to disassemble a block of code instruction by
6 // instruction. The default implementation of the NameConverter object can be 6 // instruction. The default implementation of the NameConverter object can be
7 // overriden to modify register names or to do symbol lookup on addresses. 7 // overriden to modify register names or to do symbol lookup on addresses.
8 // 8 //
9 // The example below will disassemble a block of code and print it to stdout. 9 // The example below will disassemble a block of code and print it to stdout.
10 // 10 //
(...skipping 1401 matching lines...) Expand 10 before | Expand all | Expand 10 after
1412 // Dd = vmls(Dn, Dm) 1412 // Dd = vmls(Dn, Dm)
1413 // Sd = vmls(Sn, Sm) 1413 // Sd = vmls(Sn, Sm)
1414 // Dd = vdiv(Dn, Dm) 1414 // Dd = vdiv(Dn, Dm)
1415 // Sd = vdiv(Sn, Sm) 1415 // Sd = vdiv(Sn, Sm)
1416 // vcmp(Dd, Dm) 1416 // vcmp(Dd, Dm)
1417 // vcmp(Sd, Sm) 1417 // vcmp(Sd, Sm)
1418 // Dd = vsqrt(Dm) 1418 // Dd = vsqrt(Dm)
1419 // Sd = vsqrt(Sm) 1419 // Sd = vsqrt(Sm)
1420 // vmrs 1420 // vmrs
1421 // vmsr 1421 // vmsr
1422 // Qd = vdup.size(Qd, Rt)
1423 // vmov.size: Dd[i] = Rt
1424 // vmov.sign.size: Rt = Dn[i]
1422 void Decoder::DecodeTypeVFP(Instruction* instr) { 1425 void Decoder::DecodeTypeVFP(Instruction* instr) {
1423 VERIFY((instr->TypeValue() == 7) && (instr->Bit(24) == 0x0) ); 1426 VERIFY((instr->TypeValue() == 7) && (instr->Bit(24) == 0x0) );
1424 VERIFY(instr->Bits(11, 9) == 0x5); 1427 VERIFY(instr->Bits(11, 9) == 0x5);
1425 1428
1426 if (instr->Bit(4) == 0) { 1429 if (instr->Bit(4) == 0) {
1427 if (instr->Opc1Value() == 0x7) { 1430 if (instr->Opc1Value() == 0x7) {
1428 // Other data processing instructions 1431 // Other data processing instructions
1429 if ((instr->Opc2Value() == 0x0) && (instr->Opc3Value() == 0x1)) { 1432 if ((instr->Opc2Value() == 0x0) && (instr->Opc3Value() == 0x1)) {
1430 // vmov register to register. 1433 // vmov register to register.
1431 if (instr->SzValue() == 0x1) { 1434 if (instr->SzValue() == 0x1) {
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
1524 } else { 1527 } else {
1525 Format(instr, "vdiv'cond.f32 'Sd, 'Sn, 'Sm"); 1528 Format(instr, "vdiv'cond.f32 'Sd, 'Sn, 'Sm");
1526 } 1529 }
1527 } else { 1530 } else {
1528 Unknown(instr); // Not used by V8. 1531 Unknown(instr); // Not used by V8.
1529 } 1532 }
1530 } else { 1533 } else {
1531 if ((instr->VCValue() == 0x0) && 1534 if ((instr->VCValue() == 0x0) &&
1532 (instr->VAValue() == 0x0)) { 1535 (instr->VAValue() == 0x0)) {
1533 DecodeVMOVBetweenCoreAndSinglePrecisionRegisters(instr); 1536 DecodeVMOVBetweenCoreAndSinglePrecisionRegisters(instr);
1534 } else if ((instr->VLValue() == 0x0) && 1537 } else if ((instr->VLValue() == 0x0) && (instr->VCValue() == 0x1)) {
1535 (instr->VCValue() == 0x1) && 1538 if (instr->Bit(23) == 0) {
1536 (instr->Bit(23) == 0x0)) { 1539 int opc1_opc2 = (instr->Bits(22, 21) << 2) | instr->Bits(6, 5);
1537 if (instr->Bit(21) == 0x0) { 1540 if ((opc1_opc2 & 0xb) == 0) {
1538 Format(instr, "vmov'cond.32 'Dd[0], 'rt"); 1541 // NeonS32/NeonU32
1542 if (instr->Bit(21) == 0x0) {
1543 Format(instr, "vmov'cond.32 'Dd[0], 'rt");
1544 } else {
1545 Format(instr, "vmov'cond.32 'Dd[1], 'rt");
1546 }
1547 } else {
1548 int vd = instr->VFPNRegValue(kDoublePrecision);
1549 int rt = instr->RtValue();
1550 if ((opc1_opc2 & 0x8) != 0) {
1551 // NeonS8 / NeonU8
1552 int i = opc1_opc2 & 0x7;
1553 out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_,
Rodolph Perfetta (ARM) 2016/12/14 12:06:30 the assembler allows conditional forms of those in
bbudge 2016/12/14 19:14:48 Ugh. It looks like a lot of work to allow Format t
1554 "vmov.8 d%d[%d], r%d", vd, i, rt);
1555 } else if ((opc1_opc2 & 0x1) != 0) {
1556 // NeonS16 / NeonU16
1557 int i = (opc1_opc2 >> 1) & 0x3;
1558 out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_,
1559 "vmov.16 d%d[%d], r%d", vd, i, rt);
1560 } else {
1561 Unknown(instr);
1562 }
1563 }
1539 } else { 1564 } else {
1540 Format(instr, "vmov'cond.32 'Dd[1], 'rt"); 1565 int size = 32;
1566 if (instr->Bit(5) != 0)
1567 size = 16;
1568 else if (instr->Bit(22) != 0)
1569 size = 8;
1570 int Vd = instr->VFPNRegValue(kSimd128Precision);
1571 int Rt = instr->RtValue();
1572 out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_,
Rodolph Perfetta (ARM) 2016/12/14 12:06:30 ditto.
bbudge 2016/12/14 19:14:48 No longer conditional.
1573 "vdup.%i q%d, r%d", size, Vd, Rt);
1541 } 1574 }
1542 } else if ((instr->VLValue() == 0x1) && 1575 } else if ((instr->VLValue() == 0x1) && (instr->VCValue() == 0x1)) {
1543 (instr->VCValue() == 0x1) && 1576 int opc1_opc2 = (instr->Bits(22, 21) << 2) | instr->Bits(6, 5);
1544 (instr->Bit(23) == 0x0)) { 1577 if ((opc1_opc2 & 0xb) == 0) {
1545 if (instr->Bit(21) == 0x0) { 1578 // NeonS32 / NeonU32
1546 Format(instr, "vmov'cond.32 'rt, 'Dd[0]"); 1579 if (instr->Bit(21) == 0x0) {
1580 Format(instr, "vmov'cond.32 'rt, 'Dd[0]");
1581 } else {
1582 Format(instr, "vmov'cond.32 'rt, 'Dd[1]");
1583 }
1547 } else { 1584 } else {
1548 Format(instr, "vmov'cond.32 'rt, 'Dd[1]"); 1585 const char* sign = instr->Bit(23) != 0 ? "u" : "s";
1586 int rt = instr->RtValue();
1587 int vn = instr->VFPNRegValue(kDoublePrecision);
1588 if ((opc1_opc2 & 0x8) != 0) {
1589 // NeonS8 / NeonU8
1590 int i = opc1_opc2 & 0x7;
1591 out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_,
Rodolph Perfetta (ARM) 2016/12/14 12:06:30 handle conditional.
bbudge 2016/12/14 19:14:48 No longer conditional.
1592 "vmov.%s8 r%d, d%d[%d]", sign, rt, vn, i);
1593 } else if ((opc1_opc2 & 0x1) != 0) {
1594 // NeonS16 / NeonU16
1595 int i = (opc1_opc2 >> 1) & 0x3;
1596 out_buffer_pos_ +=
1597 SNPrintF(out_buffer_ + out_buffer_pos_, "vmov.%s16 r%d, d%d[%d]",
Rodolph Perfetta (ARM) 2016/12/14 12:06:30 ditto.
bbudge 2016/12/14 19:14:48 No longer conditional.
1598 sign, rt, vn, i);
1599 } else {
1600 Unknown(instr);
1601 }
1549 } 1602 }
1550 } else if ((instr->VCValue() == 0x0) && 1603 } else if ((instr->VCValue() == 0x0) &&
1551 (instr->VAValue() == 0x7) && 1604 (instr->VAValue() == 0x7) &&
1552 (instr->Bits(19, 16) == 0x1)) { 1605 (instr->Bits(19, 16) == 0x1)) {
1553 if (instr->VLValue() == 0) { 1606 if (instr->VLValue() == 0) {
1554 if (instr->Bits(15, 12) == 0xF) { 1607 if (instr->Bits(15, 12) == 0xF) {
1555 Format(instr, "vmsr'cond FPSCR, APSR"); 1608 Format(instr, "vmsr'cond FPSCR, APSR");
1556 } else { 1609 } else {
1557 Format(instr, "vmsr'cond FPSCR, 'rt"); 1610 Format(instr, "vmsr'cond FPSCR, 'rt");
1558 } 1611 }
1559 } else { 1612 } else {
1560 if (instr->Bits(15, 12) == 0xF) { 1613 if (instr->Bits(15, 12) == 0xF) {
1561 Format(instr, "vmrs'cond APSR, FPSCR"); 1614 Format(instr, "vmrs'cond APSR, FPSCR");
1562 } else { 1615 } else {
1563 Format(instr, "vmrs'cond 'rt, FPSCR"); 1616 Format(instr, "vmrs'cond 'rt, FPSCR");
1564 } 1617 }
1565 } 1618 }
1619 } else {
1620 Unknown(instr); // Not used by V8.
1566 } 1621 }
1567 } 1622 }
1568 } 1623 }
1569 1624
1570 void Decoder::DecodeTypeCP15(Instruction* instr) { 1625 void Decoder::DecodeTypeCP15(Instruction* instr) {
1571 VERIFY((instr->TypeValue() == 7) && (instr->Bit(24) == 0x0)); 1626 VERIFY((instr->TypeValue() == 7) && (instr->Bit(24) == 0x0));
1572 VERIFY(instr->CoprocessorValue() == 15); 1627 VERIFY(instr->CoprocessorValue() == 15);
1573 1628
1574 if (instr->Bit(4) == 1) { 1629 if (instr->Bit(4) == 1) {
1575 int crn = instr->Bits(19, 16); 1630 int crn = instr->Bits(19, 16);
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after
1802 void Decoder::DecodeSpecialCondition(Instruction* instr) { 1857 void Decoder::DecodeSpecialCondition(Instruction* instr) {
1803 switch (instr->SpecialValue()) { 1858 switch (instr->SpecialValue()) {
1804 case 4: 1859 case 4:
1805 if (instr->Bits(21, 20) == 2 && instr->Bits(11, 8) == 1 && 1860 if (instr->Bits(21, 20) == 2 && instr->Bits(11, 8) == 1 &&
1806 instr->Bit(4) == 1) { 1861 instr->Bit(4) == 1) {
1807 // vmov Qd, Qm 1862 // vmov Qd, Qm
1808 int Vd = instr->VFPDRegValue(kSimd128Precision); 1863 int Vd = instr->VFPDRegValue(kSimd128Precision);
1809 int Vm = instr->VFPMRegValue(kSimd128Precision); 1864 int Vm = instr->VFPMRegValue(kSimd128Precision);
1810 out_buffer_pos_ += 1865 out_buffer_pos_ +=
1811 SNPrintF(out_buffer_ + out_buffer_pos_, "vmov q%d, q%d", Vd, Vm); 1866 SNPrintF(out_buffer_ + out_buffer_pos_, "vmov q%d, q%d", Vd, Vm);
1867 } else if (instr->Bits(11, 8) == 8) {
1868 const char* op = (instr->Bit(4) == 0) ? "vadd" : "vtst";
1869 int size = kBitsPerByte * (1 << instr->Bits(21, 20));
1870 int Vd = instr->VFPDRegValue(kSimd128Precision);
1871 int Vm = instr->VFPMRegValue(kSimd128Precision);
1872 int Vn = instr->VFPNRegValue(kSimd128Precision);
1873 // vadd/vtst.i<size> Qd, Qm, Qn.
1874 out_buffer_pos_ +=
1875 SNPrintF(out_buffer_ + out_buffer_pos_, "%s.i%d q%d, q%d, q%d", op,
1876 size, Vd, Vn, Vm);
1877 } else if (instr->Bits(11, 8) == 0xd && instr->Bit(4) == 0) {
1878 const char* op = (instr->Bits(21, 20) == 0) ? "vadd" : "vsub";
1879 int size = kBitsPerByte * (1 << instr->Bits(21, 20));
1880 int Vd = instr->VFPDRegValue(kSimd128Precision);
1881 int Vm = instr->VFPMRegValue(kSimd128Precision);
1882 int Vn = instr->VFPNRegValue(kSimd128Precision);
1883 // vadd/vsub.f32 Qd, Qm, Qn.
1884 out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_,
1885 "%s.f32 q%d, q%d, q%d", op, Vd, Vn, Vm);
1812 } else { 1886 } else {
1813 Unknown(instr); 1887 Unknown(instr);
1814 } 1888 }
1815 break; 1889 break;
1816 case 5: 1890 case 5:
1817 if ((instr->Bits(18, 16) == 0) && (instr->Bits(11, 6) == 0x28) && 1891 if ((instr->Bits(18, 16) == 0) && (instr->Bits(11, 6) == 0x28) &&
1818 (instr->Bit(4) == 1)) { 1892 (instr->Bit(4) == 1)) {
1819 // vmovl signed 1893 // vmovl signed
1820 if ((instr->VdValue() & 1) != 0) Unknown(instr); 1894 if ((instr->VdValue() & 1) != 0) Unknown(instr);
1821 int Vd = (instr->Bit(22) << 3) | (instr->VdValue() >> 1); 1895 int Vd = (instr->Bit(22) << 3) | (instr->VdValue() >> 1);
1822 int Vm = (instr->Bit(5) << 4) | instr->VmValue(); 1896 int Vm = (instr->Bit(5) << 4) | instr->VmValue();
1823 int imm3 = instr->Bits(21, 19); 1897 int imm3 = instr->Bits(21, 19);
1824 out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, 1898 out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_,
1825 "vmovl.s%d q%d, d%d", imm3*8, Vd, Vm); 1899 "vmovl.s%d q%d, d%d", imm3*8, Vd, Vm);
1826 } else { 1900 } else {
1827 Unknown(instr); 1901 Unknown(instr);
1828 } 1902 }
1829 break; 1903 break;
1830 case 6: 1904 case 6:
1831 if (instr->Bits(21, 20) == 0 && instr->Bits(11, 8) == 1 && 1905 if (instr->Bits(11, 8) == 8) {
1832 instr->Bit(4) == 1) { 1906 int size = kBitsPerByte * (1 << instr->Bits(21, 20));
1907 int Vd = instr->VFPDRegValue(kSimd128Precision);
1908 int Vm = instr->VFPMRegValue(kSimd128Precision);
1909 int Vn = instr->VFPNRegValue(kSimd128Precision);
1910 if (instr->Bit(4) == 0) {
1911 out_buffer_pos_ +=
1912 SNPrintF(out_buffer_ + out_buffer_pos_, "vsub.i%d q%d, q%d, q%d",
1913 size, Vd, Vn, Vm);
1914 } else {
1915 out_buffer_pos_ +=
1916 SNPrintF(out_buffer_ + out_buffer_pos_, "vceq.i%d q%d, q%d, q%d",
1917 size, Vd, Vn, Vm);
1918 }
1919 } else if (instr->Bits(21, 20) == 1 && instr->Bits(11, 8) == 1 &&
1920 instr->Bit(4) == 1) {
1921 int Vd = instr->VFPDRegValue(kSimd128Precision);
1922 int Vm = instr->VFPMRegValue(kSimd128Precision);
1923 int Vn = instr->VFPNRegValue(kSimd128Precision);
1924 out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_,
1925 "vbsl q%d, q%d, q%d", Vd, Vn, Vm);
1926 } else if (instr->Bits(21, 20) == 0 && instr->Bits(11, 8) == 1 &&
1927 instr->Bit(4) == 1) {
1833 if (instr->Bit(6) == 0) { 1928 if (instr->Bit(6) == 0) {
1834 // veor Dd, Dn, Dm 1929 // veor Dd, Dn, Dm
1835 int Vd = instr->VFPDRegValue(kDoublePrecision); 1930 int Vd = instr->VFPDRegValue(kDoublePrecision);
1836 int Vn = instr->VFPNRegValue(kDoublePrecision); 1931 int Vn = instr->VFPNRegValue(kDoublePrecision);
1837 int Vm = instr->VFPMRegValue(kDoublePrecision); 1932 int Vm = instr->VFPMRegValue(kDoublePrecision);
1838 out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, 1933 out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_,
1839 "veor d%d, d%d, d%d", Vd, Vn, Vm); 1934 "veor d%d, d%d, d%d", Vd, Vn, Vm);
1840 1935
1841 } else { 1936 } else {
1842 // veor Qd, Qn, Qm 1937 // veor Qd, Qn, Qm
(...skipping 10 matching lines...) Expand all
1853 case 7: 1948 case 7:
1854 if ((instr->Bits(18, 16) == 0) && (instr->Bits(11, 6) == 0x28) && 1949 if ((instr->Bits(18, 16) == 0) && (instr->Bits(11, 6) == 0x28) &&
1855 (instr->Bit(4) == 1)) { 1950 (instr->Bit(4) == 1)) {
1856 // vmovl unsigned 1951 // vmovl unsigned
1857 if ((instr->VdValue() & 1) != 0) Unknown(instr); 1952 if ((instr->VdValue() & 1) != 0) Unknown(instr);
1858 int Vd = (instr->Bit(22) << 3) | (instr->VdValue() >> 1); 1953 int Vd = (instr->Bit(22) << 3) | (instr->VdValue() >> 1);
1859 int Vm = (instr->Bit(5) << 4) | instr->VmValue(); 1954 int Vm = (instr->Bit(5) << 4) | instr->VmValue();
1860 int imm3 = instr->Bits(21, 19); 1955 int imm3 = instr->Bits(21, 19);
1861 out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, 1956 out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_,
1862 "vmovl.u%d q%d, d%d", imm3*8, Vd, Vm); 1957 "vmovl.u%d q%d, d%d", imm3*8, Vd, Vm);
1958 } else if (instr->Opc1Value() == 7 && instr->Bits(19, 16) == 0 &&
1959 instr->Bits(11, 6) == 0x17 && instr->Bit(4) == 0) {
1960 int Vd = instr->VFPDRegValue(kSimd128Precision);
1961 int Vm = instr->VFPMRegValue(kSimd128Precision);
1962 out_buffer_pos_ +=
1963 SNPrintF(out_buffer_ + out_buffer_pos_, "vmvn q%d, q%d", Vd, Vm);
1964 } else if (instr->Opc1Value() == 7 && instr->Bits(19, 16) == 0xB &&
1965 instr->Bits(11, 9) == 0x3 && instr->Bit(6) == 1 &&
1966 instr->Bit(4) == 0) {
1967 int Vd = instr->VFPDRegValue(kSimd128Precision);
1968 int Vm = instr->VFPMRegValue(kSimd128Precision);
1969 const char* suffix = nullptr;
1970 int op = instr->Bits(8, 7);
1971 switch (op) {
1972 case 0:
1973 suffix = "f32.s32";
1974 break;
1975 case 1:
1976 suffix = "f32.u32";
1977 break;
1978 case 2:
1979 suffix = "s32.f32";
1980 break;
1981 case 3:
1982 suffix = "u32.f32";
1983 break;
1984 }
1985 out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_,
1986 "vcvt.%s q%d, q%d", suffix, Vd, Vm);
1863 } else if ((instr->Bits(21, 16) == 0x32) && (instr->Bits(11, 7) == 0) && 1987 } else if ((instr->Bits(21, 16) == 0x32) && (instr->Bits(11, 7) == 0) &&
1864 (instr->Bit(4) == 0)) { 1988 (instr->Bit(4) == 0)) {
1865 if (instr->Bit(6) == 0) { 1989 if (instr->Bit(6) == 0) {
1866 int Vd = instr->VFPDRegValue(kDoublePrecision); 1990 int Vd = instr->VFPDRegValue(kDoublePrecision);
1867 int Vm = instr->VFPMRegValue(kDoublePrecision); 1991 int Vm = instr->VFPMRegValue(kDoublePrecision);
1868 out_buffer_pos_ += 1992 out_buffer_pos_ +=
1869 SNPrintF(out_buffer_ + out_buffer_pos_, "vswp d%d, d%d", Vd, Vm); 1993 SNPrintF(out_buffer_ + out_buffer_pos_, "vswp d%d, d%d", Vd, Vm);
1870 } else { 1994 } else {
1871 int Vd = instr->VFPDRegValue(kSimd128Precision); 1995 int Vd = instr->VFPDRegValue(kSimd128Precision);
1872 int Vm = instr->VFPMRegValue(kSimd128Precision); 1996 int Vm = instr->VFPMRegValue(kSimd128Precision);
1873 out_buffer_pos_ += 1997 out_buffer_pos_ +=
1874 SNPrintF(out_buffer_ + out_buffer_pos_, "vswp q%d, q%d", Vd, Vm); 1998 SNPrintF(out_buffer_ + out_buffer_pos_, "vswp q%d, q%d", Vd, Vm);
1875 } 1999 }
2000 } else if (instr->Opc1Value() == 0x7 && instr->Bits(11, 7) == 0x18 &&
2001 instr->Bit(4) == 0x0) {
2002 int Vd = instr->VFPDRegValue(kSimd128Precision);
2003 int Vm = instr->VFPMRegValue(kDoublePrecision);
2004 int index = instr->Bit(19);
2005 out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_,
2006 "vdup q%d, d%d[%d]", Vd, Vm, index);
2007 } else if (instr->Opc1Value() == 0x7 && instr->Bits(11, 10) == 0x2 &&
2008 instr->Bit(4) == 0x0) {
2009 int Vd = instr->VFPDRegValue(kDoublePrecision);
2010 int Vn = instr->VFPNRegValue(kDoublePrecision);
2011 int Vm = instr->VFPMRegValue(kDoublePrecision);
2012 int len = instr->Bits(9, 8);
2013 NeonListOperand list(DwVfpRegister::from_code(Vn), len + 1);
2014 out_buffer_pos_ +=
2015 SNPrintF(out_buffer_ + out_buffer_pos_, "%s d%d, ",
2016 instr->Bit(6) == 0 ? "vtbl.8" : "vtbx.8", Vd);
2017 FormatNeonList(Vn, list.type());
2018 Print(", ");
2019 PrintDRegister(Vm);
1876 } else { 2020 } else {
1877 Unknown(instr); 2021 Unknown(instr);
1878 } 2022 }
1879 break; 2023 break;
1880 case 8: 2024 case 8:
1881 if (instr->Bits(21, 20) == 0) { 2025 if (instr->Bits(21, 20) == 0) {
1882 // vst1 2026 // vst1
1883 int Vd = (instr->Bit(22) << 4) | instr->VdValue(); 2027 int Vd = (instr->Bit(22) << 4) | instr->VdValue();
1884 int Rn = instr->VnValue(); 2028 int Rn = instr->VnValue();
1885 int type = instr->Bits(11, 8); 2029 int type = instr->Bits(11, 8);
(...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after
2211 pc += d.InstructionDecode(buffer, pc); 2355 pc += d.InstructionDecode(buffer, pc);
2212 v8::internal::PrintF(f, "%p %08x %s\n", static_cast<void*>(prev_pc), 2356 v8::internal::PrintF(f, "%p %08x %s\n", static_cast<void*>(prev_pc),
2213 *reinterpret_cast<int32_t*>(prev_pc), buffer.start()); 2357 *reinterpret_cast<int32_t*>(prev_pc), buffer.start());
2214 } 2358 }
2215 } 2359 }
2216 2360
2217 2361
2218 } // namespace disasm 2362 } // namespace disasm
2219 2363
2220 #endif // V8_TARGET_ARCH_ARM 2364 #endif // V8_TARGET_ARCH_ARM
OLDNEW
« no previous file with comments | « src/arm/constants-arm.h ('k') | src/arm/macro-assembler-arm.h » ('j') | src/arm/simulator-arm.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698