diff options
-rw-r--r-- | compiler/utils/mips/assembler_mips.cc | 64 | ||||
-rw-r--r-- | compiler/utils/mips/assembler_mips.h | 8 | ||||
-rw-r--r-- | compiler/utils/mips/assembler_mips32r6_test.cc | 40 | ||||
-rw-r--r-- | compiler/utils/mips64/assembler_mips64.cc | 40 | ||||
-rw-r--r-- | compiler/utils/mips64/assembler_mips64.h | 8 | ||||
-rw-r--r-- | compiler/utils/mips64/assembler_mips64_test.cc | 40 | ||||
-rw-r--r-- | disassembler/disassembler_mips.cc | 2 |
7 files changed, 202 insertions, 0 deletions
diff --git a/compiler/utils/mips/assembler_mips.cc b/compiler/utils/mips/assembler_mips.cc index 9545ca6869..eb75f8b67c 100644 --- a/compiler/utils/mips/assembler_mips.cc +++ b/compiler/utils/mips/assembler_mips.cc @@ -3181,6 +3181,70 @@ void MipsAssembler::MsubvD(VectorRegister wd, VectorRegister ws, VectorRegister static_cast<FRegister>(wt)); } +void MipsAssembler::Asub_sB(VectorRegister wd, VectorRegister ws, VectorRegister wt) { + CHECK(HasMsa()); + DsFsmInstrFff(EmitMsa3R(0x4, 0x0, wt, ws, wd, 0x11), + static_cast<FRegister>(wd), + static_cast<FRegister>(ws), + static_cast<FRegister>(wt)); +} + +void MipsAssembler::Asub_sH(VectorRegister wd, VectorRegister ws, VectorRegister wt) { + CHECK(HasMsa()); + DsFsmInstrFff(EmitMsa3R(0x4, 0x1, wt, ws, wd, 0x11), + static_cast<FRegister>(wd), + static_cast<FRegister>(ws), + static_cast<FRegister>(wt)); +} + +void MipsAssembler::Asub_sW(VectorRegister wd, VectorRegister ws, VectorRegister wt) { + CHECK(HasMsa()); + DsFsmInstrFff(EmitMsa3R(0x4, 0x2, wt, ws, wd, 0x11), + static_cast<FRegister>(wd), + static_cast<FRegister>(ws), + static_cast<FRegister>(wt)); +} + +void MipsAssembler::Asub_sD(VectorRegister wd, VectorRegister ws, VectorRegister wt) { + CHECK(HasMsa()); + DsFsmInstrFff(EmitMsa3R(0x4, 0x3, wt, ws, wd, 0x11), + static_cast<FRegister>(wd), + static_cast<FRegister>(ws), + static_cast<FRegister>(wt)); +} + +void MipsAssembler::Asub_uB(VectorRegister wd, VectorRegister ws, VectorRegister wt) { + CHECK(HasMsa()); + DsFsmInstrFff(EmitMsa3R(0x5, 0x0, wt, ws, wd, 0x11), + static_cast<FRegister>(wd), + static_cast<FRegister>(ws), + static_cast<FRegister>(wt)); +} + +void MipsAssembler::Asub_uH(VectorRegister wd, VectorRegister ws, VectorRegister wt) { + CHECK(HasMsa()); + DsFsmInstrFff(EmitMsa3R(0x5, 0x1, wt, ws, wd, 0x11), + static_cast<FRegister>(wd), + static_cast<FRegister>(ws), + static_cast<FRegister>(wt)); +} + +void MipsAssembler::Asub_uW(VectorRegister wd, VectorRegister ws, VectorRegister wt) { + CHECK(HasMsa()); + DsFsmInstrFff(EmitMsa3R(0x5, 0x2, wt, ws, wd, 0x11), + static_cast<FRegister>(wd), + static_cast<FRegister>(ws), + static_cast<FRegister>(wt)); +} + +void MipsAssembler::Asub_uD(VectorRegister wd, VectorRegister ws, VectorRegister wt) { + CHECK(HasMsa()); + DsFsmInstrFff(EmitMsa3R(0x5, 0x3, wt, ws, wd, 0x11), + static_cast<FRegister>(wd), + static_cast<FRegister>(ws), + static_cast<FRegister>(wt)); +} + void MipsAssembler::FmaddW(VectorRegister wd, VectorRegister ws, VectorRegister wt) { CHECK(HasMsa()); DsFsmInstrFff(EmitMsa3R(0x2, 0x0, wt, ws, wd, 0x1b), diff --git a/compiler/utils/mips/assembler_mips.h b/compiler/utils/mips/assembler_mips.h index c0ea29fbd7..1c3097ac58 100644 --- a/compiler/utils/mips/assembler_mips.h +++ b/compiler/utils/mips/assembler_mips.h @@ -494,6 +494,14 @@ class MipsAssembler FINAL : public Assembler, public JNIMacroAssembler<PointerSi void SubvH(VectorRegister wd, VectorRegister ws, VectorRegister wt); void SubvW(VectorRegister wd, VectorRegister ws, VectorRegister wt); void SubvD(VectorRegister wd, VectorRegister ws, VectorRegister wt); + void Asub_sB(VectorRegister wd, VectorRegister ws, VectorRegister wt); + void Asub_sH(VectorRegister wd, VectorRegister ws, VectorRegister wt); + void Asub_sW(VectorRegister wd, VectorRegister ws, VectorRegister wt); + void Asub_sD(VectorRegister wd, VectorRegister ws, VectorRegister wt); + void Asub_uB(VectorRegister wd, VectorRegister ws, VectorRegister wt); + void Asub_uH(VectorRegister wd, VectorRegister ws, VectorRegister wt); + void Asub_uW(VectorRegister wd, VectorRegister ws, VectorRegister wt); + void Asub_uD(VectorRegister wd, VectorRegister ws, VectorRegister wt); void MulvB(VectorRegister wd, VectorRegister ws, VectorRegister wt); void MulvH(VectorRegister wd, VectorRegister ws, VectorRegister wt); void MulvW(VectorRegister wd, VectorRegister ws, VectorRegister wt); diff --git a/compiler/utils/mips/assembler_mips32r6_test.cc b/compiler/utils/mips/assembler_mips32r6_test.cc index c76a568ddd..937ee25bcb 100644 --- a/compiler/utils/mips/assembler_mips32r6_test.cc +++ b/compiler/utils/mips/assembler_mips32r6_test.cc @@ -1757,6 +1757,46 @@ TEST_F(AssemblerMIPS32r6Test, SubvD) { DriverStr(RepeatVVV(&mips::MipsAssembler::SubvD, "subv.d ${reg1}, ${reg2}, ${reg3}"), "subv.d"); } +TEST_F(AssemblerMIPS32r6Test, Asub_sB) { + DriverStr(RepeatVVV(&mips::MipsAssembler::Asub_sB, "asub_s.b ${reg1}, ${reg2}, ${reg3}"), + "asub_s.b"); +} + +TEST_F(AssemblerMIPS32r6Test, Asub_sH) { + DriverStr(RepeatVVV(&mips::MipsAssembler::Asub_sH, "asub_s.h ${reg1}, ${reg2}, ${reg3}"), + "asub_s.h"); +} + +TEST_F(AssemblerMIPS32r6Test, Asub_sW) { + DriverStr(RepeatVVV(&mips::MipsAssembler::Asub_sW, "asub_s.w ${reg1}, ${reg2}, ${reg3}"), + "asub_s.w"); +} + +TEST_F(AssemblerMIPS32r6Test, Asub_sD) { + DriverStr(RepeatVVV(&mips::MipsAssembler::Asub_sD, "asub_s.d ${reg1}, ${reg2}, ${reg3}"), + "asub_s.d"); +} + +TEST_F(AssemblerMIPS32r6Test, Asub_uB) { + DriverStr(RepeatVVV(&mips::MipsAssembler::Asub_uB, "asub_u.b ${reg1}, ${reg2}, ${reg3}"), + "asub_u.b"); +} + +TEST_F(AssemblerMIPS32r6Test, Asub_uH) { + DriverStr(RepeatVVV(&mips::MipsAssembler::Asub_uH, "asub_u.h ${reg1}, ${reg2}, ${reg3}"), + "asub_u.h"); +} + +TEST_F(AssemblerMIPS32r6Test, Asub_uW) { + DriverStr(RepeatVVV(&mips::MipsAssembler::Asub_uW, "asub_u.w ${reg1}, ${reg2}, ${reg3}"), + "asub_u.w"); +} + +TEST_F(AssemblerMIPS32r6Test, Asub_uD) { + DriverStr(RepeatVVV(&mips::MipsAssembler::Asub_uD, "asub_u.d ${reg1}, ${reg2}, ${reg3}"), + "asub_u.d"); +} + TEST_F(AssemblerMIPS32r6Test, MulvB) { DriverStr(RepeatVVV(&mips::MipsAssembler::MulvB, "mulv.b ${reg1}, ${reg2}, ${reg3}"), "mulv.b"); } diff --git a/compiler/utils/mips64/assembler_mips64.cc b/compiler/utils/mips64/assembler_mips64.cc index d8a4531ac2..bf56877499 100644 --- a/compiler/utils/mips64/assembler_mips64.cc +++ b/compiler/utils/mips64/assembler_mips64.cc @@ -1353,6 +1353,46 @@ void Mips64Assembler::SubvD(VectorRegister wd, VectorRegister ws, VectorRegister EmitMsa3R(0x1, 0x3, wt, ws, wd, 0xe); } +void Mips64Assembler::Asub_sB(VectorRegister wd, VectorRegister ws, VectorRegister wt) { + CHECK(HasMsa()); + EmitMsa3R(0x4, 0x0, wt, ws, wd, 0x11); +} + +void Mips64Assembler::Asub_sH(VectorRegister wd, VectorRegister ws, VectorRegister wt) { + CHECK(HasMsa()); + EmitMsa3R(0x4, 0x1, wt, ws, wd, 0x11); +} + +void Mips64Assembler::Asub_sW(VectorRegister wd, VectorRegister ws, VectorRegister wt) { + CHECK(HasMsa()); + EmitMsa3R(0x4, 0x2, wt, ws, wd, 0x11); +} + +void Mips64Assembler::Asub_sD(VectorRegister wd, VectorRegister ws, VectorRegister wt) { + CHECK(HasMsa()); + EmitMsa3R(0x4, 0x3, wt, ws, wd, 0x11); +} + +void Mips64Assembler::Asub_uB(VectorRegister wd, VectorRegister ws, VectorRegister wt) { + CHECK(HasMsa()); + EmitMsa3R(0x5, 0x0, wt, ws, wd, 0x11); +} + +void Mips64Assembler::Asub_uH(VectorRegister wd, VectorRegister ws, VectorRegister wt) { + CHECK(HasMsa()); + EmitMsa3R(0x5, 0x1, wt, ws, wd, 0x11); +} + +void Mips64Assembler::Asub_uW(VectorRegister wd, VectorRegister ws, VectorRegister wt) { + CHECK(HasMsa()); + EmitMsa3R(0x5, 0x2, wt, ws, wd, 0x11); +} + +void Mips64Assembler::Asub_uD(VectorRegister wd, VectorRegister ws, VectorRegister wt) { + CHECK(HasMsa()); + EmitMsa3R(0x5, 0x3, wt, ws, wd, 0x11); +} + void Mips64Assembler::MulvB(VectorRegister wd, VectorRegister ws, VectorRegister wt) { CHECK(HasMsa()); EmitMsa3R(0x0, 0x0, wt, ws, wd, 0x12); diff --git a/compiler/utils/mips64/assembler_mips64.h b/compiler/utils/mips64/assembler_mips64.h index d67fb0054d..9f5e6aaa88 100644 --- a/compiler/utils/mips64/assembler_mips64.h +++ b/compiler/utils/mips64/assembler_mips64.h @@ -678,6 +678,14 @@ class Mips64Assembler FINAL : public Assembler, public JNIMacroAssembler<Pointer void SubvH(VectorRegister wd, VectorRegister ws, VectorRegister wt); void SubvW(VectorRegister wd, VectorRegister ws, VectorRegister wt); void SubvD(VectorRegister wd, VectorRegister ws, VectorRegister wt); + void Asub_sB(VectorRegister wd, VectorRegister ws, VectorRegister wt); + void Asub_sH(VectorRegister wd, VectorRegister ws, VectorRegister wt); + void Asub_sW(VectorRegister wd, VectorRegister ws, VectorRegister wt); + void Asub_sD(VectorRegister wd, VectorRegister ws, VectorRegister wt); + void Asub_uB(VectorRegister wd, VectorRegister ws, VectorRegister wt); + void Asub_uH(VectorRegister wd, VectorRegister ws, VectorRegister wt); + void Asub_uW(VectorRegister wd, VectorRegister ws, VectorRegister wt); + void Asub_uD(VectorRegister wd, VectorRegister ws, VectorRegister wt); void MulvB(VectorRegister wd, VectorRegister ws, VectorRegister wt); void MulvH(VectorRegister wd, VectorRegister ws, VectorRegister wt); void MulvW(VectorRegister wd, VectorRegister ws, VectorRegister wt); diff --git a/compiler/utils/mips64/assembler_mips64_test.cc b/compiler/utils/mips64/assembler_mips64_test.cc index 164af7891c..d89ca3d6ea 100644 --- a/compiler/utils/mips64/assembler_mips64_test.cc +++ b/compiler/utils/mips64/assembler_mips64_test.cc @@ -2947,6 +2947,46 @@ TEST_F(AssemblerMIPS64Test, SubvD) { "subv.d"); } +TEST_F(AssemblerMIPS64Test, Asub_sB) { + DriverStr(RepeatVVV(&mips64::Mips64Assembler::Asub_sB, "asub_s.b ${reg1}, ${reg2}, ${reg3}"), + "asub_s.b"); +} + +TEST_F(AssemblerMIPS64Test, Asub_sH) { + DriverStr(RepeatVVV(&mips64::Mips64Assembler::Asub_sH, "asub_s.h ${reg1}, ${reg2}, ${reg3}"), + "asub_s.h"); +} + +TEST_F(AssemblerMIPS64Test, Asub_sW) { + DriverStr(RepeatVVV(&mips64::Mips64Assembler::Asub_sW, "asub_s.w ${reg1}, ${reg2}, ${reg3}"), + "asub_s.w"); +} + +TEST_F(AssemblerMIPS64Test, Asub_sD) { + DriverStr(RepeatVVV(&mips64::Mips64Assembler::Asub_sD, "asub_s.d ${reg1}, ${reg2}, ${reg3}"), + "asub_s.d"); +} + +TEST_F(AssemblerMIPS64Test, Asub_uB) { + DriverStr(RepeatVVV(&mips64::Mips64Assembler::Asub_uB, "asub_u.b ${reg1}, ${reg2}, ${reg3}"), + "asub_u.b"); +} + +TEST_F(AssemblerMIPS64Test, Asub_uH) { + DriverStr(RepeatVVV(&mips64::Mips64Assembler::Asub_uH, "asub_u.h ${reg1}, ${reg2}, ${reg3}"), + "asub_u.h"); +} + +TEST_F(AssemblerMIPS64Test, Asub_uW) { + DriverStr(RepeatVVV(&mips64::Mips64Assembler::Asub_uW, "asub_u.w ${reg1}, ${reg2}, ${reg3}"), + "asub_u.w"); +} + +TEST_F(AssemblerMIPS64Test, Asub_uD) { + DriverStr(RepeatVVV(&mips64::Mips64Assembler::Asub_uD, "asub_u.d ${reg1}, ${reg2}, ${reg3}"), + "asub_u.d"); +} + TEST_F(AssemblerMIPS64Test, MulvB) { DriverStr(RepeatVVV(&mips64::Mips64Assembler::MulvB, "mulv.b ${reg1}, ${reg2}, ${reg3}"), "mulv.b"); diff --git a/disassembler/disassembler_mips.cc b/disassembler/disassembler_mips.cc index 7c6a3251f7..2c800e7af3 100644 --- a/disassembler/disassembler_mips.cc +++ b/disassembler/disassembler_mips.cc @@ -449,6 +449,8 @@ static const MipsInstruction gMipsInstructions[] = { { kMsaMask | (0x1f << 21), kMsa | (0x3 << 21) | 0x1e, "xor.v", "kmn" }, { kMsaMask | (0x7 << 23), kMsa | (0x0 << 23) | 0xe, "addv", "Vkmn" }, { kMsaMask | (0x7 << 23), kMsa | (0x1 << 23) | 0xe, "subv", "Vkmn" }, + { kMsaMask | (0x7 << 23), kMsa | (0x4 << 23) | 0x11, "asub_s", "Vkmn" }, + { kMsaMask | (0x7 << 23), kMsa | (0x5 << 23) | 0x11, "asub_u", "Vkmn" }, { kMsaMask | (0x7 << 23), kMsa | (0x0 << 23) | 0x12, "mulv", "Vkmn" }, { kMsaMask | (0x7 << 23), kMsa | (0x4 << 23) | 0x12, "div_s", "Vkmn" }, { kMsaMask | (0x7 << 23), kMsa | (0x5 << 23) | 0x12, "div_u", "Vkmn" }, |