summaryrefslogtreecommitdiff
path: root/compiler/utils/assembler_test.h
diff options
context:
space:
mode:
author Lifang Xia <lifang_xia@linux.alibaba.com> 2023-03-15 13:36:40 +0800
committer VladimĂ­r Marko <vmarko@google.com> 2023-05-02 17:00:03 +0000
commit60fdcb2b277e878eb3b2326ec516fe5d3d801174 (patch)
tree60d38cf458b74e218d178ebde56482aff17ae991 /compiler/utils/assembler_test.h
parent66a77df367635ee087809d9de04bc87a75e42f83 (diff)
Add assembler for riscv64, part 1.
Test: m test-art-host-gtest Bug: 271573990 Signed-off-by: Lifang Xia <lifang_xia@linux.alibaba.com> Signed-off-by: Wendong Wang <wangwd@xcvmbyte.com> Signed-off-by: Cao Xia <caoxia@eswincomputing.com> Change-Id: Ie1306521b8df28173b9be40f754e114bd849985b
Diffstat (limited to 'compiler/utils/assembler_test.h')
-rw-r--r--compiler/utils/assembler_test.h98
1 files changed, 98 insertions, 0 deletions
diff --git a/compiler/utils/assembler_test.h b/compiler/utils/assembler_test.h
index d03e5a7abc..f8a7f61f75 100644
--- a/compiler/utils/assembler_test.h
+++ b/compiler/utils/assembler_test.h
@@ -488,6 +488,19 @@ class AssemblerTest : public AssemblerTestBase {
fmt);
}
+ std::string RepeatFFFF(void (Ass::*f)(FPReg, FPReg, FPReg, FPReg), const std::string& fmt) {
+ return RepeatTemplatedRegisters<FPReg, FPReg, FPReg, FPReg>(f,
+ GetFPRegisters(),
+ GetFPRegisters(),
+ GetFPRegisters(),
+ GetFPRegisters(),
+ &AssemblerTest::GetFPRegName,
+ &AssemblerTest::GetFPRegName,
+ &AssemblerTest::GetFPRegName,
+ &AssemblerTest::GetFPRegName,
+ fmt);
+ }
+
std::string RepeatFFR(void (Ass::*f)(FPReg, FPReg, Reg), const std::string& fmt) {
return RepeatTemplatedRegisters<FPReg, FPReg, Reg>(
f,
@@ -538,6 +551,32 @@ class AssemblerTest : public AssemblerTestBase {
fmt);
}
+ std::string RepeatRFF(void (Ass::*f)(Reg, FPReg, FPReg), const std::string& fmt) {
+ return RepeatTemplatedRegisters<Reg, FPReg, FPReg>(
+ f,
+ GetRegisters(),
+ GetFPRegisters(),
+ GetFPRegisters(),
+ &AssemblerTest::GetRegName<RegisterView::kUsePrimaryName>,
+ &AssemblerTest::GetFPRegName,
+ &AssemblerTest::GetFPRegName,
+ fmt);
+ }
+
+ template <typename ImmType>
+ std::string RepeatRFIb(void (Ass::*f)(Reg, FPReg, ImmType),
+ int imm_bits,
+ const std::string& fmt) {
+ return RepeatTemplatedRegistersImmBits<Reg, FPReg, ImmType>(
+ f,
+ imm_bits,
+ GetRegisters(),
+ GetFPRegisters(),
+ &AssemblerTest::GetRegName<RegisterView::kUsePrimaryName>,
+ &AssemblerTest::GetFPRegName,
+ fmt);
+ }
+
std::string RepeatFR(void (Ass::*f)(FPReg, Reg), const std::string& fmt) {
return RepeatTemplatedRegisters<FPReg, Reg>(f,
GetFPRegisters(),
@@ -1417,6 +1456,64 @@ class AssemblerTest : public AssemblerTestBase {
return str;
}
+ template <typename Reg1, typename Reg2, typename Reg3, typename Reg4>
+ std::string RepeatTemplatedRegisters(void (Ass::*f)(Reg1, Reg2, Reg3, Reg4),
+ const std::vector<Reg1*>& reg1_registers,
+ const std::vector<Reg2*>& reg2_registers,
+ const std::vector<Reg3*>& reg3_registers,
+ const std::vector<Reg4*>& reg4_registers,
+ std::string (AssemblerTest::*GetName1)(const Reg1&),
+ std::string (AssemblerTest::*GetName2)(const Reg2&),
+ std::string (AssemblerTest::*GetName3)(const Reg3&),
+ std::string (AssemblerTest::*GetName4)(const Reg4&),
+ const std::string& fmt) {
+ std::string str;
+ for (auto reg1 : reg1_registers) {
+ for (auto reg2 : reg2_registers) {
+ for (auto reg3 : reg3_registers) {
+ for (auto reg4 : reg4_registers) {
+ if (f != nullptr) {
+ (assembler_.get()->*f)(*reg1, *reg2, *reg3, *reg4);
+ }
+ std::string base = fmt;
+
+ std::string reg1_string = (this->*GetName1)(*reg1);
+ size_t reg1_index;
+ while ((reg1_index = base.find(REG1_TOKEN)) != std::string::npos) {
+ base.replace(reg1_index, ConstexprStrLen(REG1_TOKEN), reg1_string);
+ }
+
+ std::string reg2_string = (this->*GetName2)(*reg2);
+ size_t reg2_index;
+ while ((reg2_index = base.find(REG2_TOKEN)) != std::string::npos) {
+ base.replace(reg2_index, ConstexprStrLen(REG2_TOKEN), reg2_string);
+ }
+
+ std::string reg3_string = (this->*GetName3)(*reg3);
+ size_t reg3_index;
+ while ((reg3_index = base.find(REG3_TOKEN)) != std::string::npos) {
+ base.replace(reg3_index, ConstexprStrLen(REG3_TOKEN), reg3_string);
+ }
+
+ std::string reg4_string = (this->*GetName4)(*reg4);
+ size_t reg4_index;
+ while ((reg4_index = base.find(REG4_TOKEN)) != std::string::npos) {
+ base.replace(reg4_index, ConstexprStrLen(REG3_TOKEN), reg4_string);
+ }
+
+ if (str.size() > 0) {
+ str += "\n";
+ }
+ str += base;
+ }
+ }
+ }
+ }
+ // Add a newline at the end.
+ str += "\n";
+ return str;
+ }
+
template <typename Reg1, typename Reg2>
std::string RepeatTemplatedRegistersImm(void (Ass::*f)(Reg1, Reg2, const Imm&),
const std::vector<Reg1*> reg1_registers,
@@ -1522,6 +1619,7 @@ class AssemblerTest : public AssemblerTestBase {
static constexpr const char* REG1_TOKEN = "{reg1}";
static constexpr const char* REG2_TOKEN = "{reg2}";
static constexpr const char* REG3_TOKEN = "{reg3}";
+ static constexpr const char* REG4_TOKEN = "{reg4}";
static constexpr const char* IMM_TOKEN = "{imm}";
private: