summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--compiler/utils/riscv64/assembler_riscv64.cc4
-rw-r--r--compiler/utils/riscv64/assembler_riscv64_test.cc37
2 files changed, 35 insertions, 6 deletions
diff --git a/compiler/utils/riscv64/assembler_riscv64.cc b/compiler/utils/riscv64/assembler_riscv64.cc
index c07a714b90..fd714c7594 100644
--- a/compiler/utils/riscv64/assembler_riscv64.cc
+++ b/compiler/utils/riscv64/assembler_riscv64.cc
@@ -390,18 +390,22 @@ void Riscv64Assembler::Remuw(XRegister rd, XRegister rs1, XRegister rs2) {
/////////////////////////////// RV64 "A" Instructions START ///////////////////////////////
void Riscv64Assembler::LrW(XRegister rd, XRegister rs1, AqRl aqrl) {
+ CHECK(aqrl != AqRl::kRelease);
EmitR4(0x2, enum_cast<uint32_t>(aqrl), 0x0, rs1, 0x2, rd, 0x2f);
}
void Riscv64Assembler::LrD(XRegister rd, XRegister rs1, AqRl aqrl) {
+ CHECK(aqrl != AqRl::kRelease);
EmitR4(0x2, enum_cast<uint32_t>(aqrl), 0x0, rs1, 0x3, rd, 0x2f);
}
void Riscv64Assembler::ScW(XRegister rd, XRegister rs2, XRegister rs1, AqRl aqrl) {
+ CHECK(aqrl != AqRl::kAcquire);
EmitR4(0x3, enum_cast<uint32_t>(aqrl), rs2, rs1, 0x2, rd, 0x2f);
}
void Riscv64Assembler::ScD(XRegister rd, XRegister rs2, XRegister rs1, AqRl aqrl) {
+ CHECK(aqrl != AqRl::kAcquire);
EmitR4(0x3, enum_cast<uint32_t>(aqrl), rs2, rs1, 0x3, rd, 0x2f);
}
diff --git a/compiler/utils/riscv64/assembler_riscv64_test.cc b/compiler/utils/riscv64/assembler_riscv64_test.cc
index bb093d35a7..0299ac25c5 100644
--- a/compiler/utils/riscv64/assembler_riscv64_test.cc
+++ b/compiler/utils/riscv64/assembler_riscv64_test.cc
@@ -1001,13 +1001,18 @@ class AssemblerRISCV64Test : public AssemblerTest<Riscv64Assembler,
fmt);
}
+ template <typename InvalidAqRl>
std::string RepeatRRAqRl(void (Riscv64Assembler::*f)(XRegister, XRegister, AqRl),
- const std::string& fmt) {
+ const std::string& fmt,
+ InvalidAqRl&& invalid_aqrl) {
CHECK(f != nullptr);
std::string str;
for (XRegister reg1 : GetRegisters()) {
for (XRegister reg2 : GetRegisters()) {
for (AqRl aqrl : kAqRls) {
+ if (invalid_aqrl(aqrl)) {
+ continue;
+ }
(GetAssembler()->*f)(reg1, reg2, aqrl);
std::string base = fmt;
@@ -1022,14 +1027,19 @@ class AssemblerRISCV64Test : public AssemblerTest<Riscv64Assembler,
return str;
}
+ template <typename InvalidAqRl>
std::string RepeatRRRAqRl(void (Riscv64Assembler::*f)(XRegister, XRegister, XRegister, AqRl),
- const std::string& fmt) {
+ const std::string& fmt,
+ InvalidAqRl&& invalid_aqrl) {
CHECK(f != nullptr);
std::string str;
for (XRegister reg1 : GetRegisters()) {
for (XRegister reg2 : GetRegisters()) {
for (XRegister reg3 : GetRegisters()) {
for (AqRl aqrl : kAqRls) {
+ if (invalid_aqrl(aqrl)) {
+ continue;
+ }
(GetAssembler()->*f)(reg1, reg2, reg3, aqrl);
std::string base = fmt;
@@ -1046,6 +1056,11 @@ class AssemblerRISCV64Test : public AssemblerTest<Riscv64Assembler,
return str;
}
+ std::string RepeatRRRAqRl(void (Riscv64Assembler::*f)(XRegister, XRegister, XRegister, AqRl),
+ const std::string& fmt) {
+ return RepeatRRRAqRl(f, fmt, [](AqRl) { return false; });
+ }
+
std::string RepeatCsrrX(void (Riscv64Assembler::*f)(XRegister, uint32_t, XRegister),
const std::string& fmt) {
CHECK(f != nullptr);
@@ -1538,19 +1553,29 @@ TEST_F(AssemblerRISCV64Test, Remuw) {
}
TEST_F(AssemblerRISCV64Test, LrW) {
- DriverStr(RepeatRRAqRl(&Riscv64Assembler::LrW, "lr.w{aqrl} {reg1}, ({reg2})"), "LrW");
+ auto invalid_aqrl = [](AqRl aqrl) { return aqrl == AqRl::kRelease; };
+ DriverStr(RepeatRRAqRl(&Riscv64Assembler::LrW, "lr.w{aqrl} {reg1}, ({reg2})", invalid_aqrl),
+ "LrW");
}
TEST_F(AssemblerRISCV64Test, LrD) {
- DriverStr(RepeatRRAqRl(&Riscv64Assembler::LrD, "lr.d{aqrl} {reg1}, ({reg2})"), "LrD");
+ auto invalid_aqrl = [](AqRl aqrl) { return aqrl == AqRl::kRelease; };
+ DriverStr(RepeatRRAqRl(&Riscv64Assembler::LrD, "lr.d{aqrl} {reg1}, ({reg2})", invalid_aqrl),
+ "LrD");
}
TEST_F(AssemblerRISCV64Test, ScW) {
- DriverStr(RepeatRRRAqRl(&Riscv64Assembler::ScW, "sc.w{aqrl} {reg1}, {reg2}, ({reg3})"), "ScW");
+ auto invalid_aqrl = [](AqRl aqrl) { return aqrl == AqRl::kAcquire; };
+ DriverStr(
+ RepeatRRRAqRl(&Riscv64Assembler::ScW, "sc.w{aqrl} {reg1}, {reg2}, ({reg3})", invalid_aqrl),
+ "ScW");
}
TEST_F(AssemblerRISCV64Test, ScD) {
- DriverStr(RepeatRRRAqRl(&Riscv64Assembler::ScD, "sc.d{aqrl} {reg1}, {reg2}, ({reg3})"), "ScD");
+ auto invalid_aqrl = [](AqRl aqrl) { return aqrl == AqRl::kAcquire; };
+ DriverStr(
+ RepeatRRRAqRl(&Riscv64Assembler::ScD, "sc.d{aqrl} {reg1}, {reg2}, ({reg3})", invalid_aqrl),
+ "ScD");
}
TEST_F(AssemblerRISCV64Test, AmoSwapW) {