diff options
| author | 2017-07-25 20:41:47 +0000 | |
|---|---|---|
| committer | 2017-07-25 20:41:47 +0000 | |
| commit | b46ff2d1605fde58238590afd70a24aa4512636b (patch) | |
| tree | 84492d2c75a3380862425174d952b1e6783a930f | |
| parent | b16a5bdd284e17f7703b8c71548bc05b9d3c3f3d (diff) | |
| parent | b3d79e430a4c0a447121890514cdee48e4675df4 (diff) | |
Merge "MIPS: Add maddv/msubv MSA instructions"
| -rw-r--r-- | compiler/utils/mips/assembler_mips.cc | 96 | ||||
| -rw-r--r-- | compiler/utils/mips/assembler_mips.h | 13 | ||||
| -rw-r--r-- | compiler/utils/mips/assembler_mips32r6_test.cc | 60 | ||||
| -rw-r--r-- | compiler/utils/mips64/assembler_mips64.cc | 60 | ||||
| -rw-r--r-- | compiler/utils/mips64/assembler_mips64.h | 13 | ||||
| -rw-r--r-- | compiler/utils/mips64/assembler_mips64_test.cc | 60 | ||||
| -rw-r--r-- | disassembler/disassembler_mips.cc | 4 |
7 files changed, 306 insertions, 0 deletions
diff --git a/compiler/utils/mips/assembler_mips.cc b/compiler/utils/mips/assembler_mips.cc index 24e34508d1..2cbabcfb32 100644 --- a/compiler/utils/mips/assembler_mips.cc +++ b/compiler/utils/mips/assembler_mips.cc @@ -2920,6 +2920,102 @@ void MipsAssembler::IlvrD(VectorRegister wd, VectorRegister ws, VectorRegister w static_cast<FRegister>(wt)); } +void MipsAssembler::MaddvB(VectorRegister wd, VectorRegister ws, VectorRegister wt) { + CHECK(HasMsa()); + DsFsmInstrFff(EmitMsa3R(0x1, 0x0, wt, ws, wd, 0x12), + static_cast<FRegister>(wd), + static_cast<FRegister>(ws), + static_cast<FRegister>(wt)); +} + +void MipsAssembler::MaddvH(VectorRegister wd, VectorRegister ws, VectorRegister wt) { + CHECK(HasMsa()); + DsFsmInstrFff(EmitMsa3R(0x1, 0x1, wt, ws, wd, 0x12), + static_cast<FRegister>(wd), + static_cast<FRegister>(ws), + static_cast<FRegister>(wt)); +} + +void MipsAssembler::MaddvW(VectorRegister wd, VectorRegister ws, VectorRegister wt) { + CHECK(HasMsa()); + DsFsmInstrFff(EmitMsa3R(0x1, 0x2, wt, ws, wd, 0x12), + static_cast<FRegister>(wd), + static_cast<FRegister>(ws), + static_cast<FRegister>(wt)); +} + +void MipsAssembler::MaddvD(VectorRegister wd, VectorRegister ws, VectorRegister wt) { + CHECK(HasMsa()); + DsFsmInstrFff(EmitMsa3R(0x1, 0x3, wt, ws, wd, 0x12), + static_cast<FRegister>(wd), + static_cast<FRegister>(ws), + static_cast<FRegister>(wt)); +} + +void MipsAssembler::MsubvB(VectorRegister wd, VectorRegister ws, VectorRegister wt) { + CHECK(HasMsa()); + DsFsmInstrFff(EmitMsa3R(0x2, 0x0, wt, ws, wd, 0x12), + static_cast<FRegister>(wd), + static_cast<FRegister>(ws), + static_cast<FRegister>(wt)); +} + +void MipsAssembler::MsubvH(VectorRegister wd, VectorRegister ws, VectorRegister wt) { + CHECK(HasMsa()); + DsFsmInstrFff(EmitMsa3R(0x2, 0x1, wt, ws, wd, 0x12), + static_cast<FRegister>(wd), + static_cast<FRegister>(ws), + static_cast<FRegister>(wt)); +} + +void MipsAssembler::MsubvW(VectorRegister wd, VectorRegister ws, VectorRegister wt) { + CHECK(HasMsa()); + DsFsmInstrFff(EmitMsa3R(0x2, 0x2, wt, ws, wd, 0x12), + static_cast<FRegister>(wd), + static_cast<FRegister>(ws), + static_cast<FRegister>(wt)); +} + +void MipsAssembler::MsubvD(VectorRegister wd, VectorRegister ws, VectorRegister wt) { + CHECK(HasMsa()); + DsFsmInstrFff(EmitMsa3R(0x2, 0x3, wt, ws, wd, 0x12), + 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), + static_cast<FRegister>(wd), + static_cast<FRegister>(ws), + static_cast<FRegister>(wt)); +} + +void MipsAssembler::FmaddD(VectorRegister wd, VectorRegister ws, VectorRegister wt) { + CHECK(HasMsa()); + DsFsmInstrFff(EmitMsa3R(0x2, 0x1, wt, ws, wd, 0x1b), + static_cast<FRegister>(wd), + static_cast<FRegister>(ws), + static_cast<FRegister>(wt)); +} + +void MipsAssembler::FmsubW(VectorRegister wd, VectorRegister ws, VectorRegister wt) { + CHECK(HasMsa()); + DsFsmInstrFff(EmitMsa3R(0x2, 0x2, wt, ws, wd, 0x1b), + static_cast<FRegister>(wd), + static_cast<FRegister>(ws), + static_cast<FRegister>(wt)); +} + +void MipsAssembler::FmsubD(VectorRegister wd, VectorRegister ws, VectorRegister wt) { + CHECK(HasMsa()); + DsFsmInstrFff(EmitMsa3R(0x2, 0x3, wt, ws, wd, 0x1b), + static_cast<FRegister>(wd), + static_cast<FRegister>(ws), + static_cast<FRegister>(wt)); +} + void MipsAssembler::ReplicateFPToVectorRegister(VectorRegister dst, FRegister src, bool is_double) { diff --git a/compiler/utils/mips/assembler_mips.h b/compiler/utils/mips/assembler_mips.h index e42bb3fa3d..a7ff931e7e 100644 --- a/compiler/utils/mips/assembler_mips.h +++ b/compiler/utils/mips/assembler_mips.h @@ -613,6 +613,19 @@ class MipsAssembler FINAL : public Assembler, public JNIMacroAssembler<PointerSi void IlvrW(VectorRegister wd, VectorRegister ws, VectorRegister wt); void IlvrD(VectorRegister wd, VectorRegister ws, VectorRegister wt); + void MaddvB(VectorRegister wd, VectorRegister ws, VectorRegister wt); + void MaddvH(VectorRegister wd, VectorRegister ws, VectorRegister wt); + void MaddvW(VectorRegister wd, VectorRegister ws, VectorRegister wt); + void MaddvD(VectorRegister wd, VectorRegister ws, VectorRegister wt); + void MsubvB(VectorRegister wd, VectorRegister ws, VectorRegister wt); + void MsubvH(VectorRegister wd, VectorRegister ws, VectorRegister wt); + void MsubvW(VectorRegister wd, VectorRegister ws, VectorRegister wt); + void MsubvD(VectorRegister wd, VectorRegister ws, VectorRegister wt); + void FmaddW(VectorRegister wd, VectorRegister ws, VectorRegister wt); + void FmaddD(VectorRegister wd, VectorRegister ws, VectorRegister wt); + void FmsubW(VectorRegister wd, VectorRegister ws, VectorRegister wt); + void FmsubD(VectorRegister wd, VectorRegister ws, VectorRegister wt); + // Helper for replicating floating point value in all destination elements. void ReplicateFPToVectorRegister(VectorRegister dst, FRegister src, bool is_double); diff --git a/compiler/utils/mips/assembler_mips32r6_test.cc b/compiler/utils/mips/assembler_mips32r6_test.cc index 6ee2a5cb79..b72a14e906 100644 --- a/compiler/utils/mips/assembler_mips32r6_test.cc +++ b/compiler/utils/mips/assembler_mips32r6_test.cc @@ -1752,6 +1752,66 @@ TEST_F(AssemblerMIPS32r6Test, IlvrD) { DriverStr(RepeatVVV(&mips::MipsAssembler::IlvrD, "ilvr.d ${reg1}, ${reg2}, ${reg3}"), "ilvr.d"); } +TEST_F(AssemblerMIPS32r6Test, MaddvB) { + DriverStr(RepeatVVV(&mips::MipsAssembler::MaddvB, "maddv.b ${reg1}, ${reg2}, ${reg3}"), + "maddv.b"); +} + +TEST_F(AssemblerMIPS32r6Test, MaddvH) { + DriverStr(RepeatVVV(&mips::MipsAssembler::MaddvH, "maddv.h ${reg1}, ${reg2}, ${reg3}"), + "maddv.h"); +} + +TEST_F(AssemblerMIPS32r6Test, MaddvW) { + DriverStr(RepeatVVV(&mips::MipsAssembler::MaddvW, "maddv.w ${reg1}, ${reg2}, ${reg3}"), + "maddv.w"); +} + +TEST_F(AssemblerMIPS32r6Test, MaddvD) { + DriverStr(RepeatVVV(&mips::MipsAssembler::MaddvD, "maddv.d ${reg1}, ${reg2}, ${reg3}"), + "maddv.d"); +} + +TEST_F(AssemblerMIPS32r6Test, MsubvB) { + DriverStr(RepeatVVV(&mips::MipsAssembler::MsubvB, "msubv.b ${reg1}, ${reg2}, ${reg3}"), + "msubv.b"); +} + +TEST_F(AssemblerMIPS32r6Test, MsubvH) { + DriverStr(RepeatVVV(&mips::MipsAssembler::MsubvH, "msubv.h ${reg1}, ${reg2}, ${reg3}"), + "msubv.h"); +} + +TEST_F(AssemblerMIPS32r6Test, MsubvW) { + DriverStr(RepeatVVV(&mips::MipsAssembler::MsubvW, "msubv.w ${reg1}, ${reg2}, ${reg3}"), + "msubv.w"); +} + +TEST_F(AssemblerMIPS32r6Test, MsubvD) { + DriverStr(RepeatVVV(&mips::MipsAssembler::MsubvD, "msubv.d ${reg1}, ${reg2}, ${reg3}"), + "msubv.d"); +} + +TEST_F(AssemblerMIPS32r6Test, FmaddW) { + DriverStr(RepeatVVV(&mips::MipsAssembler::FmaddW, "fmadd.w ${reg1}, ${reg2}, ${reg3}"), + "fmadd.w"); +} + +TEST_F(AssemblerMIPS32r6Test, FmaddD) { + DriverStr(RepeatVVV(&mips::MipsAssembler::FmaddD, "fmadd.d ${reg1}, ${reg2}, ${reg3}"), + "fmadd.d"); +} + +TEST_F(AssemblerMIPS32r6Test, FmsubW) { + DriverStr(RepeatVVV(&mips::MipsAssembler::FmsubW, "fmsub.w ${reg1}, ${reg2}, ${reg3}"), + "fmsub.w"); +} + +TEST_F(AssemblerMIPS32r6Test, FmsubD) { + DriverStr(RepeatVVV(&mips::MipsAssembler::FmsubD, "fmsub.d ${reg1}, ${reg2}, ${reg3}"), + "fmsub.d"); +} + #undef __ } // namespace art diff --git a/compiler/utils/mips64/assembler_mips64.cc b/compiler/utils/mips64/assembler_mips64.cc index 90398540f8..7a1beb656b 100644 --- a/compiler/utils/mips64/assembler_mips64.cc +++ b/compiler/utils/mips64/assembler_mips64.cc @@ -1899,6 +1899,66 @@ void Mips64Assembler::IlvrD(VectorRegister wd, VectorRegister ws, VectorRegister EmitMsa3R(0x5, 0x3, wt, ws, wd, 0x14); } +void Mips64Assembler::MaddvB(VectorRegister wd, VectorRegister ws, VectorRegister wt) { + CHECK(HasMsa()); + EmitMsa3R(0x1, 0x0, wt, ws, wd, 0x12); +} + +void Mips64Assembler::MaddvH(VectorRegister wd, VectorRegister ws, VectorRegister wt) { + CHECK(HasMsa()); + EmitMsa3R(0x1, 0x1, wt, ws, wd, 0x12); +} + +void Mips64Assembler::MaddvW(VectorRegister wd, VectorRegister ws, VectorRegister wt) { + CHECK(HasMsa()); + EmitMsa3R(0x1, 0x2, wt, ws, wd, 0x12); +} + +void Mips64Assembler::MaddvD(VectorRegister wd, VectorRegister ws, VectorRegister wt) { + CHECK(HasMsa()); + EmitMsa3R(0x1, 0x3, wt, ws, wd, 0x12); +} + +void Mips64Assembler::MsubvB(VectorRegister wd, VectorRegister ws, VectorRegister wt) { + CHECK(HasMsa()); + EmitMsa3R(0x2, 0x0, wt, ws, wd, 0x12); +} + +void Mips64Assembler::MsubvH(VectorRegister wd, VectorRegister ws, VectorRegister wt) { + CHECK(HasMsa()); + EmitMsa3R(0x2, 0x1, wt, ws, wd, 0x12); +} + +void Mips64Assembler::MsubvW(VectorRegister wd, VectorRegister ws, VectorRegister wt) { + CHECK(HasMsa()); + EmitMsa3R(0x2, 0x2, wt, ws, wd, 0x12); +} + +void Mips64Assembler::MsubvD(VectorRegister wd, VectorRegister ws, VectorRegister wt) { + CHECK(HasMsa()); + EmitMsa3R(0x2, 0x3, wt, ws, wd, 0x12); +} + +void Mips64Assembler::FmaddW(VectorRegister wd, VectorRegister ws, VectorRegister wt) { + CHECK(HasMsa()); + EmitMsa3R(0x2, 0x0, wt, ws, wd, 0x1b); +} + +void Mips64Assembler::FmaddD(VectorRegister wd, VectorRegister ws, VectorRegister wt) { + CHECK(HasMsa()); + EmitMsa3R(0x2, 0x1, wt, ws, wd, 0x1b); +} + +void Mips64Assembler::FmsubW(VectorRegister wd, VectorRegister ws, VectorRegister wt) { + CHECK(HasMsa()); + EmitMsa3R(0x2, 0x2, wt, ws, wd, 0x1b); +} + +void Mips64Assembler::FmsubD(VectorRegister wd, VectorRegister ws, VectorRegister wt) { + CHECK(HasMsa()); + EmitMsa3R(0x2, 0x3, wt, ws, wd, 0x1b); +} + void Mips64Assembler::ReplicateFPToVectorRegister(VectorRegister dst, FpuRegister src, bool is_double) { diff --git a/compiler/utils/mips64/assembler_mips64.h b/compiler/utils/mips64/assembler_mips64.h index 5e88033743..c39d120bce 100644 --- a/compiler/utils/mips64/assembler_mips64.h +++ b/compiler/utils/mips64/assembler_mips64.h @@ -796,6 +796,19 @@ class Mips64Assembler FINAL : public Assembler, public JNIMacroAssembler<Pointer void IlvrW(VectorRegister wd, VectorRegister ws, VectorRegister wt); void IlvrD(VectorRegister wd, VectorRegister ws, VectorRegister wt); + void MaddvB(VectorRegister wd, VectorRegister ws, VectorRegister wt); + void MaddvH(VectorRegister wd, VectorRegister ws, VectorRegister wt); + void MaddvW(VectorRegister wd, VectorRegister ws, VectorRegister wt); + void MaddvD(VectorRegister wd, VectorRegister ws, VectorRegister wt); + void MsubvB(VectorRegister wd, VectorRegister ws, VectorRegister wt); + void MsubvH(VectorRegister wd, VectorRegister ws, VectorRegister wt); + void MsubvW(VectorRegister wd, VectorRegister ws, VectorRegister wt); + void MsubvD(VectorRegister wd, VectorRegister ws, VectorRegister wt); + void FmaddW(VectorRegister wd, VectorRegister ws, VectorRegister wt); + void FmaddD(VectorRegister wd, VectorRegister ws, VectorRegister wt); + void FmsubW(VectorRegister wd, VectorRegister ws, VectorRegister wt); + void FmsubD(VectorRegister wd, VectorRegister ws, VectorRegister wt); + // Helper for replicating floating point value in all destination elements. void ReplicateFPToVectorRegister(VectorRegister dst, FpuRegister src, bool is_double); diff --git a/compiler/utils/mips64/assembler_mips64_test.cc b/compiler/utils/mips64/assembler_mips64_test.cc index bdf9598ee7..021e335697 100644 --- a/compiler/utils/mips64/assembler_mips64_test.cc +++ b/compiler/utils/mips64/assembler_mips64_test.cc @@ -3340,6 +3340,66 @@ TEST_F(AssemblerMIPS64Test, IlvrD) { "ilvr.d"); } +TEST_F(AssemblerMIPS64Test, MaddvB) { + DriverStr(RepeatVVV(&mips64::Mips64Assembler::MaddvB, "maddv.b ${reg1}, ${reg2}, ${reg3}"), + "maddv.b"); +} + +TEST_F(AssemblerMIPS64Test, MaddvH) { + DriverStr(RepeatVVV(&mips64::Mips64Assembler::MaddvH, "maddv.h ${reg1}, ${reg2}, ${reg3}"), + "maddv.h"); +} + +TEST_F(AssemblerMIPS64Test, MaddvW) { + DriverStr(RepeatVVV(&mips64::Mips64Assembler::MaddvW, "maddv.w ${reg1}, ${reg2}, ${reg3}"), + "maddv.w"); +} + +TEST_F(AssemblerMIPS64Test, MaddvD) { + DriverStr(RepeatVVV(&mips64::Mips64Assembler::MaddvD, "maddv.d ${reg1}, ${reg2}, ${reg3}"), + "maddv.d"); +} + +TEST_F(AssemblerMIPS64Test, MsubvB) { + DriverStr(RepeatVVV(&mips64::Mips64Assembler::MsubvB, "msubv.b ${reg1}, ${reg2}, ${reg3}"), + "msubv.b"); +} + +TEST_F(AssemblerMIPS64Test, MsubvH) { + DriverStr(RepeatVVV(&mips64::Mips64Assembler::MsubvH, "msubv.h ${reg1}, ${reg2}, ${reg3}"), + "msubv.h"); +} + +TEST_F(AssemblerMIPS64Test, MsubvW) { + DriverStr(RepeatVVV(&mips64::Mips64Assembler::MsubvW, "msubv.w ${reg1}, ${reg2}, ${reg3}"), + "msubv.w"); +} + +TEST_F(AssemblerMIPS64Test, MsubvD) { + DriverStr(RepeatVVV(&mips64::Mips64Assembler::MsubvD, "msubv.d ${reg1}, ${reg2}, ${reg3}"), + "msubv.d"); +} + +TEST_F(AssemblerMIPS64Test, FmaddW) { + DriverStr(RepeatVVV(&mips64::Mips64Assembler::FmaddW, "fmadd.w ${reg1}, ${reg2}, ${reg3}"), + "fmadd.w"); +} + +TEST_F(AssemblerMIPS64Test, FmaddD) { + DriverStr(RepeatVVV(&mips64::Mips64Assembler::FmaddD, "fmadd.d ${reg1}, ${reg2}, ${reg3}"), + "fmadd.d"); +} + +TEST_F(AssemblerMIPS64Test, FmsubW) { + DriverStr(RepeatVVV(&mips64::Mips64Assembler::FmsubW, "fmsub.w ${reg1}, ${reg2}, ${reg3}"), + "fmsub.w"); +} + +TEST_F(AssemblerMIPS64Test, FmsubD) { + DriverStr(RepeatVVV(&mips64::Mips64Assembler::FmsubD, "fmsub.d ${reg1}, ${reg2}, ${reg3}"), + "fmsub.d"); +} + #undef __ } // namespace art diff --git a/disassembler/disassembler_mips.cc b/disassembler/disassembler_mips.cc index 7cb216e766..1a395a45d2 100644 --- a/disassembler/disassembler_mips.cc +++ b/disassembler/disassembler_mips.cc @@ -477,6 +477,10 @@ static const MipsInstruction gMipsInstructions[] = { { kMsaSpecialMask | (0xf << 2), kMsa | (0x8 << 2), "ld", "kw" }, { kMsaSpecialMask | (0xf << 2), kMsa | (0x9 << 2), "st", "kw" }, { kMsaMask | (0x7 << 23), kMsa | (0x5 << 23) | 0x14, "ilvr", "Vkmn" }, + { kMsaMask | (0x7 << 23), kMsa | (0x1 << 23) | 0x12, "maddv", "Vkmn" }, + { kMsaMask | (0x7 << 23), kMsa | (0x2 << 23) | 0x12, "msubv", "Vkmn" }, + { kMsaMask | (0xf << 22), kMsa | (0x4 << 22) | 0x1b, "fmadd", "Ukmn" }, + { kMsaMask | (0xf << 22), kMsa | (0x5 << 22) | 0x1b, "fmsub", "Ukmn" }, }; static uint32_t ReadU32(const uint8_t* ptr) { |