summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--compiler/utils/assembler_test.h86
-rw-r--r--compiler/utils/mips64/assembler_mips64.cc472
-rw-r--r--compiler/utils/mips64/assembler_mips64.h107
-rw-r--r--compiler/utils/mips64/assembler_mips64_test.cc410
-rw-r--r--compiler/utils/mips64/constants_mips64.h27
-rw-r--r--compiler/utils/x86/assembler_x86.cc37
-rw-r--r--compiler/utils/x86/assembler_x86.h5
-rw-r--r--compiler/utils/x86/assembler_x86_test.cc16
-rw-r--r--compiler/utils/x86_64/assembler_x86_64.cc37
-rw-r--r--compiler/utils/x86_64/assembler_x86_64.h5
-rw-r--r--compiler/utils/x86_64/assembler_x86_64_test.cc16
-rw-r--r--disassembler/disassembler_mips.cc138
-rw-r--r--runtime/arch/mips64/registers_mips64.cc9
-rw-r--r--runtime/arch/mips64/registers_mips64.h39
-rw-r--r--test/knownfailures.json71
-rwxr-xr-xtest/testrunner/testrunner.py30
16 files changed, 169 insertions, 1336 deletions
diff --git a/compiler/utils/assembler_test.h b/compiler/utils/assembler_test.h
index d265a44092..5c4875951b 100644
--- a/compiler/utils/assembler_test.h
+++ b/compiler/utils/assembler_test.h
@@ -42,10 +42,7 @@ enum class RegisterView { // private
kUseQuaternaryName,
};
-// For use in the template as the default type to get a nonvector registers version.
-struct NoVectorRegs {};
-
-template<typename Ass, typename Reg, typename FPReg, typename Imm, typename VecReg = NoVectorRegs>
+template<typename Ass, typename Reg, typename FPReg, typename Imm>
class AssemblerTest : public testing::Test {
public:
Ass* GetAssembler() {
@@ -149,8 +146,7 @@ class AssemblerTest : public testing::Test {
std::string (AssemblerTest::*GetName1)(const Reg1&),
std::string (AssemblerTest::*GetName2)(const Reg2&),
const std::string& fmt,
- int bias = 0,
- int multiplier = 1) {
+ int bias = 0) {
std::string str;
std::vector<int64_t> imms = CreateImmediateValuesBits(abs(imm_bits), (imm_bits > 0));
@@ -158,7 +154,7 @@ class AssemblerTest : public testing::Test {
for (auto reg2 : reg2_registers) {
for (int64_t imm : imms) {
ImmType new_imm = CreateImmediate(imm);
- (assembler_.get()->*f)(*reg1, *reg2, new_imm * multiplier + bias);
+ (assembler_.get()->*f)(*reg1, *reg2, new_imm + bias);
std::string base = fmt;
std::string reg1_string = (this->*GetName1)(*reg1);
@@ -176,7 +172,7 @@ class AssemblerTest : public testing::Test {
size_t imm_index = base.find(IMM_TOKEN);
if (imm_index != std::string::npos) {
std::ostringstream sreg;
- sreg << imm * multiplier + bias;
+ sreg << imm + bias;
std::string imm_string = sreg.str();
base.replace(imm_index, ConstexprStrLen(IMM_TOKEN), imm_string);
}
@@ -542,69 +538,6 @@ class AssemblerTest : public testing::Test {
return str;
}
- std::string RepeatVV(void (Ass::*f)(VecReg, VecReg), const std::string& fmt) {
- return RepeatTemplatedRegisters<VecReg, VecReg>(f,
- GetVectorRegisters(),
- GetVectorRegisters(),
- &AssemblerTest::GetVecRegName,
- &AssemblerTest::GetVecRegName,
- fmt);
- }
-
- std::string RepeatVVV(void (Ass::*f)(VecReg, VecReg, VecReg), const std::string& fmt) {
- return RepeatTemplatedRegisters<VecReg, VecReg, VecReg>(f,
- GetVectorRegisters(),
- GetVectorRegisters(),
- GetVectorRegisters(),
- &AssemblerTest::GetVecRegName,
- &AssemblerTest::GetVecRegName,
- &AssemblerTest::GetVecRegName,
- fmt);
- }
-
- std::string RepeatVR(void (Ass::*f)(VecReg, Reg), const std::string& fmt) {
- return RepeatTemplatedRegisters<VecReg, Reg>(
- f,
- GetVectorRegisters(),
- GetRegisters(),
- &AssemblerTest::GetVecRegName,
- &AssemblerTest::GetRegName<RegisterView::kUsePrimaryName>,
- fmt);
- }
-
- template <typename ImmType>
- std::string RepeatVRIb(void (Ass::*f)(VecReg, Reg, ImmType),
- int imm_bits,
- const std::string& fmt,
- int bias = 0,
- int multiplier = 1) {
- return RepeatTemplatedRegistersImmBits<VecReg, Reg, ImmType>(
- f,
- imm_bits,
- GetVectorRegisters(),
- GetRegisters(),
- &AssemblerTest::GetVecRegName,
- &AssemblerTest::GetRegName<RegisterView::kUsePrimaryName>,
- fmt,
- bias,
- multiplier);
- }
-
- template <typename ImmType>
- std::string RepeatVVIb(void (Ass::*f)(VecReg, VecReg, ImmType),
- int imm_bits,
- const std::string& fmt,
- int bias = 0) {
- return RepeatTemplatedRegistersImmBits<VecReg, VecReg, ImmType>(f,
- imm_bits,
- GetVectorRegisters(),
- GetVectorRegisters(),
- &AssemblerTest::GetVecRegName,
- &AssemblerTest::GetVecRegName,
- fmt,
- bias);
- }
-
// This is intended to be run as a test.
bool CheckTools() {
return test_helper_->CheckTools();
@@ -619,11 +552,6 @@ class AssemblerTest : public testing::Test {
UNREACHABLE();
}
- virtual std::vector<VecReg*> GetVectorRegisters() {
- UNIMPLEMENTED(FATAL) << "Architecture does not support vector registers";
- UNREACHABLE();
- }
-
// Secondary register names are the secondary view on registers, e.g., 32b on 64b systems.
virtual std::string GetSecondaryRegisterName(const Reg& reg ATTRIBUTE_UNUSED) {
UNIMPLEMENTED(FATAL) << "Architecture does not support secondary registers";
@@ -1043,12 +971,6 @@ class AssemblerTest : public testing::Test {
return sreg.str();
}
- std::string GetVecRegName(const VecReg& reg) {
- std::ostringstream sreg;
- sreg << reg;
- return sreg.str();
- }
-
// If the assembly file needs a header, return it in a sub-class.
virtual const char* GetAssemblyHeader() {
return nullptr;
diff --git a/compiler/utils/mips64/assembler_mips64.cc b/compiler/utils/mips64/assembler_mips64.cc
index c14315a91e..39eb5893d8 100644
--- a/compiler/utils/mips64/assembler_mips64.cc
+++ b/compiler/utils/mips64/assembler_mips64.cc
@@ -184,106 +184,6 @@ void Mips64Assembler::EmitFI(int opcode, int fmt, FpuRegister ft, uint16_t imm)
Emit(encoding);
}
-void Mips64Assembler::EmitMsa3R(int operation,
- int df,
- VectorRegister wt,
- VectorRegister ws,
- VectorRegister wd,
- int minor_opcode) {
- CHECK_NE(wt, kNoVectorRegister);
- CHECK_NE(ws, kNoVectorRegister);
- CHECK_NE(wd, kNoVectorRegister);
- uint32_t encoding = static_cast<uint32_t>(kMsaMajorOpcode) << kOpcodeShift |
- operation << kMsaOperationShift |
- df << kDfShift |
- static_cast<uint32_t>(wt) << kWtShift |
- static_cast<uint32_t>(ws) << kWsShift |
- static_cast<uint32_t>(wd) << kWdShift |
- minor_opcode;
- Emit(encoding);
-}
-
-void Mips64Assembler::EmitMsaBIT(int operation,
- int df_m,
- VectorRegister ws,
- VectorRegister wd,
- int minor_opcode) {
- CHECK_NE(ws, kNoVectorRegister);
- CHECK_NE(wd, kNoVectorRegister);
- uint32_t encoding = static_cast<uint32_t>(kMsaMajorOpcode) << kOpcodeShift |
- operation << kMsaOperationShift |
- df_m << kDfMShift |
- static_cast<uint32_t>(ws) << kWsShift |
- static_cast<uint32_t>(wd) << kWdShift |
- minor_opcode;
- Emit(encoding);
-}
-
-void Mips64Assembler::EmitMsaELM(int operation,
- int df_n,
- VectorRegister ws,
- VectorRegister wd,
- int minor_opcode) {
- CHECK_NE(ws, kNoVectorRegister);
- CHECK_NE(wd, kNoVectorRegister);
- uint32_t encoding = static_cast<uint32_t>(kMsaMajorOpcode) << kOpcodeShift |
- operation << kMsaELMOperationShift |
- df_n << kDfNShift |
- static_cast<uint32_t>(ws) << kWsShift |
- static_cast<uint32_t>(wd) << kWdShift |
- minor_opcode;
- Emit(encoding);
-}
-
-void Mips64Assembler::EmitMsaMI10(int s10,
- GpuRegister rs,
- VectorRegister wd,
- int minor_opcode,
- int df) {
- CHECK_NE(rs, kNoGpuRegister);
- CHECK_NE(wd, kNoVectorRegister);
- CHECK(IsUint<10>(s10)) << s10;
- uint32_t encoding = static_cast<uint32_t>(kMsaMajorOpcode) << kOpcodeShift |
- s10 << kS10Shift |
- static_cast<uint32_t>(rs) << kWsShift |
- static_cast<uint32_t>(wd) << kWdShift |
- minor_opcode << kS10MinorShift |
- df;
- Emit(encoding);
-}
-
-void Mips64Assembler::EmitMsa2R(int operation,
- int df,
- VectorRegister ws,
- VectorRegister wd,
- int minor_opcode) {
- CHECK_NE(ws, kNoVectorRegister);
- CHECK_NE(wd, kNoVectorRegister);
- uint32_t encoding = static_cast<uint32_t>(kMsaMajorOpcode) << kOpcodeShift |
- operation << kMsa2ROperationShift |
- df << kDf2RShift |
- static_cast<uint32_t>(ws) << kWsShift |
- static_cast<uint32_t>(wd) << kWdShift |
- minor_opcode;
- Emit(encoding);
-}
-
-void Mips64Assembler::EmitMsa2RF(int operation,
- int df,
- VectorRegister ws,
- VectorRegister wd,
- int minor_opcode) {
- CHECK_NE(ws, kNoVectorRegister);
- CHECK_NE(wd, kNoVectorRegister);
- uint32_t encoding = static_cast<uint32_t>(kMsaMajorOpcode) << kOpcodeShift |
- operation << kMsa2RFOperationShift |
- df << kDf2RShift |
- static_cast<uint32_t>(ws) << kWsShift |
- static_cast<uint32_t>(wd) << kWdShift |
- minor_opcode;
- Emit(encoding);
-}
-
void Mips64Assembler::Addu(GpuRegister rd, GpuRegister rs, GpuRegister rt) {
EmitR(0, rs, rt, rd, 0, 0x21);
}
@@ -1180,378 +1080,6 @@ void Mips64Assembler::Not(GpuRegister rd, GpuRegister rs) {
Nor(rd, rs, ZERO);
}
-// TODO: Check for MSA presence in Mips64InstructionSetFeatures for each MSA instruction.
-
-void Mips64Assembler::AndV(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x0, 0x0, wt, ws, wd, 0x1e);
-}
-
-void Mips64Assembler::OrV(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x0, 0x1, wt, ws, wd, 0x1e);
-}
-
-void Mips64Assembler::NorV(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x0, 0x2, wt, ws, wd, 0x1e);
-}
-
-void Mips64Assembler::XorV(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x0, 0x3, wt, ws, wd, 0x1e);
-}
-
-void Mips64Assembler::AddvB(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x0, 0x0, wt, ws, wd, 0xe);
-}
-
-void Mips64Assembler::AddvH(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x0, 0x1, wt, ws, wd, 0xe);
-}
-
-void Mips64Assembler::AddvW(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x0, 0x2, wt, ws, wd, 0xe);
-}
-
-void Mips64Assembler::AddvD(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x0, 0x3, wt, ws, wd, 0xe);
-}
-
-void Mips64Assembler::SubvB(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x1, 0x0, wt, ws, wd, 0xe);
-}
-
-void Mips64Assembler::SubvH(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x1, 0x1, wt, ws, wd, 0xe);
-}
-
-void Mips64Assembler::SubvW(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x1, 0x2, wt, ws, wd, 0xe);
-}
-
-void Mips64Assembler::SubvD(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x1, 0x3, wt, ws, wd, 0xe);
-}
-
-void Mips64Assembler::MulvB(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x0, 0x0, wt, ws, wd, 0x12);
-}
-
-void Mips64Assembler::MulvH(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x0, 0x1, wt, ws, wd, 0x12);
-}
-
-void Mips64Assembler::MulvW(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x0, 0x2, wt, ws, wd, 0x12);
-}
-
-void Mips64Assembler::MulvD(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x0, 0x3, wt, ws, wd, 0x12);
-}
-
-void Mips64Assembler::Div_sB(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x4, 0x0, wt, ws, wd, 0x12);
-}
-
-void Mips64Assembler::Div_sH(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x4, 0x1, wt, ws, wd, 0x12);
-}
-
-void Mips64Assembler::Div_sW(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x4, 0x2, wt, ws, wd, 0x12);
-}
-
-void Mips64Assembler::Div_sD(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x4, 0x3, wt, ws, wd, 0x12);
-}
-
-void Mips64Assembler::Div_uB(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x5, 0x0, wt, ws, wd, 0x12);
-}
-
-void Mips64Assembler::Div_uH(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x5, 0x1, wt, ws, wd, 0x12);
-}
-
-void Mips64Assembler::Div_uW(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x5, 0x2, wt, ws, wd, 0x12);
-}
-
-void Mips64Assembler::Div_uD(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x5, 0x3, wt, ws, wd, 0x12);
-}
-
-void Mips64Assembler::Mod_sB(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x6, 0x0, wt, ws, wd, 0x12);
-}
-
-void Mips64Assembler::Mod_sH(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x6, 0x1, wt, ws, wd, 0x12);
-}
-
-void Mips64Assembler::Mod_sW(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x6, 0x2, wt, ws, wd, 0x12);
-}
-
-void Mips64Assembler::Mod_sD(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x6, 0x3, wt, ws, wd, 0x12);
-}
-
-void Mips64Assembler::Mod_uB(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x7, 0x0, wt, ws, wd, 0x12);
-}
-
-void Mips64Assembler::Mod_uH(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x7, 0x1, wt, ws, wd, 0x12);
-}
-
-void Mips64Assembler::Mod_uW(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x7, 0x2, wt, ws, wd, 0x12);
-}
-
-void Mips64Assembler::Mod_uD(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x7, 0x3, wt, ws, wd, 0x12);
-}
-
-void Mips64Assembler::FaddW(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x0, 0x0, wt, ws, wd, 0x1b);
-}
-
-void Mips64Assembler::FaddD(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x0, 0x1, wt, ws, wd, 0x1b);
-}
-
-void Mips64Assembler::FsubW(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x0, 0x2, wt, ws, wd, 0x1b);
-}
-
-void Mips64Assembler::FsubD(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x0, 0x3, wt, ws, wd, 0x1b);
-}
-
-void Mips64Assembler::FmulW(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x1, 0x0, wt, ws, wd, 0x1b);
-}
-
-void Mips64Assembler::FmulD(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x1, 0x1, wt, ws, wd, 0x1b);
-}
-
-void Mips64Assembler::FdivW(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x1, 0x2, wt, ws, wd, 0x1b);
-}
-
-void Mips64Assembler::FdivD(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x1, 0x3, wt, ws, wd, 0x1b);
-}
-
-void Mips64Assembler::Ffint_sW(VectorRegister wd, VectorRegister ws) {
- EmitMsa2RF(0x19e, 0x0, ws, wd, 0x1e);
-}
-
-void Mips64Assembler::Ffint_sD(VectorRegister wd, VectorRegister ws) {
- EmitMsa2RF(0x19e, 0x1, ws, wd, 0x1e);
-}
-
-void Mips64Assembler::Ftint_sW(VectorRegister wd, VectorRegister ws) {
- EmitMsa2RF(0x19c, 0x0, ws, wd, 0x1e);
-}
-
-void Mips64Assembler::Ftint_sD(VectorRegister wd, VectorRegister ws) {
- EmitMsa2RF(0x19c, 0x1, ws, wd, 0x1e);
-}
-
-void Mips64Assembler::SllB(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x0, 0x0, wt, ws, wd, 0xd);
-}
-
-void Mips64Assembler::SllH(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x0, 0x1, wt, ws, wd, 0xd);
-}
-
-void Mips64Assembler::SllW(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x0, 0x2, wt, ws, wd, 0xd);
-}
-
-void Mips64Assembler::SllD(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x0, 0x3, wt, ws, wd, 0xd);
-}
-
-void Mips64Assembler::SraB(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x1, 0x0, wt, ws, wd, 0xd);
-}
-
-void Mips64Assembler::SraH(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x1, 0x1, wt, ws, wd, 0xd);
-}
-
-void Mips64Assembler::SraW(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x1, 0x2, wt, ws, wd, 0xd);
-}
-
-void Mips64Assembler::SraD(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x1, 0x3, wt, ws, wd, 0xd);
-}
-
-void Mips64Assembler::SrlB(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x2, 0x0, wt, ws, wd, 0xd);
-}
-
-void Mips64Assembler::SrlH(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x2, 0x1, wt, ws, wd, 0xd);
-}
-
-void Mips64Assembler::SrlW(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x2, 0x2, wt, ws, wd, 0xd);
-}
-
-void Mips64Assembler::SrlD(VectorRegister wd, VectorRegister ws, VectorRegister wt) {
- EmitMsa3R(0x2, 0x3, wt, ws, wd, 0xd);
-}
-
-void Mips64Assembler::SlliB(VectorRegister wd, VectorRegister ws, int shamt3) {
- CHECK(IsUint<3>(shamt3)) << shamt3;
- EmitMsaBIT(0x0, shamt3 | kMsaDfMByteMask, ws, wd, 0x9);
-}
-
-void Mips64Assembler::SlliH(VectorRegister wd, VectorRegister ws, int shamt4) {
- CHECK(IsUint<4>(shamt4)) << shamt4;
- EmitMsaBIT(0x0, shamt4 | kMsaDfMHalfwordMask, ws, wd, 0x9);
-}
-
-void Mips64Assembler::SlliW(VectorRegister wd, VectorRegister ws, int shamt5) {
- CHECK(IsUint<5>(shamt5)) << shamt5;
- EmitMsaBIT(0x0, shamt5 | kMsaDfMWordMask, ws, wd, 0x9);
-}
-
-void Mips64Assembler::SlliD(VectorRegister wd, VectorRegister ws, int shamt6) {
- CHECK(IsUint<6>(shamt6)) << shamt6;
- EmitMsaBIT(0x0, shamt6 | kMsaDfMDoublewordMask, ws, wd, 0x9);
-}
-
-void Mips64Assembler::SraiB(VectorRegister wd, VectorRegister ws, int shamt3) {
- CHECK(IsUint<3>(shamt3)) << shamt3;
- EmitMsaBIT(0x1, shamt3 | kMsaDfMByteMask, ws, wd, 0x9);
-}
-
-void Mips64Assembler::SraiH(VectorRegister wd, VectorRegister ws, int shamt4) {
- CHECK(IsUint<4>(shamt4)) << shamt4;
- EmitMsaBIT(0x1, shamt4 | kMsaDfMHalfwordMask, ws, wd, 0x9);
-}
-
-void Mips64Assembler::SraiW(VectorRegister wd, VectorRegister ws, int shamt5) {
- CHECK(IsUint<5>(shamt5)) << shamt5;
- EmitMsaBIT(0x1, shamt5 | kMsaDfMWordMask, ws, wd, 0x9);
-}
-
-void Mips64Assembler::SraiD(VectorRegister wd, VectorRegister ws, int shamt6) {
- CHECK(IsUint<6>(shamt6)) << shamt6;
- EmitMsaBIT(0x1, shamt6 | kMsaDfMDoublewordMask, ws, wd, 0x9);
-}
-
-void Mips64Assembler::SrliB(VectorRegister wd, VectorRegister ws, int shamt3) {
- CHECK(IsUint<3>(shamt3)) << shamt3;
- EmitMsaBIT(0x2, shamt3 | kMsaDfMByteMask, ws, wd, 0x9);
-}
-
-void Mips64Assembler::SrliH(VectorRegister wd, VectorRegister ws, int shamt4) {
- CHECK(IsUint<4>(shamt4)) << shamt4;
- EmitMsaBIT(0x2, shamt4 | kMsaDfMHalfwordMask, ws, wd, 0x9);
-}
-
-void Mips64Assembler::SrliW(VectorRegister wd, VectorRegister ws, int shamt5) {
- CHECK(IsUint<5>(shamt5)) << shamt5;
- EmitMsaBIT(0x2, shamt5 | kMsaDfMWordMask, ws, wd, 0x9);
-}
-
-void Mips64Assembler::SrliD(VectorRegister wd, VectorRegister ws, int shamt6) {
- CHECK(IsUint<6>(shamt6)) << shamt6;
- EmitMsaBIT(0x2, shamt6 | kMsaDfMDoublewordMask, ws, wd, 0x9);
-}
-
-void Mips64Assembler::MoveV(VectorRegister wd, VectorRegister ws) {
- EmitMsaBIT(0x1, 0x3e, ws, wd, 0x19);
-}
-
-void Mips64Assembler::SplatiB(VectorRegister wd, VectorRegister ws, int n4) {
- CHECK(IsUint<4>(n4)) << n4;
- EmitMsaELM(0x1, n4 | kMsaDfNByteMask, ws, wd, 0x19);
-}
-
-void Mips64Assembler::SplatiH(VectorRegister wd, VectorRegister ws, int n3) {
- CHECK(IsUint<3>(n3)) << n3;
- EmitMsaELM(0x1, n3 | kMsaDfNHalfwordMask, ws, wd, 0x19);
-}
-
-void Mips64Assembler::SplatiW(VectorRegister wd, VectorRegister ws, int n2) {
- CHECK(IsUint<2>(n2)) << n2;
- EmitMsaELM(0x1, n2 | kMsaDfNWordMask, ws, wd, 0x19);
-}
-
-void Mips64Assembler::SplatiD(VectorRegister wd, VectorRegister ws, int n1) {
- CHECK(IsUint<1>(n1)) << n1;
- EmitMsaELM(0x1, n1 | kMsaDfNDoublewordMask, ws, wd, 0x19);
-}
-
-void Mips64Assembler::FillB(VectorRegister wd, GpuRegister rs) {
- EmitMsa2R(0xc0, 0x0, static_cast<VectorRegister>(rs), wd, 0x1e);
-}
-
-void Mips64Assembler::FillH(VectorRegister wd, GpuRegister rs) {
- EmitMsa2R(0xc0, 0x1, static_cast<VectorRegister>(rs), wd, 0x1e);
-}
-
-void Mips64Assembler::FillW(VectorRegister wd, GpuRegister rs) {
- EmitMsa2R(0xc0, 0x2, static_cast<VectorRegister>(rs), wd, 0x1e);
-}
-
-void Mips64Assembler::FillD(VectorRegister wd, GpuRegister rs) {
- EmitMsa2R(0xc0, 0x3, static_cast<VectorRegister>(rs), wd, 0x1e);
-}
-
-void Mips64Assembler::LdB(VectorRegister wd, GpuRegister rs, int offset) {
- CHECK(IsInt<10>(offset)) << offset;
- EmitMsaMI10(offset & kMsaS10Mask, rs, wd, 0x8, 0x0);
-}
-
-void Mips64Assembler::LdH(VectorRegister wd, GpuRegister rs, int offset) {
- CHECK(IsInt<11>(offset)) << offset;
- CHECK_ALIGNED(offset, kMips64HalfwordSize);
- EmitMsaMI10((offset >> TIMES_2) & kMsaS10Mask, rs, wd, 0x8, 0x1);
-}
-
-void Mips64Assembler::LdW(VectorRegister wd, GpuRegister rs, int offset) {
- CHECK(IsInt<12>(offset)) << offset;
- CHECK_ALIGNED(offset, kMips64WordSize);
- EmitMsaMI10((offset >> TIMES_4) & kMsaS10Mask, rs, wd, 0x8, 0x2);
-}
-
-void Mips64Assembler::LdD(VectorRegister wd, GpuRegister rs, int offset) {
- CHECK(IsInt<13>(offset)) << offset;
- CHECK_ALIGNED(offset, kMips64DoublewordSize);
- EmitMsaMI10((offset >> TIMES_8) & kMsaS10Mask, rs, wd, 0x8, 0x3);
-}
-
-void Mips64Assembler::StB(VectorRegister wd, GpuRegister rs, int offset) {
- CHECK(IsInt<10>(offset)) << offset;
- EmitMsaMI10(offset & kMsaS10Mask, rs, wd, 0x9, 0x0);
-}
-
-void Mips64Assembler::StH(VectorRegister wd, GpuRegister rs, int offset) {
- CHECK(IsInt<11>(offset)) << offset;
- CHECK_ALIGNED(offset, kMips64HalfwordSize);
- EmitMsaMI10((offset >> TIMES_2) & kMsaS10Mask, rs, wd, 0x9, 0x1);
-}
-
-void Mips64Assembler::StW(VectorRegister wd, GpuRegister rs, int offset) {
- CHECK(IsInt<12>(offset)) << offset;
- CHECK_ALIGNED(offset, kMips64WordSize);
- EmitMsaMI10((offset >> TIMES_4) & kMsaS10Mask, rs, wd, 0x9, 0x2);
-}
-
-void Mips64Assembler::StD(VectorRegister wd, GpuRegister rs, int offset) {
- CHECK(IsInt<13>(offset)) << offset;
- CHECK_ALIGNED(offset, kMips64DoublewordSize);
- EmitMsaMI10((offset >> TIMES_8) & kMsaS10Mask, rs, wd, 0x9, 0x3);
-}
-
void Mips64Assembler::LoadConst32(GpuRegister rd, int32_t value) {
TemplateLoadConst32(this, rd, value);
}
diff --git a/compiler/utils/mips64/assembler_mips64.h b/compiler/utils/mips64/assembler_mips64.h
index 471fdf2e9e..b98db65fbd 100644
--- a/compiler/utils/mips64/assembler_mips64.h
+++ b/compiler/utils/mips64/assembler_mips64.h
@@ -266,7 +266,6 @@ void TemplateLoadConst64(Asm* a, Rtype rd, Vtype value) {
}
}
-static constexpr size_t kMips64HalfwordSize = 2;
static constexpr size_t kMips64WordSize = 4;
static constexpr size_t kMips64DoublewordSize = 8;
@@ -645,101 +644,6 @@ class Mips64Assembler FINAL : public Assembler, public JNIMacroAssembler<Pointer
void Clear(GpuRegister rd);
void Not(GpuRegister rd, GpuRegister rs);
- // MSA instructions.
- void AndV(VectorRegister wd, VectorRegister ws, VectorRegister wt);
- void OrV(VectorRegister wd, VectorRegister ws, VectorRegister wt);
- void NorV(VectorRegister wd, VectorRegister ws, VectorRegister wt);
- void XorV(VectorRegister wd, VectorRegister ws, VectorRegister wt);
-
- void AddvB(VectorRegister wd, VectorRegister ws, VectorRegister wt);
- void AddvH(VectorRegister wd, VectorRegister ws, VectorRegister wt);
- void AddvW(VectorRegister wd, VectorRegister ws, VectorRegister wt);
- void AddvD(VectorRegister wd, VectorRegister ws, VectorRegister wt);
- void SubvB(VectorRegister wd, VectorRegister ws, VectorRegister wt);
- 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 MulvB(VectorRegister wd, VectorRegister ws, VectorRegister wt);
- void MulvH(VectorRegister wd, VectorRegister ws, VectorRegister wt);
- void MulvW(VectorRegister wd, VectorRegister ws, VectorRegister wt);
- void MulvD(VectorRegister wd, VectorRegister ws, VectorRegister wt);
- void Div_sB(VectorRegister wd, VectorRegister ws, VectorRegister wt);
- void Div_sH(VectorRegister wd, VectorRegister ws, VectorRegister wt);
- void Div_sW(VectorRegister wd, VectorRegister ws, VectorRegister wt);
- void Div_sD(VectorRegister wd, VectorRegister ws, VectorRegister wt);
- void Div_uB(VectorRegister wd, VectorRegister ws, VectorRegister wt);
- void Div_uH(VectorRegister wd, VectorRegister ws, VectorRegister wt);
- void Div_uW(VectorRegister wd, VectorRegister ws, VectorRegister wt);
- void Div_uD(VectorRegister wd, VectorRegister ws, VectorRegister wt);
- void Mod_sB(VectorRegister wd, VectorRegister ws, VectorRegister wt);
- void Mod_sH(VectorRegister wd, VectorRegister ws, VectorRegister wt);
- void Mod_sW(VectorRegister wd, VectorRegister ws, VectorRegister wt);
- void Mod_sD(VectorRegister wd, VectorRegister ws, VectorRegister wt);
- void Mod_uB(VectorRegister wd, VectorRegister ws, VectorRegister wt);
- void Mod_uH(VectorRegister wd, VectorRegister ws, VectorRegister wt);
- void Mod_uW(VectorRegister wd, VectorRegister ws, VectorRegister wt);
- void Mod_uD(VectorRegister wd, VectorRegister ws, VectorRegister wt);
-
- void FaddW(VectorRegister wd, VectorRegister ws, VectorRegister wt);
- void FaddD(VectorRegister wd, VectorRegister ws, VectorRegister wt);
- void FsubW(VectorRegister wd, VectorRegister ws, VectorRegister wt);
- void FsubD(VectorRegister wd, VectorRegister ws, VectorRegister wt);
- void FmulW(VectorRegister wd, VectorRegister ws, VectorRegister wt);
- void FmulD(VectorRegister wd, VectorRegister ws, VectorRegister wt);
- void FdivW(VectorRegister wd, VectorRegister ws, VectorRegister wt);
- void FdivD(VectorRegister wd, VectorRegister ws, VectorRegister wt);
-
- void Ffint_sW(VectorRegister wd, VectorRegister ws);
- void Ffint_sD(VectorRegister wd, VectorRegister ws);
- void Ftint_sW(VectorRegister wd, VectorRegister ws);
- void Ftint_sD(VectorRegister wd, VectorRegister ws);
-
- void SllB(VectorRegister wd, VectorRegister ws, VectorRegister wt);
- void SllH(VectorRegister wd, VectorRegister ws, VectorRegister wt);
- void SllW(VectorRegister wd, VectorRegister ws, VectorRegister wt);
- void SllD(VectorRegister wd, VectorRegister ws, VectorRegister wt);
- void SraB(VectorRegister wd, VectorRegister ws, VectorRegister wt);
- void SraH(VectorRegister wd, VectorRegister ws, VectorRegister wt);
- void SraW(VectorRegister wd, VectorRegister ws, VectorRegister wt);
- void SraD(VectorRegister wd, VectorRegister ws, VectorRegister wt);
- void SrlB(VectorRegister wd, VectorRegister ws, VectorRegister wt);
- void SrlH(VectorRegister wd, VectorRegister ws, VectorRegister wt);
- void SrlW(VectorRegister wd, VectorRegister ws, VectorRegister wt);
- void SrlD(VectorRegister wd, VectorRegister ws, VectorRegister wt);
-
- // Immediate shift instructions, where shamtN denotes shift amount (must be between 0 and 2^N-1).
- void SlliB(VectorRegister wd, VectorRegister ws, int shamt3);
- void SlliH(VectorRegister wd, VectorRegister ws, int shamt4);
- void SlliW(VectorRegister wd, VectorRegister ws, int shamt5);
- void SlliD(VectorRegister wd, VectorRegister ws, int shamt6);
- void SraiB(VectorRegister wd, VectorRegister ws, int shamt3);
- void SraiH(VectorRegister wd, VectorRegister ws, int shamt4);
- void SraiW(VectorRegister wd, VectorRegister ws, int shamt5);
- void SraiD(VectorRegister wd, VectorRegister ws, int shamt6);
- void SrliB(VectorRegister wd, VectorRegister ws, int shamt3);
- void SrliH(VectorRegister wd, VectorRegister ws, int shamt4);
- void SrliW(VectorRegister wd, VectorRegister ws, int shamt5);
- void SrliD(VectorRegister wd, VectorRegister ws, int shamt6);
-
- void MoveV(VectorRegister wd, VectorRegister ws);
- void SplatiB(VectorRegister wd, VectorRegister ws, int n4);
- void SplatiH(VectorRegister wd, VectorRegister ws, int n3);
- void SplatiW(VectorRegister wd, VectorRegister ws, int n2);
- void SplatiD(VectorRegister wd, VectorRegister ws, int n1);
- void FillB(VectorRegister wd, GpuRegister rs);
- void FillH(VectorRegister wd, GpuRegister rs);
- void FillW(VectorRegister wd, GpuRegister rs);
- void FillD(VectorRegister wd, GpuRegister rs);
-
- void LdB(VectorRegister wd, GpuRegister rs, int offset);
- void LdH(VectorRegister wd, GpuRegister rs, int offset);
- void LdW(VectorRegister wd, GpuRegister rs, int offset);
- void LdD(VectorRegister wd, GpuRegister rs, int offset);
- void StB(VectorRegister wd, GpuRegister rs, int offset);
- void StH(VectorRegister wd, GpuRegister rs, int offset);
- void StW(VectorRegister wd, GpuRegister rs, int offset);
- void StD(VectorRegister wd, GpuRegister rs, int offset);
-
// Higher level composite instructions.
int InstrCountForLoadReplicatedConst32(int64_t);
void LoadConst32(GpuRegister rd, int32_t value);
@@ -1476,17 +1380,6 @@ class Mips64Assembler FINAL : public Assembler, public JNIMacroAssembler<Pointer
void EmitFR(int opcode, int fmt, FpuRegister ft, FpuRegister fs, FpuRegister fd, int funct);
void EmitFI(int opcode, int fmt, FpuRegister rt, uint16_t imm);
void EmitBcondc(BranchCondition cond, GpuRegister rs, GpuRegister rt, uint32_t imm16_21);
- void EmitMsa3R(int operation,
- int df,
- VectorRegister wt,
- VectorRegister ws,
- VectorRegister wd,
- int minor_opcode);
- void EmitMsaBIT(int operation, int df_m, VectorRegister ws, VectorRegister wd, int minor_opcode);
- void EmitMsaELM(int operation, int df_n, VectorRegister ws, VectorRegister wd, int minor_opcode);
- void EmitMsaMI10(int s10, GpuRegister rs, VectorRegister wd, int minor_opcode, int df);
- void EmitMsa2R(int operation, int df, VectorRegister ws, VectorRegister wd, int minor_opcode);
- void EmitMsa2RF(int operation, int df, VectorRegister ws, VectorRegister wd, int minor_opcode);
void Buncond(Mips64Label* label);
void Bcond(Mips64Label* label,
diff --git a/compiler/utils/mips64/assembler_mips64_test.cc b/compiler/utils/mips64/assembler_mips64_test.cc
index 87a1823d20..879807ac32 100644
--- a/compiler/utils/mips64/assembler_mips64_test.cc
+++ b/compiler/utils/mips64/assembler_mips64_test.cc
@@ -37,14 +37,12 @@ struct MIPS64CpuRegisterCompare {
class AssemblerMIPS64Test : public AssemblerTest<mips64::Mips64Assembler,
mips64::GpuRegister,
mips64::FpuRegister,
- uint32_t,
- mips64::VectorRegister> {
+ uint32_t> {
public:
typedef AssemblerTest<mips64::Mips64Assembler,
mips64::GpuRegister,
mips64::FpuRegister,
- uint32_t,
- mips64::VectorRegister> Base;
+ uint32_t> Base;
protected:
// Get the typically used name for this architecture, e.g., aarch64, x86-64, ...
@@ -62,7 +60,7 @@ class AssemblerMIPS64Test : public AssemblerTest<mips64::Mips64Assembler,
// (and MIPS32R6) with the GNU assembler don't have correct final offsets in PC-relative
// branches in the .text section and so they require a relocation pass (there's a relocation
// section, .rela.text, that has the needed info to fix up the branches).
- return " -march=mips64r6 -mmsa -Wa,--no-warn -Wl,-Ttext=0 -Wl,-e0 -nostdlib";
+ return " -march=mips64r6 -Wa,--no-warn -Wl,-Ttext=0 -Wl,-e0 -nostdlib";
}
void Pad(std::vector<uint8_t>& data) OVERRIDE {
@@ -178,39 +176,6 @@ class AssemblerMIPS64Test : public AssemblerTest<mips64::Mips64Assembler,
fp_registers_.push_back(new mips64::FpuRegister(mips64::F29));
fp_registers_.push_back(new mips64::FpuRegister(mips64::F30));
fp_registers_.push_back(new mips64::FpuRegister(mips64::F31));
-
- vec_registers_.push_back(new mips64::VectorRegister(mips64::W0));
- vec_registers_.push_back(new mips64::VectorRegister(mips64::W1));
- vec_registers_.push_back(new mips64::VectorRegister(mips64::W2));
- vec_registers_.push_back(new mips64::VectorRegister(mips64::W3));
- vec_registers_.push_back(new mips64::VectorRegister(mips64::W4));
- vec_registers_.push_back(new mips64::VectorRegister(mips64::W5));
- vec_registers_.push_back(new mips64::VectorRegister(mips64::W6));
- vec_registers_.push_back(new mips64::VectorRegister(mips64::W7));
- vec_registers_.push_back(new mips64::VectorRegister(mips64::W8));
- vec_registers_.push_back(new mips64::VectorRegister(mips64::W9));
- vec_registers_.push_back(new mips64::VectorRegister(mips64::W10));
- vec_registers_.push_back(new mips64::VectorRegister(mips64::W11));
- vec_registers_.push_back(new mips64::VectorRegister(mips64::W12));
- vec_registers_.push_back(new mips64::VectorRegister(mips64::W13));
- vec_registers_.push_back(new mips64::VectorRegister(mips64::W14));
- vec_registers_.push_back(new mips64::VectorRegister(mips64::W15));
- vec_registers_.push_back(new mips64::VectorRegister(mips64::W16));
- vec_registers_.push_back(new mips64::VectorRegister(mips64::W17));
- vec_registers_.push_back(new mips64::VectorRegister(mips64::W18));
- vec_registers_.push_back(new mips64::VectorRegister(mips64::W19));
- vec_registers_.push_back(new mips64::VectorRegister(mips64::W20));
- vec_registers_.push_back(new mips64::VectorRegister(mips64::W21));
- vec_registers_.push_back(new mips64::VectorRegister(mips64::W22));
- vec_registers_.push_back(new mips64::VectorRegister(mips64::W23));
- vec_registers_.push_back(new mips64::VectorRegister(mips64::W24));
- vec_registers_.push_back(new mips64::VectorRegister(mips64::W25));
- vec_registers_.push_back(new mips64::VectorRegister(mips64::W26));
- vec_registers_.push_back(new mips64::VectorRegister(mips64::W27));
- vec_registers_.push_back(new mips64::VectorRegister(mips64::W28));
- vec_registers_.push_back(new mips64::VectorRegister(mips64::W29));
- vec_registers_.push_back(new mips64::VectorRegister(mips64::W30));
- vec_registers_.push_back(new mips64::VectorRegister(mips64::W31));
}
}
@@ -228,10 +193,6 @@ class AssemblerMIPS64Test : public AssemblerTest<mips64::Mips64Assembler,
return fp_registers_;
}
- std::vector<mips64::VectorRegister*> GetVectorRegisters() OVERRIDE {
- return vec_registers_;
- }
-
uint32_t CreateImmediate(int64_t imm_value) OVERRIDE {
return imm_value;
}
@@ -311,7 +272,6 @@ class AssemblerMIPS64Test : public AssemblerTest<mips64::Mips64Assembler,
std::map<mips64::GpuRegister, std::string, MIPS64CpuRegisterCompare> secondary_register_names_;
std::vector<mips64::FpuRegister*> fp_registers_;
- std::vector<mips64::VectorRegister*> vec_registers_;
};
@@ -2490,370 +2450,6 @@ TEST_F(AssemblerMIPS64Test, LoadConst64) {
EXPECT_EQ(tester.GetPathsCovered(), art::mips64::kLoadConst64PathAllPaths);
}
-// MSA instructions.
-
-TEST_F(AssemblerMIPS64Test, AndV) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::AndV, "and.v ${reg1}, ${reg2}, ${reg3}"), "and.v");
-}
-
-TEST_F(AssemblerMIPS64Test, OrV) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::OrV, "or.v ${reg1}, ${reg2}, ${reg3}"), "or.v");
-}
-
-TEST_F(AssemblerMIPS64Test, NorV) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::NorV, "nor.v ${reg1}, ${reg2}, ${reg3}"), "nor.v");
-}
-
-TEST_F(AssemblerMIPS64Test, XorV) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::XorV, "xor.v ${reg1}, ${reg2}, ${reg3}"), "xor.v");
-}
-
-TEST_F(AssemblerMIPS64Test, AddvB) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::AddvB, "addv.b ${reg1}, ${reg2}, ${reg3}"),
- "addv.b");
-}
-
-TEST_F(AssemblerMIPS64Test, AddvH) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::AddvH, "addv.h ${reg1}, ${reg2}, ${reg3}"),
- "addv.h");
-}
-
-TEST_F(AssemblerMIPS64Test, AddvW) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::AddvW, "addv.w ${reg1}, ${reg2}, ${reg3}"),
- "addv.w");
-}
-
-TEST_F(AssemblerMIPS64Test, AddvD) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::AddvD, "addv.d ${reg1}, ${reg2}, ${reg3}"),
- "addv.d");
-}
-
-TEST_F(AssemblerMIPS64Test, SubvB) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::SubvB, "subv.b ${reg1}, ${reg2}, ${reg3}"),
- "subv.b");
-}
-
-TEST_F(AssemblerMIPS64Test, SubvH) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::SubvH, "subv.h ${reg1}, ${reg2}, ${reg3}"),
- "subv.h");
-}
-
-TEST_F(AssemblerMIPS64Test, SubvW) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::SubvW, "subv.w ${reg1}, ${reg2}, ${reg3}"),
- "subv.w");
-}
-
-TEST_F(AssemblerMIPS64Test, SubvD) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::SubvD, "subv.d ${reg1}, ${reg2}, ${reg3}"),
- "subv.d");
-}
-
-TEST_F(AssemblerMIPS64Test, MulvB) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::MulvB, "mulv.b ${reg1}, ${reg2}, ${reg3}"),
- "mulv.b");
-}
-
-TEST_F(AssemblerMIPS64Test, MulvH) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::MulvH, "mulv.h ${reg1}, ${reg2}, ${reg3}"),
- "mulv.h");
-}
-
-TEST_F(AssemblerMIPS64Test, MulvW) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::MulvW, "mulv.w ${reg1}, ${reg2}, ${reg3}"),
- "mulv.w");
-}
-
-TEST_F(AssemblerMIPS64Test, MulvD) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::MulvD, "mulv.d ${reg1}, ${reg2}, ${reg3}"),
- "mulv.d");
-}
-
-TEST_F(AssemblerMIPS64Test, Div_sB) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::Div_sB, "div_s.b ${reg1}, ${reg2}, ${reg3}"),
- "div_s.b");
-}
-
-TEST_F(AssemblerMIPS64Test, Div_sH) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::Div_sH, "div_s.h ${reg1}, ${reg2}, ${reg3}"),
- "div_s.h");
-}
-
-TEST_F(AssemblerMIPS64Test, Div_sW) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::Div_sW, "div_s.w ${reg1}, ${reg2}, ${reg3}"),
- "div_s.w");
-}
-
-TEST_F(AssemblerMIPS64Test, Div_sD) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::Div_sD, "div_s.d ${reg1}, ${reg2}, ${reg3}"),
- "div_s.d");
-}
-
-TEST_F(AssemblerMIPS64Test, Div_uB) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::Div_uB, "div_u.b ${reg1}, ${reg2}, ${reg3}"),
- "div_u.b");
-}
-
-TEST_F(AssemblerMIPS64Test, Div_uH) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::Div_uH, "div_u.h ${reg1}, ${reg2}, ${reg3}"),
- "div_u.h");
-}
-
-TEST_F(AssemblerMIPS64Test, Div_uW) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::Div_uW, "div_u.w ${reg1}, ${reg2}, ${reg3}"),
- "div_u.w");
-}
-
-TEST_F(AssemblerMIPS64Test, Div_uD) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::Div_uD, "div_u.d ${reg1}, ${reg2}, ${reg3}"),
- "div_u.d");
-}
-
-TEST_F(AssemblerMIPS64Test, Mod_sB) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::Mod_sB, "mod_s.b ${reg1}, ${reg2}, ${reg3}"),
- "mod_s.b");
-}
-
-TEST_F(AssemblerMIPS64Test, Mod_sH) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::Mod_sH, "mod_s.h ${reg1}, ${reg2}, ${reg3}"),
- "mod_s.h");
-}
-
-TEST_F(AssemblerMIPS64Test, Mod_sW) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::Mod_sW, "mod_s.w ${reg1}, ${reg2}, ${reg3}"),
- "mod_s.w");
-}
-
-TEST_F(AssemblerMIPS64Test, Mod_sD) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::Mod_sD, "mod_s.d ${reg1}, ${reg2}, ${reg3}"),
- "mod_s.d");
-}
-
-TEST_F(AssemblerMIPS64Test, Mod_uB) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::Mod_uB, "mod_u.b ${reg1}, ${reg2}, ${reg3}"),
- "mod_u.b");
-}
-
-TEST_F(AssemblerMIPS64Test, Mod_uH) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::Mod_uH, "mod_u.h ${reg1}, ${reg2}, ${reg3}"),
- "mod_u.h");
-}
-
-TEST_F(AssemblerMIPS64Test, Mod_uW) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::Mod_uW, "mod_u.w ${reg1}, ${reg2}, ${reg3}"),
- "mod_u.w");
-}
-
-TEST_F(AssemblerMIPS64Test, Mod_uD) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::Mod_uD, "mod_u.d ${reg1}, ${reg2}, ${reg3}"),
- "mod_u.d");
-}
-
-TEST_F(AssemblerMIPS64Test, FaddW) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::FaddW, "fadd.w ${reg1}, ${reg2}, ${reg3}"),
- "fadd.w");
-}
-
-TEST_F(AssemblerMIPS64Test, FaddD) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::FaddD, "fadd.d ${reg1}, ${reg2}, ${reg3}"),
- "fadd.d");
-}
-
-TEST_F(AssemblerMIPS64Test, FsubW) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::FsubW, "fsub.w ${reg1}, ${reg2}, ${reg3}"),
- "fsub.w");
-}
-
-TEST_F(AssemblerMIPS64Test, FsubD) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::FsubD, "fsub.d ${reg1}, ${reg2}, ${reg3}"),
- "fsub.d");
-}
-
-TEST_F(AssemblerMIPS64Test, FmulW) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::FmulW, "fmul.w ${reg1}, ${reg2}, ${reg3}"),
- "fmul.w");
-}
-
-TEST_F(AssemblerMIPS64Test, FmulD) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::FmulD, "fmul.d ${reg1}, ${reg2}, ${reg3}"),
- "fmul.d");
-}
-
-TEST_F(AssemblerMIPS64Test, FdivW) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::FdivW, "fdiv.w ${reg1}, ${reg2}, ${reg3}"),
- "fdiv.w");
-}
-
-TEST_F(AssemblerMIPS64Test, FdivD) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::FdivD, "fdiv.d ${reg1}, ${reg2}, ${reg3}"),
- "fdiv.d");
-}
-
-TEST_F(AssemblerMIPS64Test, Ffint_sW) {
- DriverStr(RepeatVV(&mips64::Mips64Assembler::Ffint_sW, "ffint_s.w ${reg1}, ${reg2}"),
- "ffint_s.w");
-}
-
-TEST_F(AssemblerMIPS64Test, Ffint_sD) {
- DriverStr(RepeatVV(&mips64::Mips64Assembler::Ffint_sD, "ffint_s.d ${reg1}, ${reg2}"),
- "ffint_s.d");
-}
-
-TEST_F(AssemblerMIPS64Test, Ftint_sW) {
- DriverStr(RepeatVV(&mips64::Mips64Assembler::Ftint_sW, "ftint_s.w ${reg1}, ${reg2}"),
- "ftint_s.w");
-}
-
-TEST_F(AssemblerMIPS64Test, Ftint_sD) {
- DriverStr(RepeatVV(&mips64::Mips64Assembler::Ftint_sD, "ftint_s.d ${reg1}, ${reg2}"),
- "ftint_s.d");
-}
-
-TEST_F(AssemblerMIPS64Test, SllB) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::SllB, "sll.b ${reg1}, ${reg2}, ${reg3}"), "sll.b");
-}
-
-TEST_F(AssemblerMIPS64Test, SllH) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::SllH, "sll.h ${reg1}, ${reg2}, ${reg3}"), "sll.h");
-}
-
-TEST_F(AssemblerMIPS64Test, SllW) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::SllW, "sll.w ${reg1}, ${reg2}, ${reg3}"), "sll.w");
-}
-
-TEST_F(AssemblerMIPS64Test, SllD) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::SllD, "sll.d ${reg1}, ${reg2}, ${reg3}"), "sll.d");
-}
-
-TEST_F(AssemblerMIPS64Test, SraB) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::SraB, "sra.b ${reg1}, ${reg2}, ${reg3}"), "sra.b");
-}
-
-TEST_F(AssemblerMIPS64Test, SraH) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::SraH, "sra.h ${reg1}, ${reg2}, ${reg3}"), "sra.h");
-}
-
-TEST_F(AssemblerMIPS64Test, SraW) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::SraW, "sra.w ${reg1}, ${reg2}, ${reg3}"), "sra.w");
-}
-
-TEST_F(AssemblerMIPS64Test, SraD) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::SraD, "sra.d ${reg1}, ${reg2}, ${reg3}"), "sra.d");
-}
-
-TEST_F(AssemblerMIPS64Test, SrlB) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::SrlB, "srl.b ${reg1}, ${reg2}, ${reg3}"), "srl.b");
-}
-
-TEST_F(AssemblerMIPS64Test, SrlH) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::SrlH, "srl.h ${reg1}, ${reg2}, ${reg3}"), "srl.h");
-}
-
-TEST_F(AssemblerMIPS64Test, SrlW) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::SrlW, "srl.w ${reg1}, ${reg2}, ${reg3}"), "srl.w");
-}
-
-TEST_F(AssemblerMIPS64Test, SrlD) {
- DriverStr(RepeatVVV(&mips64::Mips64Assembler::SrlD, "srl.d ${reg1}, ${reg2}, ${reg3}"), "srl.d");
-}
-
-TEST_F(AssemblerMIPS64Test, SlliB) {
- DriverStr(RepeatVVIb(&mips64::Mips64Assembler::SlliB, 3, "slli.b ${reg1}, ${reg2}, {imm}"),
- "slli.b");
-}
-
-TEST_F(AssemblerMIPS64Test, SlliH) {
- DriverStr(RepeatVVIb(&mips64::Mips64Assembler::SlliH, 4, "slli.h ${reg1}, ${reg2}, {imm}"),
- "slli.h");
-}
-
-TEST_F(AssemblerMIPS64Test, SlliW) {
- DriverStr(RepeatVVIb(&mips64::Mips64Assembler::SlliW, 5, "slli.w ${reg1}, ${reg2}, {imm}"),
- "slli.w");
-}
-
-TEST_F(AssemblerMIPS64Test, SlliD) {
- DriverStr(RepeatVVIb(&mips64::Mips64Assembler::SlliD, 6, "slli.d ${reg1}, ${reg2}, {imm}"),
- "slli.d");
-}
-
-TEST_F(AssemblerMIPS64Test, MoveV) {
- DriverStr(RepeatVV(&mips64::Mips64Assembler::MoveV, "move.v ${reg1}, ${reg2}"), "move.v");
-}
-
-TEST_F(AssemblerMIPS64Test, SplatiB) {
- DriverStr(RepeatVVIb(&mips64::Mips64Assembler::SplatiB, 4, "splati.b ${reg1}, ${reg2}[{imm}]"),
- "splati.b");
-}
-
-TEST_F(AssemblerMIPS64Test, SplatiH) {
- DriverStr(RepeatVVIb(&mips64::Mips64Assembler::SplatiH, 3, "splati.h ${reg1}, ${reg2}[{imm}]"),
- "splati.h");
-}
-
-TEST_F(AssemblerMIPS64Test, SplatiW) {
- DriverStr(RepeatVVIb(&mips64::Mips64Assembler::SplatiW, 2, "splati.w ${reg1}, ${reg2}[{imm}]"),
- "splati.w");
-}
-
-TEST_F(AssemblerMIPS64Test, SplatiD) {
- DriverStr(RepeatVVIb(&mips64::Mips64Assembler::SplatiD, 1, "splati.d ${reg1}, ${reg2}[{imm}]"),
- "splati.d");
-}
-
-TEST_F(AssemblerMIPS64Test, FillB) {
- DriverStr(RepeatVR(&mips64::Mips64Assembler::FillB, "fill.b ${reg1}, ${reg2}"), "fill.b");
-}
-
-TEST_F(AssemblerMIPS64Test, FillH) {
- DriverStr(RepeatVR(&mips64::Mips64Assembler::FillH, "fill.h ${reg1}, ${reg2}"), "fill.h");
-}
-
-TEST_F(AssemblerMIPS64Test, FillW) {
- DriverStr(RepeatVR(&mips64::Mips64Assembler::FillW, "fill.w ${reg1}, ${reg2}"), "fill.w");
-}
-
-TEST_F(AssemblerMIPS64Test, FillD) {
- DriverStr(RepeatVR(&mips64::Mips64Assembler::FillD, "fill.d ${reg1}, ${reg2}"), "fill.d");
-}
-
-TEST_F(AssemblerMIPS64Test, LdB) {
- DriverStr(RepeatVRIb(&mips64::Mips64Assembler::LdB, -10, "ld.b ${reg1}, {imm}(${reg2})"), "ld.b");
-}
-
-TEST_F(AssemblerMIPS64Test, LdH) {
- DriverStr(RepeatVRIb(&mips64::Mips64Assembler::LdH, -10, "ld.h ${reg1}, {imm}(${reg2})", 0, 2),
- "ld.h");
-}
-
-TEST_F(AssemblerMIPS64Test, LdW) {
- DriverStr(RepeatVRIb(&mips64::Mips64Assembler::LdW, -10, "ld.w ${reg1}, {imm}(${reg2})", 0, 4),
- "ld.w");
-}
-
-TEST_F(AssemblerMIPS64Test, LdD) {
- DriverStr(RepeatVRIb(&mips64::Mips64Assembler::LdD, -10, "ld.d ${reg1}, {imm}(${reg2})", 0, 8),
- "ld.d");
-}
-
-TEST_F(AssemblerMIPS64Test, StB) {
- DriverStr(RepeatVRIb(&mips64::Mips64Assembler::StB, -10, "st.b ${reg1}, {imm}(${reg2})"), "st.b");
-}
-
-TEST_F(AssemblerMIPS64Test, StH) {
- DriverStr(RepeatVRIb(&mips64::Mips64Assembler::StH, -10, "st.h ${reg1}, {imm}(${reg2})", 0, 2),
- "st.h");
-}
-
-TEST_F(AssemblerMIPS64Test, StW) {
- DriverStr(RepeatVRIb(&mips64::Mips64Assembler::StW, -10, "st.w ${reg1}, {imm}(${reg2})", 0, 4),
- "st.w");
-}
-
-TEST_F(AssemblerMIPS64Test, StD) {
- DriverStr(RepeatVRIb(&mips64::Mips64Assembler::StD, -10, "st.d ${reg1}, {imm}(${reg2})", 0, 8),
- "st.d");
-}
-
#undef __
} // namespace art
diff --git a/compiler/utils/mips64/constants_mips64.h b/compiler/utils/mips64/constants_mips64.h
index 5ae9c73589..f57498d34f 100644
--- a/compiler/utils/mips64/constants_mips64.h
+++ b/compiler/utils/mips64/constants_mips64.h
@@ -51,35 +51,8 @@ enum InstructionFields {
kFdShift = 6,
kFdBits = 5,
- kMsaOperationShift = 23,
- kMsaELMOperationShift = 22,
- kMsa2ROperationShift = 18,
- kMsa2RFOperationShift = 17,
- kDfShift = 21,
- kDfMShift = 16,
- kDf2RShift = 16,
- kDfNShift = 16,
- kWtShift = 16,
- kWtBits = 5,
- kWsShift = 11,
- kWsBits = 5,
- kWdShift = 6,
- kWdBits = 5,
- kS10Shift = 16,
- kS10MinorShift = 2,
-
kBranchOffsetMask = 0x0000ffff,
kJumpOffsetMask = 0x03ffffff,
- kMsaMajorOpcode = 0x1e,
- kMsaDfMByteMask = 0x70,
- kMsaDfMHalfwordMask = 0x60,
- kMsaDfMWordMask = 0x40,
- kMsaDfMDoublewordMask = 0x00,
- kMsaDfNByteMask = 0x00,
- kMsaDfNHalfwordMask = 0x20,
- kMsaDfNWordMask = 0x30,
- kMsaDfNDoublewordMask = 0x38,
- kMsaS10Mask = 0x3ff,
};
enum ScaleFactor {
diff --git a/compiler/utils/x86/assembler_x86.cc b/compiler/utils/x86/assembler_x86.cc
index 0a6ceefe69..5307dc09d9 100644
--- a/compiler/utils/x86/assembler_x86.cc
+++ b/compiler/utils/x86/assembler_x86.cc
@@ -1221,6 +1221,43 @@ void X86Assembler::por(XmmRegister dst, XmmRegister src) {
}
+void X86Assembler::pcmpeqb(XmmRegister dst, XmmRegister src) {
+ AssemblerBuffer::EnsureCapacity ensured(&buffer_);
+ EmitUint8(0x66);
+ EmitUint8(0x0F);
+ EmitUint8(0x74);
+ EmitXmmRegisterOperand(dst, src);
+}
+
+
+void X86Assembler::pcmpeqw(XmmRegister dst, XmmRegister src) {
+ AssemblerBuffer::EnsureCapacity ensured(&buffer_);
+ EmitUint8(0x66);
+ EmitUint8(0x0F);
+ EmitUint8(0x75);
+ EmitXmmRegisterOperand(dst, src);
+}
+
+
+void X86Assembler::pcmpeqd(XmmRegister dst, XmmRegister src) {
+ AssemblerBuffer::EnsureCapacity ensured(&buffer_);
+ EmitUint8(0x66);
+ EmitUint8(0x0F);
+ EmitUint8(0x76);
+ EmitXmmRegisterOperand(dst, src);
+}
+
+
+void X86Assembler::pcmpeqq(XmmRegister dst, XmmRegister src) {
+ AssemblerBuffer::EnsureCapacity ensured(&buffer_);
+ EmitUint8(0x66);
+ EmitUint8(0x0F);
+ EmitUint8(0x38);
+ EmitUint8(0x29);
+ EmitXmmRegisterOperand(dst, src);
+}
+
+
void X86Assembler::shufpd(XmmRegister dst, XmmRegister src, const Immediate& imm) {
AssemblerBuffer::EnsureCapacity ensured(&buffer_);
EmitUint8(0x66);
diff --git a/compiler/utils/x86/assembler_x86.h b/compiler/utils/x86/assembler_x86.h
index 9d7ca77a56..f52cf16c8b 100644
--- a/compiler/utils/x86/assembler_x86.h
+++ b/compiler/utils/x86/assembler_x86.h
@@ -495,6 +495,11 @@ class X86Assembler FINAL : public Assembler {
void orps(XmmRegister dst, XmmRegister src);
void por(XmmRegister dst, XmmRegister src);
+ void pcmpeqb(XmmRegister dst, XmmRegister src);
+ void pcmpeqw(XmmRegister dst, XmmRegister src);
+ void pcmpeqd(XmmRegister dst, XmmRegister src);
+ void pcmpeqq(XmmRegister dst, XmmRegister src);
+
void shufpd(XmmRegister dst, XmmRegister src, const Immediate& imm);
void shufps(XmmRegister dst, XmmRegister src, const Immediate& imm);
void pshufd(XmmRegister dst, XmmRegister src, const Immediate& imm);
diff --git a/compiler/utils/x86/assembler_x86_test.cc b/compiler/utils/x86/assembler_x86_test.cc
index 52c7507bc4..23049079e0 100644
--- a/compiler/utils/x86/assembler_x86_test.cc
+++ b/compiler/utils/x86/assembler_x86_test.cc
@@ -605,6 +605,22 @@ TEST_F(AssemblerX86Test, POr) {
DriverStr(RepeatFF(&x86::X86Assembler::por, "por %{reg2}, %{reg1}"), "por");
}
+TEST_F(AssemblerX86Test, PCmpeqB) {
+ DriverStr(RepeatFF(&x86::X86Assembler::pcmpeqb, "pcmpeqb %{reg2}, %{reg1}"), "cmpeqb");
+}
+
+TEST_F(AssemblerX86Test, PCmpeqW) {
+ DriverStr(RepeatFF(&x86::X86Assembler::pcmpeqw, "pcmpeqw %{reg2}, %{reg1}"), "cmpeqw");
+}
+
+TEST_F(AssemblerX86Test, PCmpeqD) {
+ DriverStr(RepeatFF(&x86::X86Assembler::pcmpeqd, "pcmpeqd %{reg2}, %{reg1}"), "cmpeqd");
+}
+
+TEST_F(AssemblerX86Test, PCmpeqQ) {
+ DriverStr(RepeatFF(&x86::X86Assembler::pcmpeqq, "pcmpeqq %{reg2}, %{reg1}"), "cmpeqq");
+}
+
TEST_F(AssemblerX86Test, ShufPS) {
DriverStr(RepeatFFI(&x86::X86Assembler::shufps, 1, "shufps ${imm}, %{reg2}, %{reg1}"), "shufps");
}
diff --git a/compiler/utils/x86_64/assembler_x86_64.cc b/compiler/utils/x86_64/assembler_x86_64.cc
index d7fed5b7a3..d20a6965c3 100644
--- a/compiler/utils/x86_64/assembler_x86_64.cc
+++ b/compiler/utils/x86_64/assembler_x86_64.cc
@@ -1427,6 +1427,43 @@ void X86_64Assembler::por(XmmRegister dst, XmmRegister src) {
EmitXmmRegisterOperand(dst.LowBits(), src);
}
+void X86_64Assembler::pcmpeqb(XmmRegister dst, XmmRegister src) {
+ AssemblerBuffer::EnsureCapacity ensured(&buffer_);
+ EmitUint8(0x66);
+ EmitOptionalRex32(dst, src);
+ EmitUint8(0x0F);
+ EmitUint8(0x74);
+ EmitXmmRegisterOperand(dst.LowBits(), src);
+}
+
+void X86_64Assembler::pcmpeqw(XmmRegister dst, XmmRegister src) {
+ AssemblerBuffer::EnsureCapacity ensured(&buffer_);
+ EmitUint8(0x66);
+ EmitOptionalRex32(dst, src);
+ EmitUint8(0x0F);
+ EmitUint8(0x75);
+ EmitXmmRegisterOperand(dst.LowBits(), src);
+}
+
+void X86_64Assembler::pcmpeqd(XmmRegister dst, XmmRegister src) {
+ AssemblerBuffer::EnsureCapacity ensured(&buffer_);
+ EmitUint8(0x66);
+ EmitOptionalRex32(dst, src);
+ EmitUint8(0x0F);
+ EmitUint8(0x76);
+ EmitXmmRegisterOperand(dst.LowBits(), src);
+}
+
+void X86_64Assembler::pcmpeqq(XmmRegister dst, XmmRegister src) {
+ AssemblerBuffer::EnsureCapacity ensured(&buffer_);
+ EmitUint8(0x66);
+ EmitOptionalRex32(dst, src);
+ EmitUint8(0x0F);
+ EmitUint8(0x38);
+ EmitUint8(0x29);
+ EmitXmmRegisterOperand(dst.LowBits(), src);
+}
+
void X86_64Assembler::shufpd(XmmRegister dst, XmmRegister src, const Immediate& imm) {
AssemblerBuffer::EnsureCapacity ensured(&buffer_);
EmitUint8(0x66);
diff --git a/compiler/utils/x86_64/assembler_x86_64.h b/compiler/utils/x86_64/assembler_x86_64.h
index 93c24b8265..08e17e81e5 100644
--- a/compiler/utils/x86_64/assembler_x86_64.h
+++ b/compiler/utils/x86_64/assembler_x86_64.h
@@ -523,6 +523,11 @@ class X86_64Assembler FINAL : public Assembler {
void orps(XmmRegister dst, XmmRegister src);
void por(XmmRegister dst, XmmRegister src);
+ void pcmpeqb(XmmRegister dst, XmmRegister src);
+ void pcmpeqw(XmmRegister dst, XmmRegister src);
+ void pcmpeqd(XmmRegister dst, XmmRegister src);
+ void pcmpeqq(XmmRegister dst, XmmRegister src);
+
void shufpd(XmmRegister dst, XmmRegister src, const Immediate& imm);
void shufps(XmmRegister dst, XmmRegister src, const Immediate& imm);
void pshufd(XmmRegister dst, XmmRegister src, const Immediate& imm);
diff --git a/compiler/utils/x86_64/assembler_x86_64_test.cc b/compiler/utils/x86_64/assembler_x86_64_test.cc
index 9d62fd1f6f..20062fdb07 100644
--- a/compiler/utils/x86_64/assembler_x86_64_test.cc
+++ b/compiler/utils/x86_64/assembler_x86_64_test.cc
@@ -1293,6 +1293,22 @@ TEST_F(AssemblerX86_64Test, Por) {
DriverStr(RepeatFF(&x86_64::X86_64Assembler::por, "por %{reg2}, %{reg1}"), "por");
}
+TEST_F(AssemblerX86_64Test, PCmpeqb) {
+ DriverStr(RepeatFF(&x86_64::X86_64Assembler::pcmpeqb, "pcmpeqb %{reg2}, %{reg1}"), "pcmpeqb");
+}
+
+TEST_F(AssemblerX86_64Test, PCmpeqw) {
+ DriverStr(RepeatFF(&x86_64::X86_64Assembler::pcmpeqw, "pcmpeqw %{reg2}, %{reg1}"), "pcmpeqw");
+}
+
+TEST_F(AssemblerX86_64Test, PCmpeqd) {
+ DriverStr(RepeatFF(&x86_64::X86_64Assembler::pcmpeqd, "pcmpeqd %{reg2}, %{reg1}"), "pcmpeqd");
+}
+
+TEST_F(AssemblerX86_64Test, PCmpeqq) {
+ DriverStr(RepeatFF(&x86_64::X86_64Assembler::pcmpeqq, "pcmpeqq %{reg2}, %{reg1}"), "pcmpeqq");
+}
+
TEST_F(AssemblerX86_64Test, Shufps) {
DriverStr(RepeatFFI(&x86_64::X86_64Assembler::shufps, 1, "shufps ${imm}, %{reg2}, %{reg1}"), "shufps");
}
diff --git a/disassembler/disassembler_mips.cc b/disassembler/disassembler_mips.cc
index fc6c18b1df..1f6b87447f 100644
--- a/disassembler/disassembler_mips.cc
+++ b/disassembler/disassembler_mips.cc
@@ -43,7 +43,6 @@ struct MipsInstruction {
static const uint32_t kOpcodeShift = 26;
static const uint32_t kCop1 = (17 << kOpcodeShift);
-static const uint32_t kMsa = (30 << kOpcodeShift); // MSA major opcode.
static const uint32_t kITypeMask = (0x3f << kOpcodeShift);
static const uint32_t kJTypeMask = (0x3f << kOpcodeShift);
@@ -52,8 +51,6 @@ static const uint32_t kSpecial0Mask = (0x3f << kOpcodeShift);
static const uint32_t kSpecial2Mask = (0x3f << kOpcodeShift);
static const uint32_t kSpecial3Mask = (0x3f << kOpcodeShift);
static const uint32_t kFpMask = kRTypeMask;
-static const uint32_t kMsaMask = kRTypeMask;
-static const uint32_t kMsaSpecialMask = (0x3f << kOpcodeShift);
static const MipsInstruction gMipsInstructions[] = {
// "sll r0, r0, 0" is the canonical "nop", used in delay slots.
@@ -420,36 +417,6 @@ static const MipsInstruction gMipsInstructions[] = {
{ kFpMask, kCop1 | 0x10, "sel", "fadt" },
{ kFpMask, kCop1 | 0x1e, "max", "fadt" },
{ kFpMask, kCop1 | 0x1c, "min", "fadt" },
-
- // MSA instructions.
- { kMsaMask | (0x1f << 21), kMsa | (0x0 << 21) | 0x1e, "and.v", "kmn" },
- { kMsaMask | (0x1f << 21), kMsa | (0x1 << 21) | 0x1e, "or.v", "kmn" },
- { kMsaMask | (0x1f << 21), kMsa | (0x2 << 21) | 0x1e, "nor.v", "kmn" },
- { 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 | (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" },
- { kMsaMask | (0x7 << 23), kMsa | (0x6 << 23) | 0x12, "mod_s", "Vkmn" },
- { kMsaMask | (0x7 << 23), kMsa | (0x7 << 23) | 0x12, "mod_u", "Vkmn" },
- { kMsaMask | (0xf << 22), kMsa | (0x0 << 22) | 0x1b, "fadd", "Ukmn" },
- { kMsaMask | (0xf << 22), kMsa | (0x1 << 22) | 0x1b, "fsub", "Ukmn" },
- { kMsaMask | (0xf << 22), kMsa | (0x2 << 22) | 0x1b, "fmul", "Ukmn" },
- { kMsaMask | (0xf << 22), kMsa | (0x3 << 22) | 0x1b, "fdiv", "Ukmn" },
- { kMsaMask | (0x1ff << 17), kMsa | (0x19e << 17) | 0x1e, "ffint_s", "ukm" },
- { kMsaMask | (0x1ff << 17), kMsa | (0x19c << 17) | 0x1e, "ftint_s", "ukm" },
- { kMsaMask | (0x7 << 23), kMsa | (0x0 << 23) | 0xd, "sll", "Vkmn" },
- { kMsaMask | (0x7 << 23), kMsa | (0x1 << 23) | 0xd, "sra", "Vkmn" },
- { kMsaMask | (0x7 << 23), kMsa | (0x2 << 23) | 0xd, "srl", "Vkmn" },
- { kMsaMask | (0x7 << 23), kMsa | (0x0 << 23) | 0x9, "slli", "kmW" },
- { kMsaMask | (0x7 << 23), kMsa | (0x1 << 23) | 0x9, "srai", "kmW" },
- { kMsaMask | (0x7 << 23), kMsa | (0x2 << 23) | 0x9, "srli", "kmW" },
- { kMsaMask | (0x3ff << 16), kMsa | (0xbe << 16) | 0x19, "move.v", "km" },
- { kMsaMask | (0xf << 22), kMsa | (0x1 << 22) | 0x19, "splati", "kX" },
- { kMsaMask | (0xff << 18), kMsa | (0xc0 << 18) | 0x1e, "fill", "vkD" },
- { kMsaSpecialMask | (0xf << 2), kMsa | (0x8 << 2), "ld", "kw" },
- { kMsaSpecialMask | (0xf << 2), kMsa | (0x9 << 2), "st", "kw" },
};
static uint32_t ReadU32(const uint8_t* ptr) {
@@ -592,111 +559,6 @@ size_t DisassemblerMips::Dump(std::ostream& os, const uint8_t* instr_ptr) {
case 't': args << 'f' << rt; break;
case 'Z': args << (rd + 1); break; // sz ([d]ext size).
case 'z': args << (rd - sa + 1); break; // sz ([d]ins, dinsu size).
- case 'k': args << 'w' << sa; break;
- case 'm': args << 'w' << rd; break;
- case 'n': args << 'w' << rt; break;
- case 'U': // MSA 1-bit df (word/doubleword), position 21.
- {
- int32_t df = (instruction >> 21) & 0x1;
- switch (df) {
- case 0: opcode += ".w"; break;
- case 1: opcode += ".d"; break;
- }
- continue; // No ", ".
- }
- case 'u': // MSA 1-bit df (word/doubleword), position 16.
- {
- int32_t df = (instruction >> 16) & 0x1;
- switch (df) {
- case 0: opcode += ".w"; break;
- case 1: opcode += ".d"; break;
- }
- continue; // No ", ".
- }
- case 'V': // MSA 2-bit df, position 21.
- {
- int32_t df = (instruction >> 21) & 0x3;
- switch (df) {
- case 0: opcode += ".b"; break;
- case 1: opcode += ".h"; break;
- case 2: opcode += ".w"; break;
- case 3: opcode += ".d"; break;
- }
- continue; // No ", ".
- }
- case 'v': // MSA 2-bit df, position 16.
- {
- int32_t df = (instruction >> 16) & 0x3;
- switch (df) {
- case 0: opcode += ".b"; break;
- case 1: opcode += ".h"; break;
- case 2: opcode += ".w"; break;
- case 3: opcode += ".d"; break;
- }
- continue; // No ", ".
- }
- case 'W': // MSA df/m.
- {
- int32_t df_m = (instruction >> 16) & 0x7f;
- if ((df_m & (0x1 << 6)) == 0) {
- opcode += ".d";
- args << (df_m & 0x3f);
- break;
- }
- if ((df_m & (0x1 << 5)) == 0) {
- opcode += ".w";
- args << (df_m & 0x1f);
- break;
- }
- if ((df_m & (0x1 << 4)) == 0) {
- opcode += ".h";
- args << (df_m & 0xf);
- break;
- }
- if ((df_m & (0x1 << 3)) == 0) {
- opcode += ".b";
- args << (df_m & 0x7);
- }
- break;
- }
- case 'w': // MSA +x(rs).
- {
- int32_t df = instruction & 0x3;
- int32_t s10 = (instruction >> 16) & 0x3ff;
- s10 -= (s10 & 0x200) << 1; // Sign-extend s10.
- switch (df) {
- case 0: opcode += ".b"; break;
- case 1: opcode += ".h"; break;
- case 2: opcode += ".w"; break;
- case 3: opcode += ".d"; break;
- }
- args << StringPrintf("%+d(r%d)", s10 << df, rd);
- break;
- }
- case 'X': // MSA df/n - ws[x].
- {
- int32_t df_n = (instruction >> 16) & 0x3f;
- if ((df_n & (0x3 << 4)) == 0) {
- opcode += ".b";
- args << 'w' << rd << '[' << (df_n & 0xf) << ']';
- break;
- }
- if ((df_n & (0x3 << 3)) == 0) {
- opcode += ".h";
- args << 'w' << rd << '[' << (df_n & 0x7) << ']';
- break;
- }
- if ((df_n & (0x3 << 2)) == 0) {
- opcode += ".w";
- args << 'w' << rd << '[' << (df_n & 0x3) << ']';
- break;
- }
- if ((df_n & (0x3 << 1)) == 0) {
- opcode += ".d";
- args << 'w' << rd << '[' << (df_n & 0x1) << ']';
- }
- break;
- }
}
if (*(args_fmt + 1)) {
args << ", ";
diff --git a/runtime/arch/mips64/registers_mips64.cc b/runtime/arch/mips64/registers_mips64.cc
index 1ee2cdd204..495920809f 100644
--- a/runtime/arch/mips64/registers_mips64.cc
+++ b/runtime/arch/mips64/registers_mips64.cc
@@ -46,14 +46,5 @@ std::ostream& operator<<(std::ostream& os, const FpuRegister& rhs) {
return os;
}
-std::ostream& operator<<(std::ostream& os, const VectorRegister& rhs) {
- if (rhs >= W0 && rhs < kNumberOfVectorRegisters) {
- os << "w" << static_cast<int>(rhs);
- } else {
- os << "VectorRegister[" << static_cast<int>(rhs) << "]";
- }
- return os;
-}
-
} // namespace mips64
} // namespace art
diff --git a/runtime/arch/mips64/registers_mips64.h b/runtime/arch/mips64/registers_mips64.h
index 30de2cc009..81fae72b44 100644
--- a/runtime/arch/mips64/registers_mips64.h
+++ b/runtime/arch/mips64/registers_mips64.h
@@ -107,45 +107,6 @@ enum FpuRegister {
};
std::ostream& operator<<(std::ostream& os, const FpuRegister& rhs);
-// Values for vector registers.
-enum VectorRegister {
- W0 = 0,
- W1 = 1,
- W2 = 2,
- W3 = 3,
- W4 = 4,
- W5 = 5,
- W6 = 6,
- W7 = 7,
- W8 = 8,
- W9 = 9,
- W10 = 10,
- W11 = 11,
- W12 = 12,
- W13 = 13,
- W14 = 14,
- W15 = 15,
- W16 = 16,
- W17 = 17,
- W18 = 18,
- W19 = 19,
- W20 = 20,
- W21 = 21,
- W22 = 22,
- W23 = 23,
- W24 = 24,
- W25 = 25,
- W26 = 26,
- W27 = 27,
- W28 = 28,
- W29 = 29,
- W30 = 30,
- W31 = 31,
- kNumberOfVectorRegisters = 32,
- kNoVectorRegister = -1,
-};
-std::ostream& operator<<(std::ostream& os, const VectorRegister& rhs);
-
} // namespace mips64
} // namespace art
diff --git a/test/knownfailures.json b/test/knownfailures.json
index 25c8091803..535b94fdf0 100644
--- a/test/knownfailures.json
+++ b/test/knownfailures.json
@@ -1,12 +1,12 @@
[
{
- "tests": "153-reference-stress",
+ "test": "153-reference-stress",
"description": ["Disable 153-reference-stress temporarily until a fix",
"arrives."],
"bug": "http://b/33389022"
},
{
- "tests": "080-oom-fragmentation",
+ "test": "080-oom-fragmentation",
"description": "Disable 080-oom-fragmentation due to flakes.",
"bug": "http://b/33795328"
},
@@ -21,7 +21,7 @@
"bug": "http://b/34193123"
},
{
- "tests": "149-suspend-all-stress",
+ "test": "149-suspend-all-stress",
"description": "Disable 149-suspend-all-stress, its output is flaky",
"bug": "http://b/28988206"
},
@@ -34,13 +34,13 @@
"loaded systems."]
},
{
- "tests": "147-stripped-dex-fallback",
+ "test": "147-stripped-dex-fallback",
"variant": "target",
"description": ["147-stripped-dex-fallback isn't supported on device",
"because --strip-dex requires the zip command."]
},
{
- "tests": "569-checker-pattern-replacement",
+ "test": "569-checker-pattern-replacement",
"variant": "target",
"description": ["569-checker-pattern-replacement tests behaviour",
"present only on host."]
@@ -54,7 +54,13 @@
"doesn't (and isn't meant to) work with --prebuild."]
},
{
- "tests": ["529-checker-unresolved"],
+ "test": "554-jit-profile-file",
+ "variant": "no-prebuild | interpreter",
+ "description": ["554-jit-profile-file is disabled because it needs a",
+ "primary oat file to know what it should save."]
+ },
+ {
+ "tests": ["529-checker-unresolved", "555-checker-regression-x86const"],
"variant": "no-prebuild",
"bug": "http://b/27784033"
},
@@ -67,26 +73,27 @@
{
"tests": ["117-nopatchoat",
"118-noimage-dex2oat",
- "119-noimage-patchoat"],
+ "119-noimage-patchoat",
+ "554-jit-profile-file"],
"variant": "no-relocate",
"description": ["117-nopatchoat is not broken per-se it just doesn't",
"work (and isn't meant to) without --prebuild",
"--relocate"]
},
{
- "tests": "137-cfi",
+ "test": "137-cfi",
"variant": "interp-ac",
"description": ["Temporarily disable some broken tests when forcing",
"access checks in interpreter"],
"bug": "http://b/22414682"
},
{
- "tests" : "629-vdex-speed",
+ "test" : "629-vdex-speed",
"variant": "interp-ac | no-dex2oat | interpreter | jit | relocate-npatchoat",
"description": "629 requires compilation."
},
{
- "tests": "137-cfi",
+ "test": "137-cfi",
"variant": "gcstress",
"description": ["137-cfi needs to unwind a second forked process. We're",
"using a primitive sleep to wait till we hope the",
@@ -94,7 +101,7 @@
"slowness of gcstress makes this bad."]
},
{
- "tests": "152-dead-large-object",
+ "test": "152-dead-large-object",
"variant": "gcstress",
"description": ["152-dead-large-object requires a heap larger than what gcstress uses."],
"bug": "http://b/35800768"
@@ -108,7 +115,7 @@
"non-deterministic. Same for 913."]
},
{
- "tests": "961-default-iface-resolution-gen",
+ "test": "961-default-iface-resolution-gen",
"variant": "gcstress",
"description": ["961-default-iface-resolution-gen and",
"964-default-iface-init-genare very long tests that",
@@ -118,7 +125,7 @@
"lot."]
},
{
- "tests": "964-default-iface-init-gen",
+ "test": "964-default-iface-init-gen",
"variant": "gcstress"
},
{
@@ -128,15 +135,15 @@
"bug": "http://b/35917229"
},
{
- "tests": "115-native-bridge",
+ "test": "115-native-bridge",
"variant": "target",
"description": ["115-native-bridge setup is complicated. Need to",
"implement it correctly for the target."]
},
{
- "tests": "130-hprof",
+ "test": "130-hprof",
"variant": "target",
- "description": ["130-hprof dumps the heap and runs hprof-conv to check",
+ "desription": ["130-hprof dumps the heap and runs hprof-conv to check",
"whether the file is somewhat readable. Thi is only",
"possible on the host. TODO: Turn off all the other",
"combinations, this is more about testing actual ART",
@@ -144,7 +151,7 @@
"complete test) JDWP must be set up."]
},
{
- "tests": "131-structural-change",
+ "test": "131-structural-change",
"variant": "debug",
"description": ["131 is an old test. The functionality has been",
"implemented at an earlier stage and is checked",
@@ -153,19 +160,25 @@
"punt to interpreter"]
},
{
- "tests": "138-duplicate-classes-check",
+ "test": "138-duplicate-classes-check",
"variant": "ndebug",
"description": ["Turned on for debug builds since debug builds have",
"duplicate classes checks enabled"],
"bug": "http://b/2133391"
},
{
- "tests": "147-stripped-dex-fallback",
+ "test": "147-stripped-dex-fallback",
"variant": "no-dex2oat | no-image | relocate-npatchoat",
"description": ["147-stripped-dex-fallback is disabled because it",
"requires --prebuild."]
},
{
+ "test": "554-jit-profile-file",
+ "variant": "no-dex2oat | no-image | relocate-npatchoat",
+ "description": ["554-jit-profile-file is disabled because it needs a",
+ "primary oat file to know what it should save."]
+ },
+ {
"tests": ["116-nodex2oat",
"117-nopatchoat",
"118-noimage-dex2oat",
@@ -184,14 +197,14 @@
"138-duplicate-classes-check",
"018-stack-overflow",
"961-default-iface-resolution-gen",
- "964-default-iface-init-gen"],
+ "964-default-iface-init"],
"variant": "no-image",
"description": ["This test fails without an image. 018, 961, 964 often",
"time out."],
"bug": "http://b/34369284"
},
{
- "tests": "137-cfi",
+ "test": "137-cfi",
"description": ["This test unrolls and expects managed frames, but",
"tracing means we run the interpreter."],
"variant": "trace | stream"
@@ -206,7 +219,7 @@
"variant": "trace | stream"
},
{
- "tests": "130-hprof",
+ "test": "130-hprof",
"description": "130 occasional timeout",
"bug": "http://b/32383962",
"variant": "trace | stream"
@@ -227,14 +240,14 @@
"suppressed when tracing."]
},
{
- "tests": "137-cfi",
+ "test": "137-cfi",
"description": ["CFI unwinding expects managed frames, and the test",
"does not iterate enough to even compile. JIT also",
"uses Generic JNI instead of the JNI compiler."],
"variant": "interpreter | jit"
},
{
- "tests": "906-iterate-heap",
+ "test": "906-iterate-heap",
"description": ["Test 906 iterates the heap filtering with different",
"options. No instances should be created between those",
"runs to be able to have precise checks."],
@@ -262,22 +275,22 @@
"variant": "optimizing & ndebuggable | regalloc_gc & ndebuggable"
},
{
- "tests": "596-app-images",
+ "test": "596-app-images",
"variant": "npictest"
},
{
- "tests": "055-enum-performance",
+ "test": "055-enum-performance",
"variant": "optimizing | regalloc_gc",
"description": ["055: Exceeds run time limits due to heap poisoning ",
"instrumentation (on ARM and ARM64 devices)."]
},
{
- "tests": "909-attach-agent",
+ "test": "909-attach-agent",
"variant": "debuggable",
"description": "Tests that check semantics for a non-debuggable app."
},
{
- "tests": "137-cfi",
+ "test": "137-cfi",
"variant": "debuggable",
"description": ["The test relies on AOT code and debuggable makes us",
"JIT always."]
@@ -317,7 +330,7 @@
"variant": "optimizing | regalloc_gc"
},
{
- "tests": "055-enum-performance",
+ "test": "055-enum-performance",
"description": ["The test tests performance which degrades during",
"bisecting."],
"env_vars": {"ART_TEST_BISECTION": "true"},
diff --git a/test/testrunner/testrunner.py b/test/testrunner/testrunner.py
index 6efdeb667c..b814e14916 100755
--- a/test/testrunner/testrunner.py
+++ b/test/testrunner/testrunner.py
@@ -539,22 +539,6 @@ def print_test_info(test_name, result, failed_test_info=""):
finally:
print_mutex.release()
-def verify_knownfailure_entry(entry):
- supported_field = {
- 'tests' : (list, unicode),
- 'description' : (list, unicode),
- 'bug' : (unicode,),
- 'variant' : (unicode,),
- 'env_vars' : (dict,),
- }
- for field in entry:
- field_type = type(entry[field])
- if field_type not in supported_field[field]:
- raise ValueError('%s is not supported type for %s\n%s' % (
- str(field_type),
- field,
- str(entry)))
-
def get_disabled_test_info():
"""Generate set of known failures.
@@ -571,18 +555,15 @@ def get_disabled_test_info():
disabled_test_info = {}
for failure in known_failures_info:
- verify_knownfailure_entry(failure)
- tests = failure.get('tests', [])
- if isinstance(tests, unicode):
+ tests = failure.get('test')
+ if tests:
tests = [tests]
+ else:
+ tests = failure.get('tests', [])
variants = parse_variants(failure.get('variant'))
env_vars = failure.get('env_vars')
-
if check_env_vars(env_vars):
for test in tests:
- if test not in RUN_TEST_SET:
- raise ValueError('%s is not a valid run-test' % (
- test))
if test in disabled_test_info:
disabled_test_info[test] = disabled_test_info[test].union(variants)
else:
@@ -646,9 +627,6 @@ def parse_variants(variants):
variant = set()
for and_variant in and_variants:
and_variant = and_variant.strip()
- if and_variant not in TOTAL_VARIANTS_SET:
- raise ValueError('%s is not a valid variant' % (
- and_variant))
variant.add(and_variant)
variant_list.add(frozenset(variant))
return variant_list