riscv64: Make "C" extension default for assembler tests.

Move responsibility for restricting the instruction set to
individual tests.

Test: m test-art-host-gtest
Bug: 283082089
Change-Id: I4a4f96df2d3b8fd1feae4b56cf13053b542ee732
diff --git a/compiler/utils/assembler_test_base.h b/compiler/utils/assembler_test_base.h
index c147217..c534513 100644
--- a/compiler/utils/assembler_test_base.h
+++ b/compiler/utils/assembler_test_base.h
@@ -147,7 +147,7 @@
                 "--compile",
                 "-target",
                 "riscv64-linux-gnu",
-                "-march=rv64imafdv_zba_zbb",
+                "-march=rv64imafdcv_zba_zbb_zca_zcd_zcb",
                 // Force the assembler to fully emit branch instructions instead of leaving
                 // offsets unresolved with relocation information for the linker.
                 "-mno-relax"};
@@ -175,7 +175,7 @@
                 "--no-print-imm-hex",
                 "--no-show-raw-insn",
                 // Disassemble Standard Extensions supported by the assembler.
-                "--mattr=+F,+D,+A,+V,+Zba,+Zbb",
+                "--mattr=+F,+D,+A,+C,+V,+Zba,+Zbb,+Zca,+Zcd,+Zcb",
                 "-M",
                 "no-aliases"};
       default:
diff --git a/compiler/utils/riscv64/assembler_riscv64_test.cc b/compiler/utils/riscv64/assembler_riscv64_test.cc
index 3f7d617..87c7641 100644
--- a/compiler/utils/riscv64/assembler_riscv64_test.cc
+++ b/compiler/utils/riscv64/assembler_riscv64_test.cc
@@ -52,51 +52,39 @@
 
   InstructionSet GetIsa() override { return InstructionSet::kRiscv64; }
 
-  // Clang's assembler takes advantage of certain extensions for emitting constants with `li`
-  // but our assembler does not. For now, we use a simple `-march` to avoid the divergence.
-  // TODO(riscv64): Implement these more efficient patterns in assembler.
-  void SetUseSimpleMarch(bool value) {
-    use_simple_march_ = value;
-  }
-
-  void SetCompressedMode(bool value) { compressed_mode_ = value; }
-
-  struct ScopedCompressedMode {
-    AssemblerRISCV64Test* test_;
-    bool old_cm_, old_sa_;
-
-    explicit ScopedCompressedMode(AssemblerRISCV64Test* test)
-        : test_(test), old_cm_(test->compressed_mode_), old_sa_(test->use_simple_march_) {
-      test->SetUseSimpleMarch(true);
-      test->SetCompressedMode(true);
+  class ScopedMarchOverride {
+   public:
+    ScopedMarchOverride(AssemblerRISCV64Test* test, const std::string& march)
+        : test_(test), old_override_(test->march_override_) {
+      test->march_override_ = march;
     }
 
-    ~ScopedCompressedMode() {
-      test_->SetCompressedMode(old_cm_);
-      test_->SetUseSimpleMarch(old_sa_);
+    ~ScopedMarchOverride() {
+      test_->march_override_ = old_override_;
     }
+
+   private:
+    AssemblerRISCV64Test* const test_;
+    std::optional<std::string> const old_override_;
+  };
+
+  class ScopedCSuppression {
+   public:
+    explicit ScopedCSuppression(AssemblerRISCV64Test* test)
+        : smo_(test, "-march=rv64imafdv_zba_zbb") {}
+
+   private:
+    ScopedMarchOverride smo_;
   };
 
   std::vector<std::string> GetAssemblerCommand() override {
     std::vector<std::string> result = Base::GetAssemblerCommand();
-    if (use_simple_march_) {
+    if (march_override_.has_value()) {
       auto it = std::find_if(result.begin(),
                              result.end(),
                              [](const std::string& s) { return StartsWith(s, "-march="); });
       CHECK(it != result.end());
-      *it = compressed_mode_ ? "-march=rv64imafdcv_zca_zcb_zba_zbb" : "-march=rv64imafdv";
-    }
-    return result;
-  }
-
-  std::vector<std::string> GetDisassemblerCommand() override {
-    std::vector<std::string> result = Base::GetDisassemblerCommand();
-    if (use_simple_march_) {
-      auto it = std::find_if(result.begin(),
-                             result.end(),
-                             [](const std::string& s) { return StartsWith(s, "--mattr="); });
-      CHECK(it != result.end());
-      *it = compressed_mode_ ? "--mattr=+F,+D,+A,+V,+C" : "--mattr=+F,+D,+A,+V";
+      *it = march_override_.value();
     }
     return result;
   }
@@ -2199,13 +2187,13 @@
   std::map<XRegister, std::string, RISCV64CpuRegisterCompare> secondary_register_names_;
 
   std::unique_ptr<const Riscv64InstructionSetFeatures> instruction_set_features_;
-  bool use_simple_march_ = false;
-  bool compressed_mode_ = false;
+  std::optional<std::string> march_override_;
 };
 
 TEST_F(AssemblerRISCV64Test, Toolchain) { EXPECT_TRUE(CheckTools()); }
 
 TEST_F(AssemblerRISCV64Test, Lui) {
+  ScopedCSuppression scs(this);
   DriverStr(RepeatRIb(&Riscv64Assembler::Lui, 20, "lui {reg}, {imm}"), "Lui");
 }
 
@@ -2214,21 +2202,25 @@
 }
 
 TEST_F(AssemblerRISCV64Test, Jal) {
+  ScopedCSuppression scs(this);
   // TODO(riscv64): Change "-19, 2" to "-20, 1" for "C" Standard Extension.
   DriverStr(RepeatRIbS(&Riscv64Assembler::Jal, -19, 2, "jal {reg}, {imm}\n"), "Jal");
 }
 
 TEST_F(AssemblerRISCV64Test, Jalr) {
+  ScopedCSuppression scs(this);
   // TODO(riscv64): Change "-11, 2" to "-12, 1" for "C" Standard Extension.
   DriverStr(RepeatRRIb(&Riscv64Assembler::Jalr, -12, "jalr {reg1}, {reg2}, {imm}\n"), "Jalr");
 }
 
 TEST_F(AssemblerRISCV64Test, Beq) {
+  ScopedCSuppression scs(this);
   // TODO(riscv64): Change "-11, 2" to "-12, 1" for "C" Standard Extension.
   DriverStr(RepeatRRIbS(&Riscv64Assembler::Beq, -11, 2, "beq {reg1}, {reg2}, {imm}\n"), "Beq");
 }
 
 TEST_F(AssemblerRISCV64Test, Bne) {
+  ScopedCSuppression scs(this);
   // TODO(riscv64): Change "-11, 2" to "-12, 1" for "C" Standard Extension.
   DriverStr(RepeatRRIbS(&Riscv64Assembler::Bne, -11, 2, "bne {reg1}, {reg2}, {imm}\n"), "Bne");
 }
@@ -2254,50 +2246,62 @@
 }
 
 TEST_F(AssemblerRISCV64Test, Lb) {
+  // Note: There is no 16-bit instruction for `Lb()`.
   DriverStr(RepeatRRIb(&Riscv64Assembler::Lb, -12, "lb {reg1}, {imm}({reg2})"), "Lb");
 }
 
 TEST_F(AssemblerRISCV64Test, Lh) {
+  ScopedCSuppression scs(this);
   DriverStr(RepeatRRIb(&Riscv64Assembler::Lh, -12, "lh {reg1}, {imm}({reg2})"), "Lh");
 }
 
 TEST_F(AssemblerRISCV64Test, Lw) {
+  ScopedCSuppression scs(this);
   DriverStr(RepeatRRIb(&Riscv64Assembler::Lw, -12, "lw {reg1}, {imm}({reg2})"), "Lw");
 }
 
 TEST_F(AssemblerRISCV64Test, Ld) {
+  ScopedCSuppression scs(this);
   DriverStr(RepeatRRIb(&Riscv64Assembler::Ld, -12, "ld {reg1}, {imm}({reg2})"), "Ld");
 }
 
 TEST_F(AssemblerRISCV64Test, Lbu) {
+  ScopedCSuppression scs(this);
   DriverStr(RepeatRRIb(&Riscv64Assembler::Lbu, -12, "lbu {reg1}, {imm}({reg2})"), "Lbu");
 }
 
 TEST_F(AssemblerRISCV64Test, Lhu) {
+  ScopedCSuppression scs(this);
   DriverStr(RepeatRRIb(&Riscv64Assembler::Lhu, -12, "lhu {reg1}, {imm}({reg2})"), "Lhu");
 }
 
 TEST_F(AssemblerRISCV64Test, Lwu) {
+  // Note: There is no 16-bit instruction for `Lwu()`.
   DriverStr(RepeatRRIb(&Riscv64Assembler::Lwu, -12, "lwu {reg1}, {imm}({reg2})"), "Lwu");
 }
 
 TEST_F(AssemblerRISCV64Test, Sb) {
+  ScopedCSuppression scs(this);
   DriverStr(RepeatRRIb(&Riscv64Assembler::Sb, -12, "sb {reg1}, {imm}({reg2})"), "Sb");
 }
 
 TEST_F(AssemblerRISCV64Test, Sh) {
+  ScopedCSuppression scs(this);
   DriverStr(RepeatRRIb(&Riscv64Assembler::Sh, -12, "sh {reg1}, {imm}({reg2})"), "Sh");
 }
 
 TEST_F(AssemblerRISCV64Test, Sw) {
+  ScopedCSuppression scs(this);
   DriverStr(RepeatRRIb(&Riscv64Assembler::Sw, -12, "sw {reg1}, {imm}({reg2})"), "Sw");
 }
 
 TEST_F(AssemblerRISCV64Test, Sd) {
+  ScopedCSuppression scs(this);
   DriverStr(RepeatRRIb(&Riscv64Assembler::Sd, -12, "sd {reg1}, {imm}({reg2})"), "Sd");
 }
 
 TEST_F(AssemblerRISCV64Test, Addi) {
+  ScopedCSuppression scs(this);
   DriverStr(RepeatRRIb(&Riscv64Assembler::Addi, -12, "addi {reg1}, {reg2}, {imm}"), "Addi");
 }
 
@@ -2318,26 +2322,32 @@
 }
 
 TEST_F(AssemblerRISCV64Test, Andi) {
+  ScopedCSuppression scs(this);
   DriverStr(RepeatRRIb(&Riscv64Assembler::Andi, -12, "andi {reg1}, {reg2}, {imm}"), "Andi");
 }
 
 TEST_F(AssemblerRISCV64Test, Slli) {
+  ScopedCSuppression scs(this);
   DriverStr(RepeatRRIb(&Riscv64Assembler::Slli, 6, "slli {reg1}, {reg2}, {imm}"), "Slli");
 }
 
 TEST_F(AssemblerRISCV64Test, Srli) {
+  ScopedCSuppression scs(this);
   DriverStr(RepeatRRIb(&Riscv64Assembler::Srli, 6, "srli {reg1}, {reg2}, {imm}"), "Srli");
 }
 
 TEST_F(AssemblerRISCV64Test, Srai) {
+  ScopedCSuppression scs(this);
   DriverStr(RepeatRRIb(&Riscv64Assembler::Srai, 6, "srai {reg1}, {reg2}, {imm}"), "Srai");
 }
 
 TEST_F(AssemblerRISCV64Test, Add) {
+  ScopedCSuppression scs(this);
   DriverStr(RepeatRRR(&Riscv64Assembler::Add, "add {reg1}, {reg2}, {reg3}"), "Add");
 }
 
 TEST_F(AssemblerRISCV64Test, Sub) {
+  ScopedCSuppression scs(this);
   DriverStr(RepeatRRR(&Riscv64Assembler::Sub, "sub {reg1}, {reg2}, {reg3}"), "Sub");
 }
 
@@ -2350,14 +2360,17 @@
 }
 
 TEST_F(AssemblerRISCV64Test, Xor) {
+  ScopedCSuppression scs(this);
   DriverStr(RepeatRRR(&Riscv64Assembler::Xor, "xor {reg1}, {reg2}, {reg3}"), "Xor");
 }
 
 TEST_F(AssemblerRISCV64Test, Or) {
+  ScopedCSuppression scs(this);
   DriverStr(RepeatRRR(&Riscv64Assembler::Or, "or {reg1}, {reg2}, {reg3}"), "Or");
 }
 
 TEST_F(AssemblerRISCV64Test, And) {
+  ScopedCSuppression scs(this);
   DriverStr(RepeatRRR(&Riscv64Assembler::And, "and {reg1}, {reg2}, {reg3}"), "And");
 }
 
@@ -2374,6 +2387,7 @@
 }
 
 TEST_F(AssemblerRISCV64Test, Addiw) {
+  ScopedCSuppression scs(this);
   DriverStr(RepeatRRIb(&Riscv64Assembler::Addiw, -12, "addiw {reg1}, {reg2}, {imm}"), "Addiw");
 }
 
@@ -2393,10 +2407,12 @@
 }
 
 TEST_F(AssemblerRISCV64Test, Addw) {
+  ScopedCSuppression scs(this);
   DriverStr(RepeatRRR(&Riscv64Assembler::Addw, "addw {reg1}, {reg2}, {reg3}"), "Addw");
 }
 
 TEST_F(AssemblerRISCV64Test, Subw) {
+  ScopedCSuppression scs(this);
   DriverStr(RepeatRRR(&Riscv64Assembler::Subw, "subw {reg1}, {reg2}, {reg3}"), "Subw");
 }
 
@@ -2418,6 +2434,7 @@
 }
 
 TEST_F(AssemblerRISCV64Test, Ebreak) {
+  ScopedCSuppression scs(this);
   __ Ebreak();
   DriverStr("ebreak\n", "Ebreak");
 }
@@ -2468,6 +2485,7 @@
 }
 
 TEST_F(AssemblerRISCV64Test, Mul) {
+  ScopedCSuppression scs(this);
   DriverStr(RepeatRRR(&Riscv64Assembler::Mul, "mul {reg1}, {reg2}, {reg3}"), "Mul");
 }
 
@@ -2660,18 +2678,22 @@
 }
 
 TEST_F(AssemblerRISCV64Test, FLw) {
+  // Note: 16-bit variants of `flw` are not available on riscv64.
   DriverStr(RepeatFRIb(&Riscv64Assembler::FLw, -12, "flw {reg1}, {imm}({reg2})"), "FLw");
 }
 
 TEST_F(AssemblerRISCV64Test, FLd) {
+  ScopedCSuppression scs(this);
   DriverStr(RepeatFRIb(&Riscv64Assembler::FLd, -12, "fld {reg1}, {imm}({reg2})"), "FLw");
 }
 
 TEST_F(AssemblerRISCV64Test, FSw) {
+  // Note: 16-bit variants of `fsw` are not available on riscv64.
   DriverStr(RepeatFRIb(&Riscv64Assembler::FSw, 2, "fsw {reg1}, {imm}({reg2})"), "FSw");
 }
 
 TEST_F(AssemblerRISCV64Test, FSd) {
+  ScopedCSuppression scs(this);
   DriverStr(RepeatFRIb(&Riscv64Assembler::FSd, 2, "fsd {reg1}, {imm}({reg2})"), "FSd");
 }
 
@@ -3102,7 +3124,6 @@
 }
 
 TEST_F(AssemblerRISCV64Test, CLwsp) {
-  ScopedCompressedMode cm(this);
   DriverStr(RepeatCRImm(&Riscv64Assembler::CLwsp,
                         /*is_short=*/false,
                         /*no_zero_reg=*/true,
@@ -3114,7 +3135,6 @@
 }
 
 TEST_F(AssemblerRISCV64Test, CLdsp) {
-  ScopedCompressedMode cm(this);
   DriverStr(RepeatCRImm(&Riscv64Assembler::CLdsp,
                         /*is_short=*/false,
                         /*no_zero_reg=*/true,
@@ -3126,14 +3146,12 @@
 }
 
 TEST_F(AssemblerRISCV64Test, CFLdsp) {
-  ScopedCompressedMode cm(this);
   DriverStr(RepeatCFImm(
                 &Riscv64Assembler::CFLdsp, /*imm_bits=*/6, /*shift=*/3, "c.fldsp {reg}, {imm}(sp)"),
             "CFLdsp");
 }
 
 TEST_F(AssemblerRISCV64Test, CSwsp) {
-  ScopedCompressedMode cm(this);
   DriverStr(RepeatCRImm(&Riscv64Assembler::CSwsp,
                         /*is_short=*/false,
                         /*no_zero_reg=*/false,
@@ -3145,7 +3163,6 @@
 }
 
 TEST_F(AssemblerRISCV64Test, CSdsp) {
-  ScopedCompressedMode cm(this);
   DriverStr(RepeatCRImm(&Riscv64Assembler::CSdsp,
                         /*is_short=*/false,
                         /*no_zero_reg=*/false,
@@ -3157,28 +3174,24 @@
 }
 
 TEST_F(AssemblerRISCV64Test, CFSdsp) {
-  ScopedCompressedMode cm(this);
   DriverStr(RepeatCFImm(
                 &Riscv64Assembler::CFSdsp, /*imm_bits=*/6, /*shift=*/3, "c.fsdsp {reg}, {imm}(sp)"),
             "CFLdsp");
 }
 
 TEST_F(AssemblerRISCV64Test, CLw) {
-  ScopedCompressedMode cm(this);
   DriverStr(RepeatCRRImm(
                 &Riscv64Assembler::CLw, /*imm_bits=*/5, /*shift=*/2, "c.lw {reg1}, {imm}({reg2})"),
             "CLw");
 }
 
 TEST_F(AssemblerRISCV64Test, CLd) {
-  ScopedCompressedMode cm(this);
   DriverStr(RepeatCRRImm(
                 &Riscv64Assembler::CLd, /*imm_bits=*/5, /*shift=*/3, "c.ld {reg1}, {imm}({reg2})"),
             "CLd");
 }
 
 TEST_F(AssemblerRISCV64Test, CFLd) {
-  ScopedCompressedMode cm(this);
   DriverStr(RepeatCFRImm(&Riscv64Assembler::CFLd,
                          /*imm_bits=*/5,
                          /*shift=*/3,
@@ -3187,21 +3200,18 @@
 }
 
 TEST_F(AssemblerRISCV64Test, CSw) {
-  ScopedCompressedMode cm(this);
   DriverStr(RepeatCRRImm(
                 &Riscv64Assembler::CSw, /*imm_bits=*/5, /*shift=*/2, "c.sw {reg1}, {imm}({reg2})"),
             "CSw");
 }
 
 TEST_F(AssemblerRISCV64Test, CSd) {
-  ScopedCompressedMode cm(this);
   DriverStr(RepeatCRRImm(
                 &Riscv64Assembler::CSd, /*imm_bits=*/5, /*shift=*/3, "c.sd {reg1}, {imm}({reg2})"),
             "CSd");
 }
 
 TEST_F(AssemblerRISCV64Test, CFSd) {
-  ScopedCompressedMode cm(this);
   DriverStr(RepeatCFRImm(&Riscv64Assembler::CFSd,
                          /*imm_bits=*/5,
                          /*shift=*/3,
@@ -3210,7 +3220,6 @@
 }
 
 TEST_F(AssemblerRISCV64Test, CLi) {
-  ScopedCompressedMode cm(this);
   DriverStr(RepeatCRImm(&Riscv64Assembler::CLi,
                         /*is_short=*/false,
                         /*no_zero_reg=*/true,
@@ -3222,7 +3231,6 @@
 }
 
 TEST_F(AssemblerRISCV64Test, CLui) {
-  ScopedCompressedMode cm(this);
   std::string str;
   auto imms = CreateImmediateValuesBits(/*imm_bits=*/5, /*as_uint=*/true);
   for (uint32_t v = 0xfffe0; v <= 0xfffff; ++v) {
@@ -3254,7 +3262,6 @@
 }
 
 TEST_F(AssemblerRISCV64Test, CAddi) {
-  ScopedCompressedMode cm(this);
   DriverStr(RepeatCRImm(&Riscv64Assembler::CAddi,
                         /*is_short=*/false,
                         /*no_zero_reg=*/true,
@@ -3266,7 +3273,6 @@
 }
 
 TEST_F(AssemblerRISCV64Test, CAddiw) {
-  ScopedCompressedMode cm(this);
   DriverStr(RepeatCRImm(&Riscv64Assembler::CAddiw,
                         /*is_short=*/false,
                         /*no_zero_reg=*/true,
@@ -3278,7 +3284,6 @@
 }
 
 TEST_F(AssemblerRISCV64Test, CAddi16Sp) {
-  ScopedCompressedMode cm(this);
   DriverStr(RepeatImm(&Riscv64Assembler::CAddi16Sp,
                       /*no_zero_imm=*/true,
                       /*imm_bits=*/-6,
@@ -3288,7 +3293,6 @@
 }
 
 TEST_F(AssemblerRISCV64Test, CAddi4Spn) {
-  ScopedCompressedMode cm(this);
   DriverStr(RepeatCRImm(&Riscv64Assembler::CAddi4Spn,
                         /*is_short=*/true,
                         /*no_zero_reg=*/false,
@@ -3300,7 +3304,6 @@
 }
 
 TEST_F(AssemblerRISCV64Test, CSlli) {
-  ScopedCompressedMode cm(this);
   DriverStr(RepeatCRImm(&Riscv64Assembler::CSlli,
                         /*is_short=*/false,
                         /*no_zero_reg=*/true,
@@ -3312,7 +3315,6 @@
 }
 
 TEST_F(AssemblerRISCV64Test, CSRli) {
-  ScopedCompressedMode cm(this);
   DriverStr(RepeatCRImm(&Riscv64Assembler::CSrli,
                         /*is_short=*/true,
                         /*no_zero_reg=*/false,
@@ -3324,7 +3326,6 @@
 }
 
 TEST_F(AssemblerRISCV64Test, CSRai) {
-  ScopedCompressedMode cm(this);
   DriverStr(RepeatCRImm(&Riscv64Assembler::CSrai,
                         /*is_short=*/true,
                         /*no_zero_reg=*/false,
@@ -3336,7 +3337,6 @@
 }
 
 TEST_F(AssemblerRISCV64Test, CAndi) {
-  ScopedCompressedMode cm(this);
   DriverStr(RepeatCRImm(&Riscv64Assembler::CAndi,
                         /*is_short=*/true,
                         /*no_zero_reg=*/false,
@@ -3348,47 +3348,38 @@
 }
 
 TEST_F(AssemblerRISCV64Test, CMv) {
-  ScopedCompressedMode cm(this);
   DriverStr(RepeatCRRNonZero(&Riscv64Assembler::CMv, "c.mv {reg1}, {reg2}"), "CMv");
 }
 
 TEST_F(AssemblerRISCV64Test, CAdd) {
-  ScopedCompressedMode cm(this);
   DriverStr(RepeatCRRNonZero(&Riscv64Assembler::CAdd, "c.add {reg1}, {reg2}"), "CAdd");
 }
 
 TEST_F(AssemblerRISCV64Test, CAnd) {
-  ScopedCompressedMode cm(this);
   DriverStr(RepeatCRRShort(&Riscv64Assembler::CAnd, "c.and {reg1}, {reg2}"), "CAnd");
 }
 
 TEST_F(AssemblerRISCV64Test, COr) {
-  ScopedCompressedMode cm(this);
   DriverStr(RepeatCRRShort(&Riscv64Assembler::COr, "c.or {reg1}, {reg2}"), "COr");
 }
 
 TEST_F(AssemblerRISCV64Test, CXor) {
-  ScopedCompressedMode cm(this);
   DriverStr(RepeatCRRShort(&Riscv64Assembler::CXor, "c.xor {reg1}, {reg2}"), "CXor");
 }
 
 TEST_F(AssemblerRISCV64Test, CSub) {
-  ScopedCompressedMode cm(this);
   DriverStr(RepeatCRRShort(&Riscv64Assembler::CSub, "c.sub {reg1}, {reg2}"), "CSub");
 }
 
 TEST_F(AssemblerRISCV64Test, CAddw) {
-  ScopedCompressedMode cm(this);
   DriverStr(RepeatCRRShort(&Riscv64Assembler::CAddw, "c.addw {reg1}, {reg2}"), "CAddw");
 }
 
 TEST_F(AssemblerRISCV64Test, CSubw) {
-  ScopedCompressedMode cm(this);
   DriverStr(RepeatCRRShort(&Riscv64Assembler::CSubw, "c.subw {reg1}, {reg2}"), "CSubw");
 }
 
 TEST_F(AssemblerRISCV64Test, CLbu) {
-  ScopedCompressedMode cm(this);
   DriverStr(RepeatCRRImm(&Riscv64Assembler::CLbu,
                          /*imm_bits=*/2,
                          /*shift=*/0,
@@ -3397,7 +3388,6 @@
 }
 
 TEST_F(AssemblerRISCV64Test, CLhu) {
-  ScopedCompressedMode cm(this);
   DriverStr(RepeatCRRImm(&Riscv64Assembler::CLhu,
                          /*imm_bits=*/1,
                          /*shift=*/1,
@@ -3406,7 +3396,6 @@
 }
 
 TEST_F(AssemblerRISCV64Test, CLh) {
-  ScopedCompressedMode cm(this);
   DriverStr(RepeatCRRImm(&Riscv64Assembler::CLh,
                          /*imm_bits=*/1,
                          /*shift=*/1,
@@ -3415,7 +3404,6 @@
 }
 
 TEST_F(AssemblerRISCV64Test, CSb) {
-  ScopedCompressedMode cm(this);
   DriverStr(RepeatCRRImm(&Riscv64Assembler::CSb,
                          /*imm_bits=*/2,
                          /*shift=*/0,
@@ -3424,7 +3412,6 @@
 }
 
 TEST_F(AssemblerRISCV64Test, CSh) {
-  ScopedCompressedMode cm(this);
   DriverStr(RepeatCRRImm(&Riscv64Assembler::CSh,
                          /*imm_bits=*/1,
                          /*shift=*/1,
@@ -3433,42 +3420,34 @@
 }
 
 TEST_F(AssemblerRISCV64Test, CZext_b) {
-  ScopedCompressedMode cm(this);
   DriverStr(RepeatCRShort(&Riscv64Assembler::CZext_b, "c.zext.b {reg}"), "CZext_b");
 }
 
 TEST_F(AssemblerRISCV64Test, CSext_b) {
-  ScopedCompressedMode cm(this);
   DriverStr(RepeatCRShort(&Riscv64Assembler::CSext_b, "c.sext.b {reg}"), "CSext_b");
 }
 
 TEST_F(AssemblerRISCV64Test, CZext_h) {
-  ScopedCompressedMode cm(this);
   DriverStr(RepeatCRShort(&Riscv64Assembler::CZext_h, "c.zext.h {reg}"), "CZext_h");
 }
 
 TEST_F(AssemblerRISCV64Test, CSext_h) {
-  ScopedCompressedMode cm(this);
   DriverStr(RepeatCRShort(&Riscv64Assembler::CSext_h, "c.sext.h {reg}"), "CSext_h");
 }
 
 TEST_F(AssemblerRISCV64Test, CZext_w) {
-  ScopedCompressedMode cm(this);
   DriverStr(RepeatCRShort(&Riscv64Assembler::CZext_w, "c.zext.w {reg}"), "CZext_w");
 }
 
 TEST_F(AssemblerRISCV64Test, CNot) {
-  ScopedCompressedMode cm(this);
   DriverStr(RepeatCRShort(&Riscv64Assembler::CNot, "c.not {reg}"), "CNot");
 }
 
 TEST_F(AssemblerRISCV64Test, CMul) {
-  ScopedCompressedMode cm(this);
   DriverStr(RepeatCRRShort(&Riscv64Assembler::CMul, "c.mul {reg1}, {reg2}"), "CMul");
 }
 
 TEST_F(AssemblerRISCV64Test, CJ) {
-  ScopedCompressedMode cm(this);
   DriverStr(
       RepeatImm(
           &Riscv64Assembler::CJ, /*no_zero_imm=*/false, /*imm_bits=*/-11, /*shift=*/1, "c.j {imm}"),
@@ -3476,17 +3455,14 @@
 }
 
 TEST_F(AssemblerRISCV64Test, CJr) {
-  ScopedCompressedMode cm(this);
   DriverStr(RepeatRNoZero(&Riscv64Assembler::CJr, "c.jr {reg}"), "CJr");
 }
 
 TEST_F(AssemblerRISCV64Test, CJalr) {
-  ScopedCompressedMode cm(this);
   DriverStr(RepeatRNoZero(&Riscv64Assembler::CJalr, "c.jalr {reg}"), "CJalr");
 }
 
 TEST_F(AssemblerRISCV64Test, CBeqz) {
-  ScopedCompressedMode cm(this);
   DriverStr(RepeatCRImm(&Riscv64Assembler::CBeqz,
                         /*is_short=*/true,
                         /*no_zero_reg=*/false,
@@ -3498,7 +3474,6 @@
 }
 
 TEST_F(AssemblerRISCV64Test, CBnez) {
-  ScopedCompressedMode cm(this);
   DriverStr(RepeatCRImm(&Riscv64Assembler::CBnez,
                         /*is_short=*/true,
                         /*no_zero_reg=*/false,
@@ -3510,24 +3485,22 @@
 }
 
 TEST_F(AssemblerRISCV64Test, CEbreak) {
-  ScopedCompressedMode cm(this);
   __ CEbreak();
   DriverStr("c.ebreak", "CEbreak");
 }
 
 TEST_F(AssemblerRISCV64Test, CNop) {
-  ScopedCompressedMode cm(this);
   __ CNop();
   DriverStr("c.nop", "CNop");
 }
 
 TEST_F(AssemblerRISCV64Test, CUnimp) {
-  ScopedCompressedMode cm(this);
   __ CUnimp();
   DriverStr("c.unimp", "CUnimp");
 }
 
 TEST_F(AssemblerRISCV64Test, AddUw) {
+  ScopedCSuppression scs(this);  // Avoid `c.zext.w`.
   DriverStr(RepeatRRR(&Riscv64Assembler::AddUw, "add.uw {reg1}, {reg2}, {reg3}"), "AddUw");
 }
 
@@ -3645,14 +3618,17 @@
 }
 
 TEST_F(AssemblerRISCV64Test, ZbbSextB) {
+  ScopedCSuppression scs(this);
   DriverStr(RepeatRR(&Riscv64Assembler::ZbbSextB, "sext.b {reg1}, {reg2}"), "ZbbSextB");
 }
 
 TEST_F(AssemblerRISCV64Test, ZbbSextH) {
+  ScopedCSuppression scs(this);
   DriverStr(RepeatRR(&Riscv64Assembler::ZbbSextH, "sext.h {reg1}, {reg2}"), "ZbbSextH");
 }
 
 TEST_F(AssemblerRISCV64Test, ZbbZextH) {
+  ScopedCSuppression scs(this);
   DriverStr(RepeatRR(&Riscv64Assembler::ZbbZextH, "zext.h {reg1}, {reg2}"), "ZbbZextH");
 }
 
@@ -7868,22 +7844,25 @@
 
 // Pseudo instructions.
 TEST_F(AssemblerRISCV64Test, Nop) {
+  ScopedCSuppression scs(this);
   __ Nop();
   DriverStr("addi zero,zero,0", "Nop");
 }
 
 TEST_F(AssemblerRISCV64Test, Li) {
-  SetUseSimpleMarch(true);
+  ScopedMarchOverride smo(this, "-march=rv64imafd");
   TestLoadConst64("Li",
                   /*can_use_tmp=*/ false,
                   [&](XRegister rd, int64_t value) { __ Li(rd, value); });
 }
 
 TEST_F(AssemblerRISCV64Test, Mv) {
+  ScopedCSuppression scs(this);
   DriverStr(RepeatRR(&Riscv64Assembler::Mv, "addi {reg1}, {reg2}, 0"), "Mv");
 }
 
 TEST_F(AssemblerRISCV64Test, Not) {
+  ScopedCSuppression scs(this);
   DriverStr(RepeatRR(&Riscv64Assembler::Not, "xori {reg1}, {reg2}, -1"), "Not");
 }
 
@@ -7896,6 +7875,7 @@
 }
 
 TEST_F(AssemblerRISCV64Test, SextB) {
+  ScopedCSuppression scs(this);
   // Note: SEXT.B from the Zbb extension is not supported.
   DriverStr(RepeatRR(&Riscv64Assembler::SextB,
                      "slli {reg1}, {reg2}, 56\n"
@@ -7904,6 +7884,7 @@
 }
 
 TEST_F(AssemblerRISCV64Test, SextH) {
+  ScopedCSuppression scs(this);
   // Note: SEXT.H from the Zbb extension is not supported.
   DriverStr(RepeatRR(&Riscv64Assembler::SextH,
                      "slli {reg1}, {reg2}, 48\n"
@@ -7912,14 +7893,17 @@
 }
 
 TEST_F(AssemblerRISCV64Test, SextW) {
+  ScopedCSuppression scs(this);
   DriverStr(RepeatRR(&Riscv64Assembler::SextW, "addiw {reg1}, {reg2}, 0\n"), "SextW");
 }
 
 TEST_F(AssemblerRISCV64Test, ZextB) {
+  ScopedCSuppression scs(this);
   DriverStr(RepeatRR(&Riscv64Assembler::ZextB, "andi {reg1}, {reg2}, 255"), "ZextB");
 }
 
 TEST_F(AssemblerRISCV64Test, ZextH) {
+  ScopedCSuppression scs(this);
   // Note: ZEXT.H from the Zbb extension is not supported.
   DriverStr(RepeatRR(&Riscv64Assembler::ZextH,
                      "slli {reg1}, {reg2}, 48\n"
@@ -7928,6 +7912,7 @@
 }
 
 TEST_F(AssemblerRISCV64Test, ZextW) {
+  ScopedCSuppression scs(this);
   DriverStr(RepeatRR(&Riscv64Assembler::ZextW,
                      "slli {reg1}, {reg2}, 32\n"
                      "srli {reg1}, {reg1}, 32"),
@@ -7975,11 +7960,13 @@
 }
 
 TEST_F(AssemblerRISCV64Test, Beqz) {
+  ScopedCSuppression scs(this);
   // TODO(riscv64): Change "-11, 2" to "-12, 1" for "C" Standard Extension.
   DriverStr(RepeatRIbS(&Riscv64Assembler::Beqz, -11, 2, "beq {reg}, zero, {imm}\n"), "Beqz");
 }
 
 TEST_F(AssemblerRISCV64Test, Bnez) {
+  ScopedCSuppression scs(this);
   // TODO(riscv64): Change "-11, 2" to "-12, 1" for "C" Standard Extension.
   DriverStr(RepeatRIbS(&Riscv64Assembler::Bnez, -11, 2, "bne {reg}, zero, {imm}\n"), "Bnez");
 }
@@ -8025,6 +8012,7 @@
 }
 
 TEST_F(AssemblerRISCV64Test, J) {
+  ScopedCSuppression scs(this);
   // TODO(riscv64): Change "-19, 2" to "-20, 1" for "C" Standard Extension.
   DriverStr(RepeatIbS<int32_t>(&Riscv64Assembler::J, -19, 2, "j {imm}\n"), "J");
 }
@@ -8035,18 +8023,22 @@
 }
 
 TEST_F(AssemblerRISCV64Test, Jr) {
+  ScopedCSuppression scs(this);
   DriverStr(RepeatR(&Riscv64Assembler::Jr, "jr {reg}\n"), "Jr");
 }
 
 TEST_F(AssemblerRISCV64Test, JalrRA) {
+  ScopedCSuppression scs(this);
   DriverStr(RepeatR(&Riscv64Assembler::Jalr, "jalr {reg}\n"), "JalrRA");
 }
 
 TEST_F(AssemblerRISCV64Test, Jalr0) {
+  ScopedCSuppression scs(this);
   DriverStr(RepeatRR(&Riscv64Assembler::Jalr, "jalr {reg1}, {reg2}\n"), "Jalr0");
 }
 
 TEST_F(AssemblerRISCV64Test, Ret) {
+  ScopedCSuppression scs(this);
   __ Ret();
   DriverStr("ret\n", "Ret");
 }
@@ -8099,6 +8091,7 @@
 }
 
 TEST_F(AssemblerRISCV64Test, LoadConst32) {
+  ScopedCSuppression scs(this);
   // `LoadConst32()` emits the same code sequences as `Li()` for 32-bit values.
   ScratchRegisterScope srs(GetAssembler());
   srs.ExcludeXRegister(TMP);
@@ -8107,13 +8100,14 @@
 }
 
 TEST_F(AssemblerRISCV64Test, LoadConst64) {
-  SetUseSimpleMarch(true);
+  ScopedMarchOverride smo(this, "-march=rv64imafd");
   TestLoadConst64("LoadConst64",
                   /*can_use_tmp=*/ true,
                   [&](XRegister rd, int64_t value) { __ LoadConst64(rd, value); });
 }
 
 TEST_F(AssemblerRISCV64Test, AddConst32) {
+  ScopedCSuppression scs(this);
   auto emit_op = [&](XRegister rd, XRegister rs1, int64_t value) {
     __ AddConst32(rd, rs1, dchecked_integral_cast<int32_t>(value));
   };
@@ -8121,7 +8115,7 @@
 }
 
 TEST_F(AssemblerRISCV64Test, AddConst64) {
-  SetUseSimpleMarch(true);
+  ScopedMarchOverride smo(this, "-march=rv64imafd");
   auto emit_op = [&](XRegister rd, XRegister rs1, int64_t value) {
     __ AddConst64(rd, rs1, value);
   };
@@ -8129,38 +8123,47 @@
 }
 
 TEST_F(AssemblerRISCV64Test, BcondForward3KiB) {
+  ScopedCSuppression scs(this);
   TestBcondForward("BcondForward3KiB", 3 * KB, "1", GetPrintBcond());
 }
 
 TEST_F(AssemblerRISCV64Test, BcondForward3KiBBare) {
+  ScopedCSuppression scs(this);
   TestBcondForward("BcondForward3KiB", 3 * KB, "1", GetPrintBcond(), /*is_bare=*/ true);
 }
 
 TEST_F(AssemblerRISCV64Test, BcondBackward3KiB) {
+  ScopedCSuppression scs(this);
   TestBcondBackward("BcondBackward3KiB", 3 * KB, "1", GetPrintBcond());
 }
 
 TEST_F(AssemblerRISCV64Test, BcondBackward3KiBBare) {
+  ScopedCSuppression scs(this);
   TestBcondBackward("BcondBackward3KiB", 3 * KB, "1", GetPrintBcond(), /*is_bare=*/ true);
 }
 
 TEST_F(AssemblerRISCV64Test, BcondForward5KiB) {
+  ScopedCSuppression scs(this);
   TestBcondForward("BcondForward5KiB", 5 * KB, "1", GetPrintBcondOppositeAndJ("2"));
 }
 
 TEST_F(AssemblerRISCV64Test, BcondBackward5KiB) {
+  ScopedCSuppression scs(this);
   TestBcondBackward("BcondBackward5KiB", 5 * KB, "1", GetPrintBcondOppositeAndJ("2"));
 }
 
 TEST_F(AssemblerRISCV64Test, BcondForward2MiB) {
+  ScopedCSuppression scs(this);
   TestBcondForward("BcondForward2MiB", 2 * MB, "1", GetPrintBcondOppositeAndTail("2", "3"));
 }
 
 TEST_F(AssemblerRISCV64Test, BcondBackward2MiB) {
+  ScopedCSuppression scs(this);
   TestBcondBackward("BcondBackward2MiB", 2 * MB, "1", GetPrintBcondOppositeAndTail("2", "3"));
 }
 
 TEST_F(AssemblerRISCV64Test, BeqA0A1MaxOffset13Forward) {
+  ScopedCSuppression scs(this);
   TestBeqA0A1Forward("BeqA0A1MaxOffset13Forward",
                      MaxOffset13ForwardDistance() - /*BEQ*/ 4u,
                      "1",
@@ -8168,6 +8171,7 @@
 }
 
 TEST_F(AssemblerRISCV64Test, BeqA0A1MaxOffset13ForwardBare) {
+  ScopedCSuppression scs(this);
   TestBeqA0A1Forward("BeqA0A1MaxOffset13ForwardBare",
                      MaxOffset13ForwardDistance() - /*BEQ*/ 4u,
                      "1",
@@ -8176,6 +8180,7 @@
 }
 
 TEST_F(AssemblerRISCV64Test, BeqA0A1MaxOffset13Backward) {
+  ScopedCSuppression scs(this);
   TestBeqA0A1Backward("BeqA0A1MaxOffset13Forward",
                       MaxOffset13BackwardDistance(),
                       "1",
@@ -8183,6 +8188,7 @@
 }
 
 TEST_F(AssemblerRISCV64Test, BeqA0A1MaxOffset13BackwardBare) {
+  ScopedCSuppression scs(this);
   TestBeqA0A1Backward("BeqA0A1MaxOffset13ForwardBare",
                       MaxOffset13BackwardDistance(),
                       "1",
@@ -8191,6 +8197,7 @@
 }
 
 TEST_F(AssemblerRISCV64Test, BeqA0A1OverMaxOffset13Forward) {
+  ScopedCSuppression scs(this);
   TestBeqA0A1Forward("BeqA0A1OverMaxOffset13Forward",
                      MaxOffset13ForwardDistance() - /*BEQ*/ 4u + /*Exceed max*/ 4u,
                      "1",
@@ -8198,6 +8205,7 @@
 }
 
 TEST_F(AssemblerRISCV64Test, BeqA0A1OverMaxOffset13Backward) {
+  ScopedCSuppression scs(this);
   TestBeqA0A1Backward("BeqA0A1OverMaxOffset13Forward",
                       MaxOffset13BackwardDistance() + /*Exceed max*/ 4u,
                       "1",
@@ -8205,6 +8213,7 @@
 }
 
 TEST_F(AssemblerRISCV64Test, BeqA0A1MaxOffset21Forward) {
+  ScopedCSuppression scs(this);
   TestBeqA0A1Forward("BeqA0A1MaxOffset21Forward",
                      MaxOffset21ForwardDistance() - /*J*/ 4u,
                      "1",
@@ -8212,6 +8221,7 @@
 }
 
 TEST_F(AssemblerRISCV64Test, BeqA0A1MaxOffset21Backward) {
+  ScopedCSuppression scs(this);
   TestBeqA0A1Backward("BeqA0A1MaxOffset21Backward",
                       MaxOffset21BackwardDistance() - /*BNE*/ 4u,
                       "1",
@@ -8219,6 +8229,7 @@
 }
 
 TEST_F(AssemblerRISCV64Test, BeqA0A1OverMaxOffset21Forward) {
+  ScopedCSuppression scs(this);
   TestBeqA0A1Forward("BeqA0A1OverMaxOffset21Forward",
                      MaxOffset21ForwardDistance() - /*J*/ 4u + /*Exceed max*/ 4u,
                      "1",
@@ -8226,6 +8237,7 @@
 }
 
 TEST_F(AssemblerRISCV64Test, BeqA0A1OverMaxOffset21Backward) {
+  ScopedCSuppression scs(this);
   TestBeqA0A1Backward("BeqA0A1OverMaxOffset21Backward",
                       MaxOffset21BackwardDistance() - /*BNE*/ 4u + /*Exceed max*/ 4u,
                       "1",
@@ -8233,15 +8245,18 @@
 }
 
 TEST_F(AssemblerRISCV64Test, BeqA0A1AlmostCascade) {
+  ScopedCSuppression scs(this);
   TestBeqA0A1MaybeCascade("BeqA0A1AlmostCascade", /*cascade=*/ false, GetPrintBcond());
 }
 
 TEST_F(AssemblerRISCV64Test, BeqA0A1Cascade) {
+  ScopedCSuppression scs(this);
   TestBeqA0A1MaybeCascade(
       "BeqA0A1AlmostCascade", /*cascade=*/ true, GetPrintBcondOppositeAndJ("1"));
 }
 
 TEST_F(AssemblerRISCV64Test, BcondElimination) {
+  ScopedCSuppression scs(this);
   Riscv64Label label;
   __ Bind(&label);
   __ Nop();
@@ -8256,6 +8271,7 @@
 }
 
 TEST_F(AssemblerRISCV64Test, BcondUnconditional) {
+  ScopedCSuppression scs(this);
   Riscv64Label label;
   __ Bind(&label);
   __ Nop();
@@ -8274,54 +8290,67 @@
 }
 
 TEST_F(AssemblerRISCV64Test, JalRdForward3KiB) {
+  ScopedCSuppression scs(this);
   TestJalRdForward("JalRdForward3KiB", 3 * KB, "1", GetPrintJalRd());
 }
 
 TEST_F(AssemblerRISCV64Test, JalRdForward3KiBBare) {
+  ScopedCSuppression scs(this);
   TestJalRdForward("JalRdForward3KiB", 3 * KB, "1", GetPrintJalRd(), /*is_bare=*/ true);
 }
 
 TEST_F(AssemblerRISCV64Test, JalRdBackward3KiB) {
+  ScopedCSuppression scs(this);
   TestJalRdBackward("JalRdBackward3KiB", 3 * KB, "1", GetPrintJalRd());
 }
 
 TEST_F(AssemblerRISCV64Test, JalRdBackward3KiBBare) {
+  ScopedCSuppression scs(this);
   TestJalRdBackward("JalRdBackward3KiB", 3 * KB, "1", GetPrintJalRd(), /*is_bare=*/ true);
 }
 
 TEST_F(AssemblerRISCV64Test, JalRdForward2MiB) {
+  ScopedCSuppression scs(this);
   TestJalRdForward("JalRdForward2MiB", 2 * MB, "1", GetPrintCallRd("2"));
 }
 
 TEST_F(AssemblerRISCV64Test, JalRdBackward2MiB) {
+  ScopedCSuppression scs(this);
   TestJalRdBackward("JalRdBackward2MiB", 2 * MB, "1", GetPrintCallRd("2"));
 }
 
 TEST_F(AssemblerRISCV64Test, JForward3KiB) {
+  ScopedCSuppression scs(this);
   TestBuncondForward("JForward3KiB", 3 * KB, "1", GetEmitJ(), GetPrintJ());
 }
 
 TEST_F(AssemblerRISCV64Test, JForward3KiBBare) {
+  ScopedCSuppression scs(this);
   TestBuncondForward("JForward3KiB", 3 * KB, "1", GetEmitJ(/*is_bare=*/ true), GetPrintJ());
 }
 
 TEST_F(AssemblerRISCV64Test, JBackward3KiB) {
+  ScopedCSuppression scs(this);
   TestBuncondBackward("JBackward3KiB", 3 * KB, "1", GetEmitJ(), GetPrintJ());
 }
 
 TEST_F(AssemblerRISCV64Test, JBackward3KiBBare) {
+  ScopedCSuppression scs(this);
   TestBuncondBackward("JBackward3KiB", 3 * KB, "1", GetEmitJ(/*is_bare=*/ true), GetPrintJ());
 }
 
 TEST_F(AssemblerRISCV64Test, JForward2MiB) {
+  ScopedCSuppression scs(this);
   TestBuncondForward("JForward2MiB", 2 * MB, "1", GetEmitJ(), GetPrintTail("2"));
 }
 
 TEST_F(AssemblerRISCV64Test, JBackward2MiB) {
+  ScopedCSuppression scs(this);
   TestBuncondBackward("JBackward2MiB", 2 * MB, "1", GetEmitJ(), GetPrintTail("2"));
 }
 
 TEST_F(AssemblerRISCV64Test, JMaxOffset21Forward) {
+  ScopedCSuppression scs(this);
   TestBuncondForward("JMaxOffset21Forward",
                      MaxOffset21ForwardDistance() - /*J*/ 4u,
                      "1",
@@ -8330,6 +8359,7 @@
 }
 
 TEST_F(AssemblerRISCV64Test, JMaxOffset21ForwardBare) {
+  ScopedCSuppression scs(this);
   TestBuncondForward("JMaxOffset21Forward",
                      MaxOffset21ForwardDistance() - /*J*/ 4u,
                      "1",
@@ -8338,6 +8368,7 @@
 }
 
 TEST_F(AssemblerRISCV64Test, JMaxOffset21Backward) {
+  ScopedCSuppression scs(this);
   TestBuncondBackward("JMaxOffset21Backward",
                       MaxOffset21BackwardDistance(),
                       "1",
@@ -8346,6 +8377,7 @@
 }
 
 TEST_F(AssemblerRISCV64Test, JMaxOffset21BackwardBare) {
+  ScopedCSuppression scs(this);
   TestBuncondBackward("JMaxOffset21Backward",
                       MaxOffset21BackwardDistance(),
                       "1",
@@ -8354,6 +8386,7 @@
 }
 
 TEST_F(AssemblerRISCV64Test, JOverMaxOffset21Forward) {
+  ScopedCSuppression scs(this);
   TestBuncondForward("JOverMaxOffset21Forward",
                      MaxOffset21ForwardDistance() - /*J*/ 4u + /*Exceed max*/ 4u,
                      "1",
@@ -8362,6 +8395,7 @@
 }
 
 TEST_F(AssemblerRISCV64Test, JOverMaxOffset21Backward) {
+  ScopedCSuppression scs(this);
   TestBuncondBackward("JMaxOffset21Backward",
                       MaxOffset21BackwardDistance() + /*Exceed max*/ 4u,
                       "1",
@@ -8370,22 +8404,27 @@
 }
 
 TEST_F(AssemblerRISCV64Test, CallForward3KiB) {
+  ScopedCSuppression scs(this);
   TestBuncondForward("CallForward3KiB", 3 * KB, "1", GetEmitJal(), GetPrintJal());
 }
 
 TEST_F(AssemblerRISCV64Test, CallBackward3KiB) {
+  ScopedCSuppression scs(this);
   TestBuncondBackward("CallBackward3KiB", 3 * KB, "1", GetEmitJal(), GetPrintJal());
 }
 
 TEST_F(AssemblerRISCV64Test, CallForward2MiB) {
+  ScopedCSuppression scs(this);
   TestBuncondForward("CallForward2MiB", 2 * MB, "1", GetEmitJal(), GetPrintCall("2"));
 }
 
 TEST_F(AssemblerRISCV64Test, CallBackward2MiB) {
+  ScopedCSuppression scs(this);
   TestBuncondBackward("CallBackward2MiB", 2 * MB, "1", GetEmitJal(), GetPrintCall("2"));
 }
 
 TEST_F(AssemblerRISCV64Test, CallMaxOffset21Forward) {
+  ScopedCSuppression scs(this);
   TestBuncondForward("CallMaxOffset21Forward",
                      MaxOffset21ForwardDistance() - /*J*/ 4u,
                      "1",
@@ -8394,6 +8433,7 @@
 }
 
 TEST_F(AssemblerRISCV64Test, CallMaxOffset21Backward) {
+  ScopedCSuppression scs(this);
   TestBuncondBackward("CallMaxOffset21Backward",
                       MaxOffset21BackwardDistance(),
                       "1",
@@ -8402,6 +8442,7 @@
 }
 
 TEST_F(AssemblerRISCV64Test, CallOverMaxOffset21Forward) {
+  ScopedCSuppression scs(this);
   TestBuncondForward("CallOverMaxOffset21Forward",
                      MaxOffset21ForwardDistance() - /*J*/ 4u + /*Exceed max*/ 4u,
                      "1",
@@ -8410,6 +8451,7 @@
 }
 
 TEST_F(AssemblerRISCV64Test, CallOverMaxOffset21Backward) {
+  ScopedCSuppression scs(this);
   TestBuncondBackward("CallMaxOffset21Backward",
                       MaxOffset21BackwardDistance() + /*Exceed max*/ 4u,
                       "1",
@@ -8418,66 +8460,82 @@
 }
 
 TEST_F(AssemblerRISCV64Test, Loadb) {
+  ScopedCSuppression scs(this);  // Suppress 16-bit instructions for address formation.
   TestLoadStoreArbitraryOffset("Loadb", "lb", &Riscv64Assembler::Loadb, /*is_store=*/ false);
 }
 
 TEST_F(AssemblerRISCV64Test, Loadh) {
+  ScopedCSuppression scs(this);
   TestLoadStoreArbitraryOffset("Loadh", "lh", &Riscv64Assembler::Loadh, /*is_store=*/ false);
 }
 
 TEST_F(AssemblerRISCV64Test, Loadw) {
+  ScopedCSuppression scs(this);
   TestLoadStoreArbitraryOffset("Loadw", "lw", &Riscv64Assembler::Loadw, /*is_store=*/ false);
 }
 
 TEST_F(AssemblerRISCV64Test, Loadd) {
+  ScopedCSuppression scs(this);
   TestLoadStoreArbitraryOffset("Loadd", "ld", &Riscv64Assembler::Loadd, /*is_store=*/ false);
 }
 
 TEST_F(AssemblerRISCV64Test, Loadbu) {
+  ScopedCSuppression scs(this);
   TestLoadStoreArbitraryOffset("Loadbu", "lbu", &Riscv64Assembler::Loadbu, /*is_store=*/ false);
 }
 
 TEST_F(AssemblerRISCV64Test, Loadhu) {
+  ScopedCSuppression scs(this);
   TestLoadStoreArbitraryOffset("Loadhu", "lhu", &Riscv64Assembler::Loadhu, /*is_store=*/ false);
 }
 
 TEST_F(AssemblerRISCV64Test, Loadwu) {
+  ScopedCSuppression scs(this);  // Suppress 16-bit instructions for address formation.
   TestLoadStoreArbitraryOffset("Loadwu", "lwu", &Riscv64Assembler::Loadwu, /*is_store=*/ false);
 }
 
 TEST_F(AssemblerRISCV64Test, Storeb) {
+  ScopedCSuppression scs(this);
   TestLoadStoreArbitraryOffset("Storeb", "sb", &Riscv64Assembler::Storeb, /*is_store=*/ true);
 }
 
 TEST_F(AssemblerRISCV64Test, Storeh) {
+  ScopedCSuppression scs(this);
   TestLoadStoreArbitraryOffset("Storeh", "sh", &Riscv64Assembler::Storeh, /*is_store=*/ true);
 }
 
 TEST_F(AssemblerRISCV64Test, Storew) {
+  ScopedCSuppression scs(this);
   TestLoadStoreArbitraryOffset("Storew", "sw", &Riscv64Assembler::Storew, /*is_store=*/ true);
 }
 
 TEST_F(AssemblerRISCV64Test, Stored) {
+  ScopedCSuppression scs(this);
   TestLoadStoreArbitraryOffset("Stored", "sd", &Riscv64Assembler::Stored, /*is_store=*/ true);
 }
 
 TEST_F(AssemblerRISCV64Test, FLoadw) {
+  ScopedCSuppression scs(this);  // Suppress 16-bit instructions for address formation.
   TestFPLoadStoreArbitraryOffset("FLoadw", "flw", &Riscv64Assembler::FLoadw);
 }
 
 TEST_F(AssemblerRISCV64Test, FLoadd) {
+  ScopedCSuppression scs(this);
   TestFPLoadStoreArbitraryOffset("FLoadd", "fld", &Riscv64Assembler::FLoadd);
 }
 
 TEST_F(AssemblerRISCV64Test, FStorew) {
+  ScopedCSuppression scs(this);  // Suppress 16-bit instructions for address formation.
   TestFPLoadStoreArbitraryOffset("FStorew", "fsw", &Riscv64Assembler::FStorew);
 }
 
 TEST_F(AssemblerRISCV64Test, FStored) {
+  ScopedCSuppression scs(this);
   TestFPLoadStoreArbitraryOffset("FStored", "fsd", &Riscv64Assembler::FStored);
 }
 
 TEST_F(AssemblerRISCV64Test, Unimp) {
+  ScopedCSuppression scs(this);
   __ Unimp();
   DriverStr("unimp\n", "Unimp");
 }
@@ -8507,14 +8565,17 @@
 }
 
 TEST_F(AssemblerRISCV64Test, LoadLiteralWithPaddingForLong) {
+  ScopedCSuppression scs(this);
   TestLoadLiteral("LoadLiteralWithPaddingForLong", /*with_padding_for_long=*/ true);
 }
 
 TEST_F(AssemblerRISCV64Test, LoadLiteralWithoutPaddingForLong) {
+  ScopedCSuppression scs(this);
   TestLoadLiteral("LoadLiteralWithoutPaddingForLong", /*with_padding_for_long=*/ false);
 }
 
 TEST_F(AssemblerRISCV64Test, JumpTable) {
+  ScopedCSuppression scs(this);
   std::string expected;
   expected += EmitNops(sizeof(uint32_t));
   Riscv64Label targets[4];
diff --git a/compiler/utils/riscv64/jni_macro_assembler_riscv64_test.cc b/compiler/utils/riscv64/jni_macro_assembler_riscv64_test.cc
index be6feeb..9717930 100644
--- a/compiler/utils/riscv64/jni_macro_assembler_riscv64_test.cc
+++ b/compiler/utils/riscv64/jni_macro_assembler_riscv64_test.cc
@@ -46,6 +46,18 @@
  protected:
   InstructionSet GetIsa() override { return InstructionSet::kRiscv64; }
 
+  std::vector<std::string> GetAssemblerCommand() override {
+    std::vector<std::string> result = AssemblerTestBase::GetAssemblerCommand();
+    if (march_override_.has_value()) {
+      auto it = std::find_if(result.begin(),
+                             result.end(),
+                             [](const std::string& s) { return StartsWith(s, "-march="); });
+      CHECK(it != result.end());
+      *it = march_override_.value();
+    }
+    return result;
+  }
+
   void DriverStr(const std::string& assembly_text, const std::string& test_name) {
     assembler_.FinalizeCode();
     size_t cs = assembler_.CodeSize();
@@ -76,6 +88,9 @@
   MallocArenaPool pool_;
   ArenaAllocator allocator_;
   Riscv64JNIMacroAssembler assembler_;
+
+  // TODO: Implement auto-compression and remove this override.
+  std::optional<std::string> march_override_ = "-march=rv64imafdv_zba_zbb";
 };
 
 TEST_F(JniMacroAssemblerRiscv64Test, StackFrame) {
diff --git a/disassembler/disassembler_riscv64.cc b/disassembler/disassembler_riscv64.cc
index 41a6b3f..09e9faf 100644
--- a/disassembler/disassembler_riscv64.cc
+++ b/disassembler/disassembler_riscv64.cc
@@ -163,7 +163,7 @@
 
   // Extracts the immediate from a compressed instruction
   // where `imm[5]` is in bit `[12]` and `imm[4:0]` is in bits `[6:2]`
-  // and performes sign-extension if required
+  // and performs sign-extension if required
   template <typename T>
   static T Decode16Imm6(uint32_t insn16) {
     DCHECK(IsUint<16>(insn16));