diff options
Diffstat (limited to 'compiler/utils')
| -rw-r--r-- | compiler/utils/arm/assembler_arm_vixl.cc | 6 | ||||
| -rw-r--r-- | compiler/utils/arm/assembler_arm_vixl.h | 4 | ||||
| -rw-r--r-- | compiler/utils/arm/assembler_thumb2.cc | 2 | ||||
| -rw-r--r-- | compiler/utils/arm/assembler_thumb2_test.cc | 7 | ||||
| -rw-r--r-- | compiler/utils/assembler_test.h | 93 | ||||
| -rw-r--r-- | compiler/utils/assembler_test_base.h | 32 | ||||
| -rw-r--r-- | compiler/utils/assembler_thumb_test.cc | 2 | ||||
| -rw-r--r-- | compiler/utils/assembler_thumb_test_expected.cc.inc | 2 | ||||
| -rw-r--r-- | compiler/utils/jni_macro_assembler_test.h | 6 | ||||
| -rw-r--r-- | compiler/utils/managed_register.h | 27 | ||||
| -rw-r--r-- | compiler/utils/mips/assembler_mips.cc | 47 | ||||
| -rw-r--r-- | compiler/utils/mips/assembler_mips.h | 9 | ||||
| -rw-r--r-- | compiler/utils/mips/assembler_mips32r6_test.cc | 22 | ||||
| -rw-r--r-- | compiler/utils/mips/assembler_mips_test.cc | 20 | ||||
| -rw-r--r-- | compiler/utils/mips64/assembler_mips64_test.cc | 4 |
15 files changed, 210 insertions, 73 deletions
diff --git a/compiler/utils/arm/assembler_arm_vixl.cc b/compiler/utils/arm/assembler_arm_vixl.cc index 8045bd2c6a..e3b9fb62c8 100644 --- a/compiler/utils/arm/assembler_arm_vixl.cc +++ b/compiler/utils/arm/assembler_arm_vixl.cc @@ -62,6 +62,12 @@ void ArmVIXLAssembler::UnpoisonHeapReference(vixl::aarch32::Register reg) { ___ Rsb(reg, reg, 0); } +void ArmVIXLAssembler::MaybePoisonHeapReference(vixl32::Register reg) { + if (kPoisonHeapReferences) { + PoisonHeapReference(reg); + } +} + void ArmVIXLAssembler::MaybeUnpoisonHeapReference(vixl32::Register reg) { if (kPoisonHeapReferences) { UnpoisonHeapReference(reg); diff --git a/compiler/utils/arm/assembler_arm_vixl.h b/compiler/utils/arm/assembler_arm_vixl.h index c5575faaa1..e0206287eb 100644 --- a/compiler/utils/arm/assembler_arm_vixl.h +++ b/compiler/utils/arm/assembler_arm_vixl.h @@ -72,6 +72,8 @@ class ArmVIXLAssembler FINAL : public Assembler { void PoisonHeapReference(vixl32::Register reg); // Unpoison a heap reference contained in `reg`. void UnpoisonHeapReference(vixl32::Register reg); + // Poison a heap reference contained in `reg` if heap poisoning is enabled. + void MaybePoisonHeapReference(vixl32::Register reg); // Unpoison a heap reference contained in `reg` if heap poisoning is enabled. void MaybeUnpoisonHeapReference(vixl32::Register reg); @@ -94,7 +96,7 @@ class ArmVIXLAssembler FINAL : public Assembler { void StoreRegisterList(RegList regs, size_t stack_offset); bool ShifterOperandCanAlwaysHold(uint32_t immediate); - bool ShifterOperandCanHold(Opcode opcode, uint32_t immediate, SetCc set_cc); + bool ShifterOperandCanHold(Opcode opcode, uint32_t immediate, SetCc set_cc = kCcDontCare); bool CanSplitLoadStoreOffset(int32_t allowed_offset_bits, int32_t offset, /*out*/ int32_t* add_to_base, diff --git a/compiler/utils/arm/assembler_thumb2.cc b/compiler/utils/arm/assembler_thumb2.cc index 61b7f08518..1e71d06b49 100644 --- a/compiler/utils/arm/assembler_thumb2.cc +++ b/compiler/utils/arm/assembler_thumb2.cc @@ -2830,7 +2830,7 @@ void Thumb2Assembler::strexd(Register rd, Register rt, Register rt2, Register rn void Thumb2Assembler::clrex(Condition cond) { CheckCondition(cond); - int32_t encoding = B31 | B30 | B29 | B27 | B28 | B25 | B24 | B23 | + int32_t encoding = B31 | B30 | B29 | B28 | B25 | B24 | B23 | B21 | B20 | 0xf << 16 | B15 | diff --git a/compiler/utils/arm/assembler_thumb2_test.cc b/compiler/utils/arm/assembler_thumb2_test.cc index d0799d6112..30e8f4e604 100644 --- a/compiler/utils/arm/assembler_thumb2_test.cc +++ b/compiler/utils/arm/assembler_thumb2_test.cc @@ -207,6 +207,13 @@ TEST_F(AssemblerThumb2Test, strexd) { DriverStr(expected, "strexd"); } +TEST_F(AssemblerThumb2Test, clrex) { + __ clrex(); + + const char* expected = "clrex\n"; + DriverStr(expected, "clrex"); +} + TEST_F(AssemblerThumb2Test, LdrdStrd) { __ ldrd(arm::R0, arm::Address(arm::R2, 8)); __ ldrd(arm::R0, arm::Address(arm::R12)); diff --git a/compiler/utils/assembler_test.h b/compiler/utils/assembler_test.h index 92b4c8e041..b34e125866 100644 --- a/compiler/utils/assembler_test.h +++ b/compiler/utils/assembler_test.h @@ -51,30 +51,30 @@ class AssemblerTest : public testing::Test { typedef std::string (*TestFn)(AssemblerTest* assembler_test, Ass* assembler); - void DriverFn(TestFn f, std::string test_name) { + void DriverFn(TestFn f, const std::string& test_name) { DriverWrapper(f(this, assembler_.get()), test_name); } // This driver assumes the assembler has already been called. - void DriverStr(std::string assembly_string, std::string test_name) { + void DriverStr(const std::string& assembly_string, const std::string& test_name) { DriverWrapper(assembly_string, test_name); } - std::string RepeatR(void (Ass::*f)(Reg), std::string fmt) { + std::string RepeatR(void (Ass::*f)(Reg), const std::string& fmt) { return RepeatTemplatedRegister<Reg>(f, GetRegisters(), &AssemblerTest::GetRegName<RegisterView::kUsePrimaryName>, fmt); } - std::string Repeatr(void (Ass::*f)(Reg), std::string fmt) { + std::string Repeatr(void (Ass::*f)(Reg), const std::string& fmt) { return RepeatTemplatedRegister<Reg>(f, GetRegisters(), &AssemblerTest::GetRegName<RegisterView::kUseSecondaryName>, fmt); } - std::string RepeatRR(void (Ass::*f)(Reg, Reg), std::string fmt) { + std::string RepeatRR(void (Ass::*f)(Reg, Reg), const std::string& fmt) { return RepeatTemplatedRegisters<Reg, Reg>(f, GetRegisters(), GetRegisters(), @@ -83,7 +83,7 @@ class AssemblerTest : public testing::Test { fmt); } - std::string RepeatRRNoDupes(void (Ass::*f)(Reg, Reg), std::string fmt) { + std::string RepeatRRNoDupes(void (Ass::*f)(Reg, Reg), const std::string& fmt) { return RepeatTemplatedRegistersNoDupes<Reg, Reg>(f, GetRegisters(), GetRegisters(), @@ -92,7 +92,7 @@ class AssemblerTest : public testing::Test { fmt); } - std::string Repeatrr(void (Ass::*f)(Reg, Reg), std::string fmt) { + std::string Repeatrr(void (Ass::*f)(Reg, Reg), const std::string& fmt) { return RepeatTemplatedRegisters<Reg, Reg>(f, GetRegisters(), GetRegisters(), @@ -101,7 +101,7 @@ class AssemblerTest : public testing::Test { fmt); } - std::string RepeatRRR(void (Ass::*f)(Reg, Reg, Reg), std::string fmt) { + std::string RepeatRRR(void (Ass::*f)(Reg, Reg, Reg), const std::string& fmt) { return RepeatTemplatedRegisters<Reg, Reg, Reg>(f, GetRegisters(), GetRegisters(), @@ -112,7 +112,7 @@ class AssemblerTest : public testing::Test { fmt); } - std::string Repeatrb(void (Ass::*f)(Reg, Reg), std::string fmt) { + std::string Repeatrb(void (Ass::*f)(Reg, Reg), const std::string& fmt) { return RepeatTemplatedRegisters<Reg, Reg>(f, GetRegisters(), GetRegisters(), @@ -121,7 +121,7 @@ class AssemblerTest : public testing::Test { fmt); } - std::string RepeatRr(void (Ass::*f)(Reg, Reg), std::string fmt) { + std::string RepeatRr(void (Ass::*f)(Reg, Reg), const std::string& fmt) { return RepeatTemplatedRegisters<Reg, Reg>(f, GetRegisters(), GetRegisters(), @@ -130,11 +130,11 @@ class AssemblerTest : public testing::Test { fmt); } - std::string RepeatRI(void (Ass::*f)(Reg, const Imm&), size_t imm_bytes, std::string fmt) { + std::string RepeatRI(void (Ass::*f)(Reg, const Imm&), size_t imm_bytes, const std::string& fmt) { return RepeatRegisterImm<RegisterView::kUsePrimaryName>(f, imm_bytes, fmt); } - std::string Repeatri(void (Ass::*f)(Reg, const Imm&), size_t imm_bytes, std::string fmt) { + std::string Repeatri(void (Ass::*f)(Reg, const Imm&), size_t imm_bytes, const std::string& fmt) { return RepeatRegisterImm<RegisterView::kUseSecondaryName>(f, imm_bytes, fmt); } @@ -145,7 +145,7 @@ class AssemblerTest : public testing::Test { const std::vector<Reg2*> reg2_registers, std::string (AssemblerTest::*GetName1)(const Reg1&), std::string (AssemblerTest::*GetName2)(const Reg2&), - std::string fmt) { + const std::string& fmt) { std::string str; std::vector<int64_t> imms = CreateImmediateValuesBits(abs(imm_bits), (imm_bits > 0)); @@ -195,7 +195,7 @@ class AssemblerTest : public testing::Test { std::string (AssemblerTest::*GetName1)(const Reg1&), std::string (AssemblerTest::*GetName2)(const Reg2&), int imm_bits, - std::string fmt) { + const std::string& fmt) { std::vector<int64_t> imms = CreateImmediateValuesBits(abs(imm_bits), (imm_bits > 0)); WarnOnCombinations(reg1_registers.size() * reg2_registers.size() * imms.size()); @@ -245,7 +245,7 @@ class AssemblerTest : public testing::Test { int imm_bits, const std::vector<Reg*> registers, std::string (AssemblerTest::*GetName)(const RegType&), - std::string fmt) { + const std::string& fmt) { std::string str; std::vector<int64_t> imms = CreateImmediateValuesBits(abs(imm_bits), (imm_bits > 0)); @@ -281,7 +281,7 @@ class AssemblerTest : public testing::Test { } template <typename ImmType> - std::string RepeatRRIb(void (Ass::*f)(Reg, Reg, ImmType), int imm_bits, std::string fmt) { + std::string RepeatRRIb(void (Ass::*f)(Reg, Reg, ImmType), int imm_bits, const std::string& fmt) { return RepeatTemplatedRegistersImmBits<Reg, Reg, ImmType>(f, imm_bits, GetRegisters(), @@ -292,7 +292,7 @@ class AssemblerTest : public testing::Test { } template <typename ImmType> - std::string RepeatRIb(void (Ass::*f)(Reg, ImmType), int imm_bits, std::string fmt) { + std::string RepeatRIb(void (Ass::*f)(Reg, ImmType), int imm_bits, const std::string& fmt) { return RepeatTemplatedRegisterImmBits<Reg, ImmType>(f, imm_bits, GetRegisters(), @@ -301,7 +301,9 @@ class AssemblerTest : public testing::Test { } template <typename ImmType> - std::string RepeatFRIb(void (Ass::*f)(FPReg, Reg, ImmType), int imm_bits, std::string fmt) { + std::string RepeatFRIb(void (Ass::*f)(FPReg, Reg, ImmType), + int imm_bits, + const std::string& fmt) { return RepeatTemplatedRegistersImmBits<FPReg, Reg, ImmType>(f, imm_bits, GetFPRegisters(), @@ -311,7 +313,7 @@ class AssemblerTest : public testing::Test { fmt); } - std::string RepeatFF(void (Ass::*f)(FPReg, FPReg), std::string fmt) { + std::string RepeatFF(void (Ass::*f)(FPReg, FPReg), const std::string& fmt) { return RepeatTemplatedRegisters<FPReg, FPReg>(f, GetFPRegisters(), GetFPRegisters(), @@ -320,7 +322,7 @@ class AssemblerTest : public testing::Test { fmt); } - std::string RepeatFFF(void (Ass::*f)(FPReg, FPReg, FPReg), std::string fmt) { + std::string RepeatFFF(void (Ass::*f)(FPReg, FPReg, FPReg), const std::string& fmt) { return RepeatTemplatedRegisters<FPReg, FPReg, FPReg>(f, GetFPRegisters(), GetFPRegisters(), @@ -331,9 +333,21 @@ class AssemblerTest : public testing::Test { fmt); } + std::string RepeatFFR(void (Ass::*f)(FPReg, FPReg, Reg), const std::string& fmt) { + return RepeatTemplatedRegisters<FPReg, FPReg, Reg>( + f, + GetFPRegisters(), + GetFPRegisters(), + GetRegisters(), + &AssemblerTest::GetFPRegName, + &AssemblerTest::GetFPRegName, + &AssemblerTest::GetRegName<RegisterView::kUsePrimaryName>, + fmt); + } + std::string RepeatFFI(void (Ass::*f)(FPReg, FPReg, const Imm&), size_t imm_bytes, - std::string fmt) { + const std::string& fmt) { return RepeatTemplatedRegistersImm<FPReg, FPReg>(f, GetFPRegisters(), GetFPRegisters(), @@ -344,7 +358,9 @@ class AssemblerTest : public testing::Test { } template <typename ImmType> - std::string RepeatFFIb(void (Ass::*f)(FPReg, FPReg, ImmType), int imm_bits, std::string fmt) { + std::string RepeatFFIb(void (Ass::*f)(FPReg, FPReg, ImmType), + int imm_bits, + const std::string& fmt) { return RepeatTemplatedRegistersImmBits<FPReg, FPReg, ImmType>(f, imm_bits, GetFPRegisters(), @@ -355,7 +371,9 @@ class AssemblerTest : public testing::Test { } template <typename ImmType> - std::string RepeatIbFF(void (Ass::*f)(ImmType, FPReg, FPReg), int imm_bits, std::string fmt) { + std::string RepeatIbFF(void (Ass::*f)(ImmType, FPReg, FPReg), + int imm_bits, + const std::string& fmt) { return RepeatTemplatedImmBitsRegisters<ImmType, FPReg, FPReg>(f, GetFPRegisters(), GetFPRegisters(), @@ -365,7 +383,7 @@ class AssemblerTest : public testing::Test { fmt); } - std::string RepeatFR(void (Ass::*f)(FPReg, Reg), std::string fmt) { + std::string RepeatFR(void (Ass::*f)(FPReg, Reg), const std::string& fmt) { return RepeatTemplatedRegisters<FPReg, Reg>(f, GetFPRegisters(), GetRegisters(), @@ -374,7 +392,7 @@ class AssemblerTest : public testing::Test { fmt); } - std::string RepeatFr(void (Ass::*f)(FPReg, Reg), std::string fmt) { + std::string RepeatFr(void (Ass::*f)(FPReg, Reg), const std::string& fmt) { return RepeatTemplatedRegisters<FPReg, Reg>(f, GetFPRegisters(), GetRegisters(), @@ -383,7 +401,7 @@ class AssemblerTest : public testing::Test { fmt); } - std::string RepeatRF(void (Ass::*f)(Reg, FPReg), std::string fmt) { + std::string RepeatRF(void (Ass::*f)(Reg, FPReg), const std::string& fmt) { return RepeatTemplatedRegisters<Reg, FPReg>(f, GetRegisters(), GetFPRegisters(), @@ -392,7 +410,7 @@ class AssemblerTest : public testing::Test { fmt); } - std::string RepeatrF(void (Ass::*f)(Reg, FPReg), std::string fmt) { + std::string RepeatrF(void (Ass::*f)(Reg, FPReg), const std::string& fmt) { return RepeatTemplatedRegisters<Reg, FPReg>(f, GetRegisters(), GetFPRegisters(), @@ -401,7 +419,9 @@ class AssemblerTest : public testing::Test { fmt); } - std::string RepeatI(void (Ass::*f)(const Imm&), size_t imm_bytes, std::string fmt, + std::string RepeatI(void (Ass::*f)(const Imm&), + size_t imm_bytes, + const std::string& fmt, bool as_uint = false) { std::string str; std::vector<int64_t> imms = CreateImmediateValues(imm_bytes, as_uint); @@ -639,7 +659,7 @@ class AssemblerTest : public testing::Test { std::string RepeatTemplatedRegister(void (Ass::*f)(RegType), const std::vector<RegType*> registers, std::string (AssemblerTest::*GetName)(const RegType&), - std::string fmt) { + const std::string& fmt) { std::string str; for (auto reg : registers) { (assembler_.get()->*f)(*reg); @@ -667,7 +687,7 @@ class AssemblerTest : public testing::Test { const std::vector<Reg2*> reg2_registers, std::string (AssemblerTest::*GetName1)(const Reg1&), std::string (AssemblerTest::*GetName2)(const Reg2&), - std::string fmt) { + const std::string& fmt) { WarnOnCombinations(reg1_registers.size() * reg2_registers.size()); std::string str; @@ -705,7 +725,7 @@ class AssemblerTest : public testing::Test { const std::vector<Reg2*> reg2_registers, std::string (AssemblerTest::*GetName1)(const Reg1&), std::string (AssemblerTest::*GetName2)(const Reg2&), - std::string fmt) { + const std::string& fmt) { WarnOnCombinations(reg1_registers.size() * reg2_registers.size()); std::string str; @@ -746,7 +766,7 @@ class AssemblerTest : public testing::Test { std::string (AssemblerTest::*GetName1)(const Reg1&), std::string (AssemblerTest::*GetName2)(const Reg2&), std::string (AssemblerTest::*GetName3)(const Reg3&), - std::string fmt) { + const std::string& fmt) { std::string str; for (auto reg1 : reg1_registers) { for (auto reg2 : reg2_registers) { @@ -791,7 +811,7 @@ class AssemblerTest : public testing::Test { std::string (AssemblerTest::*GetName1)(const Reg1&), std::string (AssemblerTest::*GetName2)(const Reg2&), size_t imm_bytes, - std::string fmt) { + const std::string& fmt) { std::vector<int64_t> imms = CreateImmediateValues(imm_bytes); WarnOnCombinations(reg1_registers.size() * reg2_registers.size() * imms.size()); @@ -883,8 +903,9 @@ class AssemblerTest : public testing::Test { private: template <RegisterView kRegView> - std::string RepeatRegisterImm(void (Ass::*f)(Reg, const Imm&), size_t imm_bytes, - std::string fmt) { + std::string RepeatRegisterImm(void (Ass::*f)(Reg, const Imm&), + size_t imm_bytes, + const std::string& fmt) { const std::vector<Reg*> registers = GetRegisters(); std::string str; std::vector<int64_t> imms = CreateImmediateValues(imm_bytes); @@ -926,7 +947,7 @@ class AssemblerTest : public testing::Test { virtual void Pad(std::vector<uint8_t>& data ATTRIBUTE_UNUSED) { } - void DriverWrapper(std::string assembly_text, std::string test_name) { + void DriverWrapper(const std::string& assembly_text, const std::string& test_name) { assembler_->FinalizeCode(); size_t cs = assembler_->CodeSize(); std::unique_ptr<std::vector<uint8_t>> data(new std::vector<uint8_t>(cs)); diff --git a/compiler/utils/assembler_test_base.h b/compiler/utils/assembler_test_base.h index 8c71292465..ac24ee95eb 100644 --- a/compiler/utils/assembler_test_base.h +++ b/compiler/utils/assembler_test_base.h @@ -106,7 +106,9 @@ class AssemblerTestInfrastructure { // Driver() assembles and compares the results. If the results are not equal and we have a // disassembler, disassemble both and check whether they have the same mnemonics (in which case // we just warn). - void Driver(const std::vector<uint8_t>& data, std::string assembly_text, std::string test_name) { + void Driver(const std::vector<uint8_t>& data, + const std::string& assembly_text, + const std::string& test_name) { EXPECT_NE(assembly_text.length(), 0U) << "Empty assembly"; NativeAssemblerResult res; @@ -229,7 +231,7 @@ class AssemblerTestInfrastructure { bool success = Exec(args, error_msg); if (!success) { LOG(ERROR) << "Assembler command line:"; - for (std::string arg : args) { + for (const std::string& arg : args) { LOG(ERROR) << arg; } } @@ -238,7 +240,7 @@ class AssemblerTestInfrastructure { // Runs objdump -h on the binary file and extracts the first line with .text. // Returns "" on failure. - std::string Objdump(std::string file) { + std::string Objdump(const std::string& file) { bool have_objdump = FileExists(FindTool(objdump_cmd_name_)); EXPECT_TRUE(have_objdump) << "Cannot find objdump: " << GetObjdumpCommand(); if (!have_objdump) { @@ -287,8 +289,9 @@ class AssemblerTestInfrastructure { } // Disassemble both binaries and compare the text. - bool DisassembleBinaries(const std::vector<uint8_t>& data, const std::vector<uint8_t>& as, - std::string test_name) { + bool DisassembleBinaries(const std::vector<uint8_t>& data, + const std::vector<uint8_t>& as, + const std::string& test_name) { std::string disassembler = GetDisassembleCommand(); if (disassembler.length() == 0) { LOG(WARNING) << "No dissassembler command."; @@ -324,7 +327,7 @@ class AssemblerTestInfrastructure { return result; } - bool DisassembleBinary(std::string file, std::string* error_msg) { + bool DisassembleBinary(const std::string& file, std::string* error_msg) { std::vector<std::string> args; // Encaspulate the whole command line in a single string passed to @@ -345,7 +348,7 @@ class AssemblerTestInfrastructure { return Exec(args, error_msg); } - std::string WriteToFile(const std::vector<uint8_t>& buffer, std::string test_name) { + std::string WriteToFile(const std::vector<uint8_t>& buffer, const std::string& test_name) { std::string file_name = GetTmpnam() + std::string("---") + test_name; const char* data = reinterpret_cast<const char*>(buffer.data()); std::ofstream s_out(file_name + ".o"); @@ -354,7 +357,7 @@ class AssemblerTestInfrastructure { return file_name + ".o"; } - bool CompareFiles(std::string f1, std::string f2) { + bool CompareFiles(const std::string& f1, const std::string& f2) { std::ifstream f1_in(f1); std::ifstream f2_in(f2); @@ -369,7 +372,9 @@ class AssemblerTestInfrastructure { } // Compile the given assembly code and extract the binary, if possible. Put result into res. - bool Compile(std::string assembly_code, NativeAssemblerResult* res, std::string test_name) { + bool Compile(const std::string& assembly_code, + NativeAssemblerResult* res, + const std::string& test_name) { res->ok = false; res->code.reset(nullptr); @@ -438,7 +443,7 @@ class AssemblerTestInfrastructure { // Check whether file exists. Is used for commands, so strips off any parameters: anything after // the first space. We skip to the last slash for this, so it should work with directories with // spaces. - static bool FileExists(std::string file) { + static bool FileExists(const std::string& file) { if (file.length() == 0) { return false; } @@ -478,7 +483,7 @@ class AssemblerTestInfrastructure { return getcwd(temp, 1024) ? std::string(temp) + "/" : std::string(""); } - std::string FindTool(std::string tool_name) { + std::string FindTool(const std::string& tool_name) { // Find the current tool. Wild-card pattern is "arch-string*tool-name". std::string gcc_path = GetRootPath() + GetGCCRootPath(); std::vector<std::string> args; @@ -522,7 +527,8 @@ class AssemblerTestInfrastructure { // Helper for below. If name_predicate is empty, search for all files, otherwise use it for the // "-name" option. - static void FindToolDumpPrintout(std::string name_predicate, std::string tmp_file) { + static void FindToolDumpPrintout(const std::string& name_predicate, + const std::string& tmp_file) { std::string gcc_path = GetRootPath() + GetGCCRootPath(); std::vector<std::string> args; args.push_back("find"); @@ -562,7 +568,7 @@ class AssemblerTestInfrastructure { } // For debug purposes. - void FindToolDump(std::string tool_name) { + void FindToolDump(const std::string& tool_name) { // Check with the tool name. FindToolDumpPrintout(architecture_string_ + "*" + tool_name, GetTmpnam()); FindToolDumpPrintout("", GetTmpnam()); diff --git a/compiler/utils/assembler_thumb_test.cc b/compiler/utils/assembler_thumb_test.cc index 86a4aa2245..10bed13dad 100644 --- a/compiler/utils/assembler_thumb_test.cc +++ b/compiler/utils/assembler_thumb_test.cc @@ -158,7 +158,7 @@ void DumpAndCheck(std::vector<uint8_t>& code, const char* testname, const char* } if (CompareIgnoringSpace(results[lineindex], testline) != 0) { LOG(FATAL) << "Output is not as expected at line: " << lineindex - << results[lineindex] << "/" << testline; + << results[lineindex] << "/" << testline << ", test name: " << testname; } ++lineindex; } diff --git a/compiler/utils/assembler_thumb_test_expected.cc.inc b/compiler/utils/assembler_thumb_test_expected.cc.inc index 91f397087c..69e1d8f6fa 100644 --- a/compiler/utils/assembler_thumb_test_expected.cc.inc +++ b/compiler/utils/assembler_thumb_test_expected.cc.inc @@ -5544,7 +5544,7 @@ const char* const VixlJniHelpersResults[] = { " 10c: ecbd 8a10 vpop {s16-s31}\n", " 110: e8bd 8de0 ldmia.w sp!, {r5, r6, r7, r8, sl, fp, pc}\n", " 114: 4660 mov r0, ip\n", - " 116: f8d9 c2ac ldr.w ip, [r9, #684] ; 0x2ac\n", + " 116: f8d9 c2b0 ldr.w ip, [r9, #688] ; 0x2b0\n", " 11a: 47e0 blx ip\n", nullptr }; diff --git a/compiler/utils/jni_macro_assembler_test.h b/compiler/utils/jni_macro_assembler_test.h index 829f34b4b7..293f4cde9c 100644 --- a/compiler/utils/jni_macro_assembler_test.h +++ b/compiler/utils/jni_macro_assembler_test.h @@ -39,12 +39,12 @@ class JNIMacroAssemblerTest : public testing::Test { typedef std::string (*TestFn)(JNIMacroAssemblerTest* assembler_test, Ass* assembler); - void DriverFn(TestFn f, std::string test_name) { + void DriverFn(TestFn f, const std::string& test_name) { DriverWrapper(f(this, assembler_.get()), test_name); } // This driver assumes the assembler has already been called. - void DriverStr(std::string assembly_string, std::string test_name) { + void DriverStr(const std::string& assembly_string, const std::string& test_name) { DriverWrapper(assembly_string, test_name); } @@ -128,7 +128,7 @@ class JNIMacroAssemblerTest : public testing::Test { virtual void Pad(std::vector<uint8_t>& data ATTRIBUTE_UNUSED) { } - void DriverWrapper(std::string assembly_text, std::string test_name) { + void DriverWrapper(const std::string& assembly_text, const std::string& test_name) { assembler_->FinalizeCode(); size_t cs = assembler_->CodeSize(); std::unique_ptr<std::vector<uint8_t>> data(new std::vector<uint8_t>(cs)); diff --git a/compiler/utils/managed_register.h b/compiler/utils/managed_register.h index 46adb3f2d2..184cdf5050 100644 --- a/compiler/utils/managed_register.h +++ b/compiler/utils/managed_register.h @@ -17,8 +17,11 @@ #ifndef ART_COMPILER_UTILS_MANAGED_REGISTER_H_ #define ART_COMPILER_UTILS_MANAGED_REGISTER_H_ +#include <type_traits> #include <vector> +#include "base/value_object.h" + namespace art { namespace arm { @@ -42,17 +45,14 @@ namespace x86_64 { class X86_64ManagedRegister; } -class ManagedRegister { +class ManagedRegister : public ValueObject { public: // ManagedRegister is a value class. There exists no method to change the // internal state. We therefore allow a copy constructor and an // assignment-operator. - constexpr ManagedRegister(const ManagedRegister& other) : id_(other.id_) { } + constexpr ManagedRegister(const ManagedRegister& other) = default; - ManagedRegister& operator=(const ManagedRegister& other) { - id_ = other.id_; - return *this; - } + ManagedRegister& operator=(const ManagedRegister& other) = default; constexpr arm::ArmManagedRegister AsArm() const; constexpr arm64::Arm64ManagedRegister AsArm64() const; @@ -85,6 +85,9 @@ class ManagedRegister { int id_; }; +static_assert(std::is_trivially_copyable<ManagedRegister>::value, + "ManagedRegister should be trivially copyable"); + class ManagedRegisterSpill : public ManagedRegister { public: // ManagedRegisterSpill contains information about data type size and location in caller frame @@ -115,18 +118,18 @@ class ManagedRegisterEntrySpills : public std::vector<ManagedRegisterSpill> { public: // The ManagedRegister does not have information about size and offset. // In this case it's size and offset determined by BuildFrame (assembler) - void push_back(ManagedRegister __x) { - ManagedRegisterSpill spill(__x); + void push_back(ManagedRegister x) { + ManagedRegisterSpill spill(x); std::vector<ManagedRegisterSpill>::push_back(spill); } - void push_back(ManagedRegister __x, int32_t __size) { - ManagedRegisterSpill spill(__x, __size); + void push_back(ManagedRegister x, int32_t size) { + ManagedRegisterSpill spill(x, size); std::vector<ManagedRegisterSpill>::push_back(spill); } - void push_back(ManagedRegisterSpill __x) { - std::vector<ManagedRegisterSpill>::push_back(__x); + void push_back(ManagedRegisterSpill x) { + std::vector<ManagedRegisterSpill>::push_back(x); } private: }; diff --git a/compiler/utils/mips/assembler_mips.cc b/compiler/utils/mips/assembler_mips.cc index b972c70eb9..b29974c238 100644 --- a/compiler/utils/mips/assembler_mips.cc +++ b/compiler/utils/mips/assembler_mips.cc @@ -192,6 +192,13 @@ void MipsAssembler::DsFsmInstrFfff(uint32_t instruction, DsFsmInstr(instruction, 0, 0, (1u << in1_out), (1u << in1_out) | (1u << in2) | (1u << in3), 0, 0); } +void MipsAssembler::DsFsmInstrFffr(uint32_t instruction, + FRegister in1_out, + FRegister in2, + Register in3) { + DsFsmInstr(instruction, 0, (1u << in3), (1u << in1_out), (1u << in1_out) | (1u << in2), 0, 0); +} + void MipsAssembler::DsFsmInstrRf(uint32_t instruction, Register out, FRegister in) { DsFsmInstr(instruction, (1u << out), 0, 0, (1u << in), 0, 0); } @@ -1446,6 +1453,26 @@ void MipsAssembler::MovtD(FRegister fd, FRegister fs, int cc) { cc); } +void MipsAssembler::MovzS(FRegister fd, FRegister fs, Register rt) { + CHECK(!IsR6()); + DsFsmInstrFffr(EmitFR(0x11, 0x10, static_cast<FRegister>(rt), fs, fd, 0x12), fd, fs, rt); +} + +void MipsAssembler::MovzD(FRegister fd, FRegister fs, Register rt) { + CHECK(!IsR6()); + DsFsmInstrFffr(EmitFR(0x11, 0x11, static_cast<FRegister>(rt), fs, fd, 0x12), fd, fs, rt); +} + +void MipsAssembler::MovnS(FRegister fd, FRegister fs, Register rt) { + CHECK(!IsR6()); + DsFsmInstrFffr(EmitFR(0x11, 0x10, static_cast<FRegister>(rt), fs, fd, 0x13), fd, fs, rt); +} + +void MipsAssembler::MovnD(FRegister fd, FRegister fs, Register rt) { + CHECK(!IsR6()); + DsFsmInstrFffr(EmitFR(0x11, 0x11, static_cast<FRegister>(rt), fs, fd, 0x13), fd, fs, rt); +} + void MipsAssembler::SelS(FRegister fd, FRegister fs, FRegister ft) { CHECK(IsR6()); DsFsmInstrFfff(EmitFR(0x11, 0x10, ft, fs, fd, 0x10), fd, fs, ft); @@ -1456,6 +1483,26 @@ void MipsAssembler::SelD(FRegister fd, FRegister fs, FRegister ft) { DsFsmInstrFfff(EmitFR(0x11, 0x11, ft, fs, fd, 0x10), fd, fs, ft); } +void MipsAssembler::SeleqzS(FRegister fd, FRegister fs, FRegister ft) { + CHECK(IsR6()); + DsFsmInstrFff(EmitFR(0x11, 0x10, ft, fs, fd, 0x14), fd, fs, ft); +} + +void MipsAssembler::SeleqzD(FRegister fd, FRegister fs, FRegister ft) { + CHECK(IsR6()); + DsFsmInstrFff(EmitFR(0x11, 0x11, ft, fs, fd, 0x14), fd, fs, ft); +} + +void MipsAssembler::SelnezS(FRegister fd, FRegister fs, FRegister ft) { + CHECK(IsR6()); + DsFsmInstrFff(EmitFR(0x11, 0x10, ft, fs, fd, 0x17), fd, fs, ft); +} + +void MipsAssembler::SelnezD(FRegister fd, FRegister fs, FRegister ft) { + CHECK(IsR6()); + DsFsmInstrFff(EmitFR(0x11, 0x11, ft, fs, fd, 0x17), fd, fs, ft); +} + void MipsAssembler::ClassS(FRegister fd, FRegister fs) { CHECK(IsR6()); DsFsmInstrFff(EmitFR(0x11, 0x10, static_cast<FRegister>(0), fs, fd, 0x1b), fd, fs, fs); diff --git a/compiler/utils/mips/assembler_mips.h b/compiler/utils/mips/assembler_mips.h index b932fb82bc..800dc5f9a1 100644 --- a/compiler/utils/mips/assembler_mips.h +++ b/compiler/utils/mips/assembler_mips.h @@ -414,8 +414,16 @@ class MipsAssembler FINAL : public Assembler, public JNIMacroAssembler<PointerSi void MovfD(FRegister fd, FRegister fs, int cc = 0); // R2 void MovtS(FRegister fd, FRegister fs, int cc = 0); // R2 void MovtD(FRegister fd, FRegister fs, int cc = 0); // R2 + void MovzS(FRegister fd, FRegister fs, Register rt); // R2 + void MovzD(FRegister fd, FRegister fs, Register rt); // R2 + void MovnS(FRegister fd, FRegister fs, Register rt); // R2 + void MovnD(FRegister fd, FRegister fs, Register rt); // R2 void SelS(FRegister fd, FRegister fs, FRegister ft); // R6 void SelD(FRegister fd, FRegister fs, FRegister ft); // R6 + void SeleqzS(FRegister fd, FRegister fs, FRegister ft); // R6 + void SeleqzD(FRegister fd, FRegister fs, FRegister ft); // R6 + void SelnezS(FRegister fd, FRegister fs, FRegister ft); // R6 + void SelnezD(FRegister fd, FRegister fs, FRegister ft); // R6 void ClassS(FRegister fd, FRegister fs); // R6 void ClassD(FRegister fd, FRegister fs); // R6 void MinS(FRegister fd, FRegister fs, FRegister ft); // R6 @@ -1257,6 +1265,7 @@ class MipsAssembler FINAL : public Assembler, public JNIMacroAssembler<PointerSi void DsFsmInstrRrrr(uint32_t instruction, Register in1_out, Register in2, Register in3); void DsFsmInstrFff(uint32_t instruction, FRegister out, FRegister in1, FRegister in2); void DsFsmInstrFfff(uint32_t instruction, FRegister in1_out, FRegister in2, FRegister in3); + void DsFsmInstrFffr(uint32_t instruction, FRegister in1_out, FRegister in2, Register in3); void DsFsmInstrRf(uint32_t instruction, Register out, FRegister in); void DsFsmInstrFr(uint32_t instruction, FRegister out, Register in); void DsFsmInstrFR(uint32_t instruction, FRegister in1, Register in2); diff --git a/compiler/utils/mips/assembler_mips32r6_test.cc b/compiler/utils/mips/assembler_mips32r6_test.cc index 750a94df02..a52f519439 100644 --- a/compiler/utils/mips/assembler_mips32r6_test.cc +++ b/compiler/utils/mips/assembler_mips32r6_test.cc @@ -219,7 +219,7 @@ class AssemblerMIPS32r6Test : public AssemblerTest<mips::MipsAssembler, void BranchCondTwoRegsHelper(void (mips::MipsAssembler::*f)(mips::Register, mips::Register, mips::MipsLabel*), - std::string instr_name) { + const std::string& instr_name) { mips::MipsLabel label; (Base::GetAssembler()->*f)(mips::A0, mips::A1, &label); constexpr size_t kAdduCount1 = 63; @@ -349,6 +349,26 @@ TEST_F(AssemblerMIPS32r6Test, SelD) { DriverStr(RepeatFFF(&mips::MipsAssembler::SelD, "sel.d ${reg1}, ${reg2}, ${reg3}"), "sel.d"); } +TEST_F(AssemblerMIPS32r6Test, SeleqzS) { + DriverStr(RepeatFFF(&mips::MipsAssembler::SeleqzS, "seleqz.s ${reg1}, ${reg2}, ${reg3}"), + "seleqz.s"); +} + +TEST_F(AssemblerMIPS32r6Test, SeleqzD) { + DriverStr(RepeatFFF(&mips::MipsAssembler::SeleqzD, "seleqz.d ${reg1}, ${reg2}, ${reg3}"), + "seleqz.d"); +} + +TEST_F(AssemblerMIPS32r6Test, SelnezS) { + DriverStr(RepeatFFF(&mips::MipsAssembler::SelnezS, "selnez.s ${reg1}, ${reg2}, ${reg3}"), + "selnez.s"); +} + +TEST_F(AssemblerMIPS32r6Test, SelnezD) { + DriverStr(RepeatFFF(&mips::MipsAssembler::SelnezD, "selnez.d ${reg1}, ${reg2}, ${reg3}"), + "selnez.d"); +} + TEST_F(AssemblerMIPS32r6Test, ClassS) { DriverStr(RepeatFF(&mips::MipsAssembler::ClassS, "class.s ${reg1}, ${reg2}"), "class.s"); } diff --git a/compiler/utils/mips/assembler_mips_test.cc b/compiler/utils/mips/assembler_mips_test.cc index a9abf2f86e..c24e1b16fb 100644 --- a/compiler/utils/mips/assembler_mips_test.cc +++ b/compiler/utils/mips/assembler_mips_test.cc @@ -188,7 +188,7 @@ class AssemblerMIPSTest : public AssemblerTest<mips::MipsAssembler, void BranchCondOneRegHelper(void (mips::MipsAssembler::*f)(mips::Register, mips::MipsLabel*), - std::string instr_name) { + const std::string& instr_name) { mips::MipsLabel label; (Base::GetAssembler()->*f)(mips::A0, &label); constexpr size_t kAdduCount1 = 63; @@ -217,7 +217,7 @@ class AssemblerMIPSTest : public AssemblerTest<mips::MipsAssembler, void BranchCondTwoRegsHelper(void (mips::MipsAssembler::*f)(mips::Register, mips::Register, mips::MipsLabel*), - std::string instr_name) { + const std::string& instr_name) { mips::MipsLabel label; (Base::GetAssembler()->*f)(mips::A0, mips::A1, &label); constexpr size_t kAdduCount1 = 63; @@ -667,6 +667,22 @@ TEST_F(AssemblerMIPSTest, MovtD) { "MovtD"); } +TEST_F(AssemblerMIPSTest, MovzS) { + DriverStr(RepeatFFR(&mips::MipsAssembler::MovzS, "movz.s ${reg1}, ${reg2}, ${reg3}"), "MovzS"); +} + +TEST_F(AssemblerMIPSTest, MovzD) { + DriverStr(RepeatFFR(&mips::MipsAssembler::MovzD, "movz.d ${reg1}, ${reg2}, ${reg3}"), "MovzD"); +} + +TEST_F(AssemblerMIPSTest, MovnS) { + DriverStr(RepeatFFR(&mips::MipsAssembler::MovnS, "movn.s ${reg1}, ${reg2}, ${reg3}"), "MovnS"); +} + +TEST_F(AssemblerMIPSTest, MovnD) { + DriverStr(RepeatFFR(&mips::MipsAssembler::MovnD, "movn.d ${reg1}, ${reg2}, ${reg3}"), "MovnD"); +} + TEST_F(AssemblerMIPSTest, CvtSW) { DriverStr(RepeatFF(&mips::MipsAssembler::Cvtsw, "cvt.s.w ${reg1}, ${reg2}"), "CvtSW"); } diff --git a/compiler/utils/mips64/assembler_mips64_test.cc b/compiler/utils/mips64/assembler_mips64_test.cc index 1fdef96fe4..ba8f25ea77 100644 --- a/compiler/utils/mips64/assembler_mips64_test.cc +++ b/compiler/utils/mips64/assembler_mips64_test.cc @@ -212,7 +212,7 @@ class AssemblerMIPS64Test : public AssemblerTest<mips64::Mips64Assembler, void BranchCondOneRegHelper(void (mips64::Mips64Assembler::*f)(mips64::GpuRegister, mips64::Mips64Label*), - std::string instr_name) { + const std::string& instr_name) { mips64::Mips64Label label; (Base::GetAssembler()->*f)(mips64::A0, &label); constexpr size_t kAdduCount1 = 63; @@ -241,7 +241,7 @@ class AssemblerMIPS64Test : public AssemblerTest<mips64::Mips64Assembler, void BranchCondTwoRegsHelper(void (mips64::Mips64Assembler::*f)(mips64::GpuRegister, mips64::GpuRegister, mips64::Mips64Label*), - std::string instr_name) { + const std::string& instr_name) { mips64::Mips64Label label; (Base::GetAssembler()->*f)(mips64::A0, mips64::A1, &label); constexpr size_t kAdduCount1 = 63; |