OLD | NEW |
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 Loading... |
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 Loading... |
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_, |
| 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_, |
| 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_, |
| 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]", |
| 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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |