@@ -1798,71 +1798,119 @@ void Assembler::pkhtb(Register dst,
17981798}
17991799
18001800
1801- void Assembler::uxtb (Register dst,
1802- const Operand& src,
1803- Condition cond) {
1801+ void Assembler::sxtb (Register dst, Register src, int rotate, Condition cond) {
1802+ // Instruction details available in ARM DDI 0406C.b, A8.8.233.
1803+ // cond(31-28) | 01101010(27-20) | 1111(19-16) |
1804+ // Rd(15-12) | rotate(11-10) | 00(9-8)| 0111(7-4) | Rm(3-0)
1805+ DCHECK (!dst.is (pc));
1806+ DCHECK (!src.is (pc));
1807+ DCHECK (rotate == 0 || rotate == 8 || rotate == 16 || rotate == 24 );
1808+ emit (cond | 0x6A * B20 | 0xF * B16 | dst.code () * B12 |
1809+ ((rotate >> 1 ) & 0xC ) * B8 | 7 * B4 | src.code ());
1810+ }
1811+
1812+
1813+ void Assembler::sxtab (Register dst, Register src1, Register src2, int rotate,
1814+ Condition cond) {
1815+ // Instruction details available in ARM DDI 0406C.b, A8.8.233.
1816+ // cond(31-28) | 01101010(27-20) | Rn(19-16) |
1817+ // Rd(15-12) | rotate(11-10) | 00(9-8)| 0111(7-4) | Rm(3-0)
1818+ DCHECK (!dst.is (pc));
1819+ DCHECK (!src1.is (pc));
1820+ DCHECK (!src2.is (pc));
1821+ DCHECK (rotate == 0 || rotate == 8 || rotate == 16 || rotate == 24 );
1822+ emit (cond | 0x6A * B20 | src1.code () * B16 | dst.code () * B12 |
1823+ ((rotate >> 1 ) & 0xC ) * B8 | 7 * B4 | src2.code ());
1824+ }
1825+
1826+
1827+ void Assembler::sxth (Register dst, Register src, int rotate, Condition cond) {
1828+ // Instruction details available in ARM DDI 0406C.b, A8.8.235.
1829+ // cond(31-28) | 01101011(27-20) | 1111(19-16) |
1830+ // Rd(15-12) | rotate(11-10) | 00(9-8)| 0111(7-4) | Rm(3-0)
1831+ DCHECK (!dst.is (pc));
1832+ DCHECK (!src.is (pc));
1833+ DCHECK (rotate == 0 || rotate == 8 || rotate == 16 || rotate == 24 );
1834+ emit (cond | 0x6B * B20 | 0xF * B16 | dst.code () * B12 |
1835+ ((rotate >> 1 ) & 0xC ) * B8 | 7 * B4 | src.code ());
1836+ }
1837+
1838+
1839+ void Assembler::sxtah (Register dst, Register src1, Register src2, int rotate,
1840+ Condition cond) {
1841+ // Instruction details available in ARM DDI 0406C.b, A8.8.235.
1842+ // cond(31-28) | 01101011(27-20) | Rn(19-16) |
1843+ // Rd(15-12) | rotate(11-10) | 00(9-8)| 0111(7-4) | Rm(3-0)
1844+ DCHECK (!dst.is (pc));
1845+ DCHECK (!src1.is (pc));
1846+ DCHECK (!src2.is (pc));
1847+ DCHECK (rotate == 0 || rotate == 8 || rotate == 16 || rotate == 24 );
1848+ emit (cond | 0x6B * B20 | src1.code () * B16 | dst.code () * B12 |
1849+ ((rotate >> 1 ) & 0xC ) * B8 | 7 * B4 | src2.code ());
1850+ }
1851+
1852+
1853+ void Assembler::uxtb (Register dst, Register src, int rotate, Condition cond) {
18041854 // Instruction details available in ARM DDI 0406C.b, A8.8.274.
18051855 // cond(31-28) | 01101110(27-20) | 1111(19-16) |
18061856 // Rd(15-12) | rotate(11-10) | 00(9-8)| 0111(7-4) | Rm(3-0)
18071857 DCHECK (!dst.is (pc));
1808- DCHECK (!src.rm ().is (pc));
1809- DCHECK (!src.rm ().is (no_reg));
1810- DCHECK (src.rs ().is (no_reg));
1811- DCHECK ((src.shift_imm_ == 0 ) ||
1812- (src.shift_imm_ == 8 ) ||
1813- (src.shift_imm_ == 16 ) ||
1814- (src.shift_imm_ == 24 ));
1815- // Operand maps ROR #0 to LSL #0.
1816- DCHECK ((src.shift_op () == ROR) ||
1817- ((src.shift_op () == LSL) && (src.shift_imm_ == 0 )));
1818- emit (cond | 0x6E *B20 | 0xF *B16 | dst.code ()*B12 |
1819- ((src.shift_imm_ >> 1 )&0xC )*B8 | 7 *B4 | src.rm ().code ());
1820- }
1821-
1822-
1823- void Assembler::uxtab (Register dst,
1824- Register src1,
1825- const Operand& src2,
1858+ DCHECK (!src.is (pc));
1859+ DCHECK (rotate == 0 || rotate == 8 || rotate == 16 || rotate == 24 );
1860+ emit (cond | 0x6E * B20 | 0xF * B16 | dst.code () * B12 |
1861+ ((rotate >> 1 ) & 0xC ) * B8 | 7 * B4 | src.code ());
1862+ }
1863+
1864+
1865+ void Assembler::uxtab (Register dst, Register src1, Register src2, int rotate,
18261866 Condition cond) {
18271867 // Instruction details available in ARM DDI 0406C.b, A8.8.271.
18281868 // cond(31-28) | 01101110(27-20) | Rn(19-16) |
18291869 // Rd(15-12) | rotate(11-10) | 00(9-8)| 0111(7-4) | Rm(3-0)
18301870 DCHECK (!dst.is (pc));
18311871 DCHECK (!src1.is (pc));
1832- DCHECK (!src2.rm ().is (pc));
1833- DCHECK (!src2.rm ().is (no_reg));
1834- DCHECK (src2.rs ().is (no_reg));
1835- DCHECK ((src2.shift_imm_ == 0 ) ||
1836- (src2.shift_imm_ == 8 ) ||
1837- (src2.shift_imm_ == 16 ) ||
1838- (src2.shift_imm_ == 24 ));
1839- // Operand maps ROR #0 to LSL #0.
1840- DCHECK ((src2.shift_op () == ROR) ||
1841- ((src2.shift_op () == LSL) && (src2.shift_imm_ == 0 )));
1842- emit (cond | 0x6E *B20 | src1.code ()*B16 | dst.code ()*B12 |
1843- ((src2.shift_imm_ >> 1 ) &0xC )*B8 | 7 *B4 | src2.rm ().code ());
1872+ DCHECK (!src2.is (pc));
1873+ DCHECK (rotate == 0 || rotate == 8 || rotate == 16 || rotate == 24 );
1874+ emit (cond | 0x6E * B20 | src1.code () * B16 | dst.code () * B12 |
1875+ ((rotate >> 1 ) & 0xC ) * B8 | 7 * B4 | src2.code ());
18441876}
18451877
18461878
1847- void Assembler::uxtb16 (Register dst,
1848- const Operand& src,
1849- Condition cond) {
1879+ void Assembler::uxtb16 (Register dst, Register src, int rotate, Condition cond) {
18501880 // Instruction details available in ARM DDI 0406C.b, A8.8.275.
18511881 // cond(31-28) | 01101100(27-20) | 1111(19-16) |
18521882 // Rd(15-12) | rotate(11-10) | 00(9-8)| 0111(7-4) | Rm(3-0)
18531883 DCHECK (!dst.is (pc));
1854- DCHECK (!src.rm ().is (pc));
1855- DCHECK (!src.rm ().is (no_reg));
1856- DCHECK (src.rs ().is (no_reg));
1857- DCHECK ((src.shift_imm_ == 0 ) ||
1858- (src.shift_imm_ == 8 ) ||
1859- (src.shift_imm_ == 16 ) ||
1860- (src.shift_imm_ == 24 ));
1861- // Operand maps ROR #0 to LSL #0.
1862- DCHECK ((src.shift_op () == ROR) ||
1863- ((src.shift_op () == LSL) && (src.shift_imm_ == 0 )));
1864- emit (cond | 0x6C *B20 | 0xF *B16 | dst.code ()*B12 |
1865- ((src.shift_imm_ >> 1 )&0xC )*B8 | 7 *B4 | src.rm ().code ());
1884+ DCHECK (!src.is (pc));
1885+ DCHECK (rotate == 0 || rotate == 8 || rotate == 16 || rotate == 24 );
1886+ emit (cond | 0x6C * B20 | 0xF * B16 | dst.code () * B12 |
1887+ ((rotate >> 1 ) & 0xC ) * B8 | 7 * B4 | src.code ());
1888+ }
1889+
1890+
1891+ void Assembler::uxth (Register dst, Register src, int rotate, Condition cond) {
1892+ // Instruction details available in ARM DDI 0406C.b, A8.8.276.
1893+ // cond(31-28) | 01101111(27-20) | 1111(19-16) |
1894+ // Rd(15-12) | rotate(11-10) | 00(9-8)| 0111(7-4) | Rm(3-0)
1895+ DCHECK (!dst.is (pc));
1896+ DCHECK (!src.is (pc));
1897+ DCHECK (rotate == 0 || rotate == 8 || rotate == 16 || rotate == 24 );
1898+ emit (cond | 0x6F * B20 | 0xF * B16 | dst.code () * B12 |
1899+ ((rotate >> 1 ) & 0xC ) * B8 | 7 * B4 | src.code ());
1900+ }
1901+
1902+
1903+ void Assembler::uxtah (Register dst, Register src1, Register src2, int rotate,
1904+ Condition cond) {
1905+ // Instruction details available in ARM DDI 0406C.b, A8.8.273.
1906+ // cond(31-28) | 01101111(27-20) | Rn(19-16) |
1907+ // Rd(15-12) | rotate(11-10) | 00(9-8)| 0111(7-4) | Rm(3-0)
1908+ DCHECK (!dst.is (pc));
1909+ DCHECK (!src1.is (pc));
1910+ DCHECK (!src2.is (pc));
1911+ DCHECK (rotate == 0 || rotate == 8 || rotate == 16 || rotate == 24 );
1912+ emit (cond | 0x6F * B20 | src1.code () * B16 | dst.code () * B12 |
1913+ ((rotate >> 1 ) & 0xC ) * B8 | 7 * B4 | src2.code ());
18661914}
18671915
18681916
0 commit comments