blob: 87c7641576fd2cf4a115547addc6b00ccdd5a906 [file] [log] [blame]
/*
* Copyright (C) 2023 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "assembler_riscv64.h"
#include <inttypes.h>
#include <map>
#include "base/bit_utils.h"
#include "utils/assembler_test.h"
#define __ GetAssembler()->
namespace art HIDDEN {
namespace riscv64 {
struct RISCV64CpuRegisterCompare {
bool operator()(const XRegister& a, const XRegister& b) const { return a < b; }
};
class AssemblerRISCV64Test : public AssemblerTest<Riscv64Assembler,
Riscv64Label,
XRegister,
FRegister,
int32_t,
VRegister> {
public:
using Base =
AssemblerTest<Riscv64Assembler, Riscv64Label, XRegister, FRegister, int32_t, VRegister>;
AssemblerRISCV64Test()
: instruction_set_features_(Riscv64InstructionSetFeatures::FromVariant("generic", nullptr)) {}
protected:
Riscv64Assembler* CreateAssembler(ArenaAllocator* allocator) override {
return new (allocator) Riscv64Assembler(allocator, instruction_set_features_.get());
}
InstructionSet GetIsa() override { return InstructionSet::kRiscv64; }
class ScopedMarchOverride {
public:
ScopedMarchOverride(AssemblerRISCV64Test* test, const std::string& march)
: test_(test), old_override_(test->march_override_) {
test->march_override_ = march;
}
~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 (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 SetUpHelpers() override {
if (secondary_register_names_.empty()) {
secondary_register_names_.emplace(Zero, "zero");
secondary_register_names_.emplace(RA, "ra");
secondary_register_names_.emplace(SP, "sp");
secondary_register_names_.emplace(GP, "gp");
secondary_register_names_.emplace(TP, "tp");
secondary_register_names_.emplace(T0, "t0");
secondary_register_names_.emplace(T1, "t1");
secondary_register_names_.emplace(T2, "t2");
secondary_register_names_.emplace(S0, "s0"); // s0/fp
secondary_register_names_.emplace(S1, "s1");
secondary_register_names_.emplace(A0, "a0");
secondary_register_names_.emplace(A1, "a1");
secondary_register_names_.emplace(A2, "a2");
secondary_register_names_.emplace(A3, "a3");
secondary_register_names_.emplace(A4, "a4");
secondary_register_names_.emplace(A5, "a5");
secondary_register_names_.emplace(A6, "a6");
secondary_register_names_.emplace(A7, "a7");
secondary_register_names_.emplace(S2, "s2");
secondary_register_names_.emplace(S3, "s3");
secondary_register_names_.emplace(S4, "s4");
secondary_register_names_.emplace(S5, "s5");
secondary_register_names_.emplace(S6, "s6");
secondary_register_names_.emplace(S7, "s7");
secondary_register_names_.emplace(S8, "s8");
secondary_register_names_.emplace(S9, "s9");
secondary_register_names_.emplace(S10, "s10");
secondary_register_names_.emplace(S11, "s11");
secondary_register_names_.emplace(T3, "t3");
secondary_register_names_.emplace(T4, "t4");
secondary_register_names_.emplace(T5, "t5");
secondary_register_names_.emplace(T6, "t6");
}
}
void TearDown() override {
AssemblerTest::TearDown();
}
std::vector<Riscv64Label> GetAddresses() override {
UNIMPLEMENTED(FATAL) << "Feature not implemented yet";
UNREACHABLE();
}
ArrayRef<const XRegister> GetRegisters() override {
static constexpr XRegister kXRegisters[] = {
Zero,
RA,
SP,
GP,
TP,
T0,
T1,
T2,
S0,
S1,
A0,
A1,
A2,
A3,
A4,
A5,
A6,
A7,
S2,
S3,
S4,
S5,
S6,
S7,
S8,
S9,
S10,
S11,
T3,
T4,
T5,
T6,
};
return ArrayRef<const XRegister>(kXRegisters);
}
ArrayRef<const XRegister> GetRegistersShort() {
static constexpr XRegister kXRegistersShort[] = {
S0,
S1,
A0,
A1,
A2,
A3,
A4,
A5,
};
return ArrayRef<const XRegister>(kXRegistersShort);
}
ArrayRef<const FRegister> GetFPRegisters() override {
static constexpr FRegister kFRegisters[] = {
FT0,
FT1,
FT2,
FT3,
FT4,
FT5,
FT6,
FT7,
FS0,
FS1,
FA0,
FA1,
FA2,
FA3,
FA4,
FA5,
FA6,
FA7,
FS2,
FS3,
FS4,
FS5,
FS6,
FS7,
FS8,
FS9,
FS10,
FS11,
FT8,
FT9,
FT10,
FT11,
};
return ArrayRef<const FRegister>(kFRegisters);
}
ArrayRef<const VRegister> GetVectorRegisters() override {
static constexpr VRegister kVRegisters[] = {
V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14, V15,
V16, V17, V18, V19, V20, V21, V22, V23, V24, V25, V26, V27, V28, V29, V30, V31
};
return ArrayRef<const VRegister>(kVRegisters);
}
ArrayRef<const FRegister> GetFPRegistersShort() {
static constexpr FRegister kFRegistersShort[] = {
FS0,
FS1,
FA0,
FA1,
FA2,
FA3,
FA4,
FA5,
};
return ArrayRef<const FRegister>(kFRegistersShort);
}
std::string GetSecondaryRegisterName(const XRegister& reg) override {
CHECK(secondary_register_names_.find(reg) != secondary_register_names_.end());
return secondary_register_names_[reg];
}
int32_t CreateImmediate(int64_t imm_value) override {
return dchecked_integral_cast<int32_t>(imm_value);
}
template <typename Emit>
std::string RepeatInsn(size_t count, const std::string& insn, Emit&& emit) {
std::string result;
for (; count != 0u; --count) {
result += insn;
emit();
}
return result;
}
std::string EmitNops(size_t size) {
// TODO(riscv64): Support "C" Standard Extension.
DCHECK_ALIGNED(size, sizeof(uint32_t));
const size_t num_nops = size / sizeof(uint32_t);
return RepeatInsn(num_nops, "nop\n", [&]() { __ Nop(); });
}
template <typename EmitLoadConst>
void TestLoadConst64(const std::string& test_name,
bool can_use_tmp,
EmitLoadConst&& emit_load_const) {
std::string expected;
// Test standard immediates. Unlike other instructions, `Li()` accepts an `int64_t` but
// this is unsupported by `CreateImmediate()`, so we cannot use `RepeatRIb()` for these.
// Note: This `CreateImmediateValuesBits()` call does not produce any values where
// `LoadConst64()` would emit different code from `Li()`.
for (int64_t value : CreateImmediateValuesBits(64, /*as_uint=*/ false)) {
emit_load_const(A0, value);
expected += "li a0, " + std::to_string(value) + "\n";
}
// Test various registers with a few small values.
// (Even Zero is an accepted register even if that does not really load the requested value.)
for (XRegister reg : GetRegisters()) {
ScratchRegisterScope srs(GetAssembler());
srs.ExcludeXRegister(reg);
std::string rd = GetRegisterName(reg);
emit_load_const(reg, -1);
expected += "li " + rd + ", -1\n";
emit_load_const(reg, 0);
expected += "li " + rd + ", 0\n";
emit_load_const(reg, 1);
expected += "li " + rd + ", 1\n";
}
// Test some significant values. Some may just repeat the tests above but other values
// show some complex patterns, even exposing a value where clang (and therefore also this
// assembler) does not generate the shortest sequence.
// For the following values, `LoadConst64()` emits the same code as `Li()`.
int64_t test_values1[] = {
// Small values, either ADDI, ADDI+SLLI, LUI, or LUI+ADDIW.
// The ADDI+LUI is presumably used to allow shorter code for RV64C.
-4097, -4096, -4095, -2176, -2049, -2048, -2047, -1025, -1024, -1023, -2, -1,
0, 1, 2, 1023, 1024, 1025, 2047, 2048, 2049, 2176, 4095, 4096, 4097,
// Just below std::numeric_limits<int32_t>::min()
INT64_C(-0x80000001), // LUI+ADDI
INT64_C(-0x80000800), // LUI+ADDI
INT64_C(-0x80000801), // LUI+ADDIW+SLLI+ADDI; LUI+ADDI+ADDI would be shorter.
INT64_C(-0x80000800123), // LUI+ADDIW+SLLI+ADDI
INT64_C(0x0123450000000123), // LUI+SLLI+ADDI
INT64_C(-0x7654300000000123), // LUI+SLLI+ADDI
INT64_C(0x0fffffffffff0000), // LUI+SRLI
INT64_C(0x0ffffffffffff000), // LUI+SRLI
INT64_C(0x0ffffffffffff010), // LUI+ADDIW+SRLI
INT64_C(0x0fffffffffffff10), // ADDI+SLLI+ADDI; LUI+ADDIW+SRLI would be same length.
INT64_C(0x0fffffffffffff80), // ADDI+SRLI
INT64_C(0x0ffffffff7ffff80), // LUI+ADDI+SRLI
INT64_C(0x0123450000001235), // LUI+SLLI+ADDI+SLLI+ADDI
INT64_C(0x0123450000001234), // LUI+SLLI+ADDI+SLLI
INT64_C(0x0000000fff808010), // LUI+SLLI+SRLI
INT64_C(0x00000000fff80801), // LUI+SLLI+SRLI
INT64_C(0x00000000ffffffff), // ADDI+SRLI
INT64_C(0x00000001ffffffff), // ADDI+SRLI
INT64_C(0x00000003ffffffff), // ADDI+SRLI
INT64_C(0x00000000ffc00801), // LUI+ADDIW+SLLI+ADDI
INT64_C(0x00000001fffff7fe), // ADDI+SLLI+SRLI
};
for (int64_t value : test_values1) {
emit_load_const(A0, value);
expected += "li a0, " + std::to_string(value) + "\n";
}
// For the following values, `LoadConst64()` emits different code than `Li()`.
std::pair<int64_t, const char*> test_values2[] = {
// Li: LUI+ADDIW+SLLI+ADDI+SLLI+ADDI+SLLI+ADDI
// LoadConst: LUI+ADDIW+LUI+ADDIW+SLLI+ADD (using TMP)
{ INT64_C(0x1234567812345678),
"li {reg1}, 0x12345678 / 8\n" // Trailing zero bits in high word are handled by SLLI.
"li {reg2}, 0x12345678\n"
"slli {reg1}, {reg1}, 32 + 3\n"
"add {reg1}, {reg1}, {reg2}\n" },
{ INT64_C(0x1234567887654321),
"li {reg1}, 0x12345678 + 1\n" // One higher to compensate for negative TMP.
"li {reg2}, 0x87654321 - 0x100000000\n"
"slli {reg1}, {reg1}, 32\n"
"add {reg1}, {reg1}, {reg2}\n" },
{ INT64_C(-0x1234567887654321),
"li {reg1}, -0x12345678 - 1\n" // High 32 bits of the constant.
"li {reg2}, 0x100000000 - 0x87654321\n" // Low 32 bits of the constant.
"slli {reg1}, {reg1}, 32\n"
"add {reg1}, {reg1}, {reg2}\n" },
// Li: LUI+SLLI+ADDI+SLLI+ADDI+SLLI
// LoadConst: LUI+LUI+SLLI+ADD (using TMP)
{ INT64_C(0x1234500012345000),
"lui {reg1}, 0x12345\n"
"lui {reg2}, 0x12345\n"
"slli {reg1}, {reg1}, 44 - 12\n"
"add {reg1}, {reg1}, {reg2}\n" },
{ INT64_C(0x0123450012345000),
"lui {reg1}, 0x12345\n"
"lui {reg2}, 0x12345\n"
"slli {reg1}, {reg1}, 40 - 12\n"
"add {reg1}, {reg1}, {reg2}\n" },
// Li: LUI+ADDIW+SLLI+ADDI+SLLI+ADDI
// LoadConst: LUI+LUI+ADDIW+SLLI+ADD (using TMP)
{ INT64_C(0x0001234512345678),
"lui {reg1}, 0x12345\n"
"li {reg2}, 0x12345678\n"
"slli {reg1}, {reg1}, 32 - 12\n"
"add {reg1}, {reg1}, {reg2}\n" },
{ INT64_C(0x0012345012345678),
"lui {reg1}, 0x12345\n"
"li {reg2}, 0x12345678\n"
"slli {reg1}, {reg1}, 36 - 12\n"
"add {reg1}, {reg1}, {reg2}\n" },
};
for (auto [value, fmt] : test_values2) {
emit_load_const(A0, value);
if (can_use_tmp) {
std::string base = fmt;
ReplaceReg(REG1_TOKEN, GetRegisterName(A0), &base);
ReplaceReg(REG2_TOKEN, GetRegisterName(TMP), &base);
expected += base;
} else {
expected += "li a0, " + std::to_string(value) + "\n";
}
}
DriverStr(expected, test_name);
}
auto GetPrintBcond() {
return [](const std::string& cond,
[[maybe_unused]] const std::string& opposite_cond,
const std::string& args,
const std::string& target) {
return "b" + cond + args + ", " + target + "\n";
};
}
auto GetPrintBcondOppositeAndJ(const std::string& skip_label) {
return [=]([[maybe_unused]] const std::string& cond,
const std::string& opposite_cond,
const std::string& args,
const std::string& target) {
return "b" + opposite_cond + args + ", " + skip_label + "f\n" +
"j " + target + "\n" +
skip_label + ":\n";
};
}
auto GetPrintBcondOppositeAndTail(const std::string& skip_label, const std::string& base_label) {
return [=]([[maybe_unused]] const std::string& cond,
const std::string& opposite_cond,
const std::string& args,
const std::string& target) {
return "b" + opposite_cond + args + ", " + skip_label + "f\n" +
base_label + ":\n" +
"auipc t6, %pcrel_hi(" + target + ")\n" +
"jalr x0, %pcrel_lo(" + base_label + "b)(t6)\n" +
skip_label + ":\n";
};
}
// Helper function for basic tests that all branch conditions map to the correct opcodes,
// whether with branch expansion (a conditional branch with opposite condition over an
// unconditional branch) or without.
template <typename PrintBcond>
std::string EmitBcondForAllConditions(Riscv64Label* label,
const std::string& target,
PrintBcond&& print_bcond,
bool is_bare) {
XRegister rs = A0;
__ Beqz(rs, label, is_bare);
__ Bnez(rs, label, is_bare);
__ Blez(rs, label, is_bare);
__ Bgez(rs, label, is_bare);
__ Bltz(rs, label, is_bare);
__ Bgtz(rs, label, is_bare);
XRegister rt = A1;
__ Beq(rs, rt, label, is_bare);
__ Bne(rs, rt, label, is_bare);
__ Ble(rs, rt, label, is_bare);
__ Bge(rs, rt, label, is_bare);
__ Blt(rs, rt, label, is_bare);
__ Bgt(rs, rt, label, is_bare);
__ Bleu(rs, rt, label, is_bare);
__ Bgeu(rs, rt, label, is_bare);
__ Bltu(rs, rt, label, is_bare);
__ Bgtu(rs, rt, label, is_bare);
return
print_bcond("eq", "ne", "z a0", target) +
print_bcond("ne", "eq", "z a0", target) +
print_bcond("le", "gt", "z a0", target) +
print_bcond("ge", "lt", "z a0", target) +
print_bcond("lt", "ge", "z a0", target) +
print_bcond("gt", "le", "z a0", target) +
print_bcond("eq", "ne", " a0, a1", target) +
print_bcond("ne", "eq", " a0, a1", target) +
print_bcond("le", "gt", " a0, a1", target) +
print_bcond("ge", "lt", " a0, a1", target) +
print_bcond("lt", "ge", " a0, a1", target) +
print_bcond("gt", "le", " a0, a1", target) +
print_bcond("leu", "gtu", " a0, a1", target) +
print_bcond("geu", "ltu", " a0, a1", target) +
print_bcond("ltu", "geu", " a0, a1", target) +
print_bcond("gtu", "leu", " a0, a1", target);
}
// Test Bcond for forward branches with all conditions.
// The gap must be such that either all branches expand, or none does.
template <typename PrintBcond>
void TestBcondForward(const std::string& test_name,
size_t gap_size,
const std::string& target_label,
PrintBcond&& print_bcond,
bool is_bare = false) {
std::string expected;
Riscv64Label label;
expected += EmitBcondForAllConditions(&label, target_label + "f", print_bcond, is_bare);
expected += EmitNops(gap_size);
__ Bind(&label);
expected += target_label + ":\n";
DriverStr(expected, test_name);
}
// Test Bcond for backward branches with all conditions.
// The gap must be such that either all branches expand, or none does.
template <typename PrintBcond>
void TestBcondBackward(const std::string& test_name,
size_t gap_size,
const std::string& target_label,
PrintBcond&& print_bcond,
bool is_bare = false) {
std::string expected;
Riscv64Label label;
__ Bind(&label);
expected += target_label + ":\n";
expected += EmitNops(gap_size);
expected += EmitBcondForAllConditions(&label, target_label + "b", print_bcond, is_bare);
DriverStr(expected, test_name);
}
size_t MaxOffset13BackwardDistance() {
return 4 * KB;
}
size_t MaxOffset13ForwardDistance() {
// TODO(riscv64): Support "C" Standard Extension, max forward distance 4KiB - 2.
return 4 * KB - 4;
}
size_t MaxOffset21BackwardDistance() {
return 1 * MB;
}
size_t MaxOffset21ForwardDistance() {
// TODO(riscv64): Support "C" Standard Extension, max forward distance 1MiB - 2.
return 1 * MB - 4;
}
template <typename PrintBcond>
void TestBeqA0A1Forward(const std::string& test_name,
size_t nops_size,
const std::string& target_label,
PrintBcond&& print_bcond,
bool is_bare = false) {
std::string expected;
Riscv64Label label;
__ Beq(A0, A1, &label, is_bare);
expected += print_bcond("eq", "ne", " a0, a1", target_label + "f");
expected += EmitNops(nops_size);
__ Bind(&label);
expected += target_label + ":\n";
DriverStr(expected, test_name);
}
template <typename PrintBcond>
void TestBeqA0A1Backward(const std::string& test_name,
size_t nops_size,
const std::string& target_label,
PrintBcond&& print_bcond,
bool is_bare = false) {
std::string expected;
Riscv64Label label;
__ Bind(&label);
expected += target_label + ":\n";
expected += EmitNops(nops_size);
__ Beq(A0, A1, &label, is_bare);
expected += print_bcond("eq", "ne", " a0, a1", target_label + "b");
DriverStr(expected, test_name);
}
// Test a branch setup where expanding one branch causes expanding another branch
// which causes expanding another branch, etc. The argument `cascade` determines
// whether we push the first branch to expand, or not.
template <typename PrintBcond>
void TestBeqA0A1MaybeCascade(const std::string& test_name,
bool cascade,
PrintBcond&& print_bcond) {
const size_t kNumBeqs = MaxOffset13ForwardDistance() / sizeof(uint32_t) / 2u;
auto label_name = [](size_t i) { return ".L" + std::to_string(i); };
std::string expected;
std::vector<Riscv64Label> labels(kNumBeqs);
for (size_t i = 0; i != kNumBeqs; ++i) {
__ Beq(A0, A1, &labels[i]);
expected += print_bcond("eq", "ne", " a0, a1", label_name(i));
}
if (cascade) {
expected += EmitNops(sizeof(uint32_t));
}
for (size_t i = 0; i != kNumBeqs; ++i) {
expected += EmitNops(2 * sizeof(uint32_t));
__ Bind(&labels[i]);
expected += label_name(i) + ":\n";
}
DriverStr(expected, test_name);
}
auto GetPrintJalRd() {
return [=](XRegister rd, const std::string& target) {
std::string rd_name = GetRegisterName(rd);
return "jal " + rd_name + ", " + target + "\n";
};
}
auto GetPrintCallRd(const std::string& base_label) {
return [=](XRegister rd, const std::string& target) {
std::string rd_name = GetRegisterName(rd);
std::string temp_name = (rd != Zero) ? rd_name : GetRegisterName(TMP);
return base_label + ":\n" +
"auipc " + temp_name + ", %pcrel_hi(" + target + ")\n" +
"jalr " + rd_name + ", %pcrel_lo(" + base_label + "b)(" + temp_name + ")\n";
};
}
template <typename PrintJalRd>
void TestJalRdForward(const std::string& test_name,
size_t gap_size,
const std::string& label_name,
PrintJalRd&& print_jalrd,
bool is_bare = false) {
std::string expected;
Riscv64Label label;
for (XRegister reg : GetRegisters()) {
__ Jal(reg, &label, is_bare);
expected += print_jalrd(reg, label_name + "f");
}
expected += EmitNops(gap_size);
__ Bind(&label);
expected += label_name + ":\n";
DriverStr(expected, test_name);
}
template <typename PrintJalRd>
void TestJalRdBackward(const std::string& test_name,
size_t gap_size,
const std::string& label_name,
PrintJalRd&& print_jalrd,
bool is_bare = false) {
std::string expected;
Riscv64Label label;
__ Bind(&label);
expected += label_name + ":\n";
expected += EmitNops(gap_size);
for (XRegister reg : GetRegisters()) {
__ Jal(reg, &label, is_bare);
expected += print_jalrd(reg, label_name + "b");
}
DriverStr(expected, test_name);
}
auto GetEmitJ(bool is_bare = false) {
return [=](Riscv64Label* label) { __ J(label, is_bare); };
}
auto GetEmitJal() {
return [=](Riscv64Label* label) { __ Jal(label); };
}
auto GetPrintJ() {
return [=](const std::string& target) {
return "j " + target + "\n";
};
}
auto GetPrintJal() {
return [=](const std::string& target) {
return "jal " + target + "\n";
};
}
auto GetPrintTail(const std::string& base_label) {
return [=](const std::string& target) {
return base_label + ":\n" +
"auipc t6, %pcrel_hi(" + target + ")\n" +
"jalr x0, %pcrel_lo(" + base_label + "b)(t6)\n";
};
}
auto GetPrintCall(const std::string& base_label) {
return [=](const std::string& target) {
return base_label + ":\n" +
"auipc ra, %pcrel_hi(" + target + ")\n" +
"jalr ra, %pcrel_lo(" + base_label + "b)(ra)\n";
};
}
template <typename EmitBuncond, typename PrintBuncond>
void TestBuncondForward(const std::string& test_name,
size_t gap_size,
const std::string& label_name,
EmitBuncond&& emit_buncond,
PrintBuncond&& print_buncond) {
std::string expected;
Riscv64Label label;
emit_buncond(&label);
expected += print_buncond(label_name + "f");
expected += EmitNops(gap_size);
__ Bind(&label);
expected += label_name + ":\n";
DriverStr(expected, test_name);
}
template <typename EmitBuncond, typename PrintBuncond>
void TestBuncondBackward(const std::string& test_name,
size_t gap_size,
const std::string& label_name,
EmitBuncond&& emit_buncond,
PrintBuncond&& print_buncond) {
std::string expected;
Riscv64Label label;
__ Bind(&label);
expected += label_name + ":\n";
expected += EmitNops(gap_size);
emit_buncond(&label);
expected += print_buncond(label_name + "b");
DriverStr(expected, test_name);
}
template <typename EmitOp>
void TestAddConst(const std::string& test_name,
size_t bits,
const std::string& suffix,
EmitOp&& emit_op) {
int64_t kImm12s[] = {
0, 1, 2, 0xff, 0x100, 0x1ff, 0x200, 0x3ff, 0x400, 0x7ff,
-1, -2, -0x100, -0x101, -0x200, -0x201, -0x400, -0x401, -0x800,
};
int64_t kSimplePositiveValues[] = {
0x800, 0x801, 0xbff, 0xc00, 0xff0, 0xff7, 0xff8, 0xffb, 0xffc, 0xffd, 0xffe,
};
int64_t kSimpleNegativeValues[] = {
-0x801, -0x802, -0xbff, -0xc00, -0xff0, -0xff8, -0xffc, -0xffe, -0xfff, -0x1000,
};
std::vector<int64_t> large_values = CreateImmediateValuesBits(bits, /*as_uint=*/ false);
auto kept_end = std::remove_if(large_values.begin(),
large_values.end(),
[](int64_t value) { return IsInt<13>(value); });
large_values.erase(kept_end, large_values.end());
large_values.push_back(0xfff);
std::string expected;
for (XRegister rd : GetRegisters()) {
std::string rd_name = GetRegisterName(rd);
std::string addi_rd = ART_FORMAT("addi{} {}, ", suffix, rd_name);
std::string add_rd = ART_FORMAT("add{} {}, ", suffix, rd_name);
for (XRegister rs1 : GetRegisters()) {
ScratchRegisterScope srs(GetAssembler());
srs.ExcludeXRegister(rs1);
srs.ExcludeXRegister(rd);
std::string rs1_name = GetRegisterName(rs1);
std::string tmp_name = GetRegisterName((rs1 != TMP) ? TMP : TMP2);
std::string addi_tmp = ART_FORMAT("addi{} {}, ", suffix, tmp_name);
for (int64_t imm : kImm12s) {
emit_op(rd, rs1, imm);
expected += ART_FORMAT("{}{}, {}\n", addi_rd, rs1_name, std::to_string(imm));
}
auto emit_simple_ops = [&](ArrayRef<const int64_t> imms, int64_t adjustment) {
for (int64_t imm : imms) {
emit_op(rd, rs1, imm);
expected += ART_FORMAT("{}{}, {}\n", addi_tmp, rs1_name, std::to_string(adjustment));
expected +=
ART_FORMAT("{}{}, {}\n", addi_rd, tmp_name, std::to_string(imm - adjustment));
}
};
emit_simple_ops(ArrayRef<const int64_t>(kSimplePositiveValues), 0x7ff);
emit_simple_ops(ArrayRef<const int64_t>(kSimpleNegativeValues), -0x800);
for (int64_t imm : large_values) {
emit_op(rd, rs1, imm);
expected += ART_FORMAT("li {}, {}\n", tmp_name, std::to_string(imm));
expected += ART_FORMAT("{}{}, {}\n", add_rd, rs1_name, tmp_name);
}
}
}
DriverStr(expected, test_name);
}
template <typename GetTemp, typename EmitOp>
std::string RepeatLoadStoreArbitraryOffset(const std::string& head,
GetTemp&& get_temp,
EmitOp&& emit_op) {
int64_t kImm12s[] = {
0, 1, 2, 0xff, 0x100, 0x1ff, 0x200, 0x3ff, 0x400, 0x7ff,
-1, -2, -0x100, -0x101, -0x200, -0x201, -0x400, -0x401, -0x800,
};
int64_t kSimplePositiveOffsetsAlign8[] = {
0x800, 0x801, 0xbff, 0xc00, 0xff0, 0xff4, 0xff6, 0xff7
};
int64_t kSimplePositiveOffsetsAlign4[] = {
0xff8, 0xff9, 0xffa, 0xffb
};
int64_t kSimplePositiveOffsetsAlign2[] = {
0xffc, 0xffd
};
int64_t kSimplePositiveOffsetsNoAlign[] = {
0xffe
};
int64_t kSimpleNegativeOffsets[] = {
-0x801, -0x802, -0xbff, -0xc00, -0xff0, -0xff8, -0xffc, -0xffe, -0xfff, -0x1000,
};
int64_t kSplitOffsets[] = {
0xfff, 0x1000, 0x1001, 0x17ff, 0x1800, 0x1fff, 0x2000, 0x2001, 0x27ff, 0x2800,
0x7fffe7ff, 0x7fffe800, 0x7fffefff, 0x7ffff000, 0x7ffff001, 0x7ffff7ff,
-0x1001, -0x1002, -0x17ff, -0x1800, -0x1801, -0x2000, -0x2001, -0x2800, -0x2801,
-0x7ffff000, -0x7ffff001, -0x7ffff800, -0x7ffff801, -0x7fffffff, -0x80000000,
};
int64_t kSpecialOffsets[] = {
0x7ffff800, 0x7ffff801, 0x7ffffffe, 0x7fffffff
};
std::string expected;
for (XRegister rs1 : GetRegisters()) {
XRegister tmp = get_temp(rs1);
if (tmp == kNoXRegister) {
continue; // Unsupported register combination.
}
std::string tmp_name = GetRegisterName(tmp);
ScratchRegisterScope srs(GetAssembler());
srs.ExcludeXRegister(rs1);
std::string rs1_name = GetRegisterName(rs1);
for (int64_t imm : kImm12s) {
emit_op(rs1, imm);
expected += ART_FORMAT("{}, {}({})\n", head, std::to_string(imm), rs1_name);
}
auto emit_simple_ops = [&](ArrayRef<const int64_t> imms, int64_t adjustment) {
for (int64_t imm : imms) {
emit_op(rs1, imm);
expected +=
ART_FORMAT("addi {}, {}, {}\n", tmp_name, rs1_name, std::to_string(adjustment));
expected += ART_FORMAT("{}, {}({})\n", head, std::to_string(imm - adjustment), tmp_name);
}
};
emit_simple_ops(ArrayRef<const int64_t>(kSimplePositiveOffsetsAlign8), 0x7f8);
emit_simple_ops(ArrayRef<const int64_t>(kSimplePositiveOffsetsAlign4), 0x7fc);
emit_simple_ops(ArrayRef<const int64_t>(kSimplePositiveOffsetsAlign2), 0x7fe);
emit_simple_ops(ArrayRef<const int64_t>(kSimplePositiveOffsetsNoAlign), 0x7ff);
emit_simple_ops(ArrayRef<const int64_t>(kSimpleNegativeOffsets), -0x800);
for (int64_t imm : kSplitOffsets) {
emit_op(rs1, imm);
uint32_t imm20 = ((imm >> 12) + ((imm >> 11) & 1)) & 0xfffff;
int32_t small_offset = (imm & 0xfff) - ((imm & 0x800) << 1);
expected += ART_FORMAT("lui {}, {}\n", tmp_name, std::to_string(imm20));
expected += ART_FORMAT("add {}, {}, {}\n", tmp_name, tmp_name, rs1_name);
expected += ART_FORMAT("{},{}({})\n", head, std::to_string(small_offset), tmp_name);
}
for (int64_t imm : kSpecialOffsets) {
emit_op(rs1, imm);
expected += ART_FORMAT("lui {}, 0x80000\n", tmp_name);
expected +=
ART_FORMAT("addiw {}, {}, {}\n", tmp_name, tmp_name, std::to_string(imm - 0x80000000));
expected += ART_FORMAT("add {}, {}, {}\n", tmp_name, tmp_name, rs1_name);
expected += ART_FORMAT("{}, ({})\n", head, tmp_name);
}
}
return expected;
}
void TestLoadStoreArbitraryOffset(const std::string& test_name,
const std::string& insn,
void (Riscv64Assembler::*fn)(XRegister, XRegister, int32_t),
bool is_store) {
std::string expected;
for (XRegister rd : GetRegisters()) {
ScratchRegisterScope srs(GetAssembler());
srs.ExcludeXRegister(rd);
auto get_temp = [&](XRegister rs1) {
if (is_store) {
return (rs1 != TMP && rd != TMP)
? TMP
: (rs1 != TMP2 && rd != TMP2) ? TMP2 : kNoXRegister;
} else {
return rs1 != TMP ? TMP : TMP2;
}
};
expected += RepeatLoadStoreArbitraryOffset(
insn + " " + GetRegisterName(rd),
get_temp,
[&](XRegister rs1, int64_t offset) { (GetAssembler()->*fn)(rd, rs1, offset); });
}
DriverStr(expected, test_name);
}
void TestFPLoadStoreArbitraryOffset(const std::string& test_name,
const std::string& insn,
void (Riscv64Assembler::*fn)(FRegister, XRegister, int32_t)) {
std::string expected;
for (FRegister rd : GetFPRegisters()) {
expected += RepeatLoadStoreArbitraryOffset(
insn + " " + GetFPRegName(rd),
[&](XRegister rs1) { return rs1 != TMP ? TMP : TMP2; },
[&](XRegister rs1, int64_t offset) { (GetAssembler()->*fn)(rd, rs1, offset); });
}
DriverStr(expected, test_name);
}
void TestLoadLiteral(const std::string& test_name, bool with_padding_for_long) {
std::string expected;
Literal* narrow_literal = __ NewLiteral<uint32_t>(0x12345678);
Literal* wide_literal = __ NewLiteral<uint64_t>(0x1234567887654321);
auto print_load = [&](const std::string& load, XRegister rd, const std::string& label) {
std::string rd_name = GetRegisterName(rd);
expected += "1:\n"
"auipc " + rd_name + ", %pcrel_hi(" + label + "f)\n" +
load + " " + rd_name + ", %pcrel_lo(1b)(" + rd_name + ")\n";
};
for (XRegister reg : GetRegisters()) {
if (reg != Zero) {
__ Loadw(reg, narrow_literal);
print_load("lw", reg, "2");
__ Loadwu(reg, narrow_literal);
print_load("lwu", reg, "2");
__ Loadd(reg, wide_literal);
print_load("ld", reg, "3");
}
}
std::string tmp = GetRegisterName(TMP);
auto print_fp_load = [&](const std::string& load, FRegister rd, const std::string& label) {
std::string rd_name = GetFPRegName(rd);
expected += "1:\n"
"auipc " + tmp + ", %pcrel_hi(" + label + "f)\n" +
load + " " + rd_name + ", %pcrel_lo(1b)(" + tmp + ")\n";
};
for (FRegister freg : GetFPRegisters()) {
__ FLoadw(freg, narrow_literal);
print_fp_load("flw", freg, "2");
__ FLoadd(freg, wide_literal);
print_fp_load("fld", freg, "3");
}
// All literal loads above emit 8 bytes of code. The narrow literal shall emit 4 bytes of code.
// If we do not add another instruction, we shall end up with padding before the long literal.
expected += EmitNops(with_padding_for_long ? 0u : sizeof(uint32_t));
expected += "2:\n"
".4byte 0x12345678\n" +
std::string(with_padding_for_long ? ".4byte 0\n" : "") +
"3:\n"
".8byte 0x1234567887654321\n";
DriverStr(expected, test_name);
}
std::string RepeatFFFFRoundingMode(
void (Riscv64Assembler::*f)(FRegister, FRegister, FRegister, FRegister, FPRoundingMode),
const std::string& fmt) {
CHECK(f != nullptr);
std::string str;
for (FRegister reg1 : GetFPRegisters()) {
for (FRegister reg2 : GetFPRegisters()) {
for (FRegister reg3 : GetFPRegisters()) {
for (FRegister reg4 : GetFPRegisters()) {
for (FPRoundingMode rm : kRoundingModes) {
(GetAssembler()->*f)(reg1, reg2, reg3, reg4, rm);
std::string base = fmt;
ReplaceReg(REG1_TOKEN, GetFPRegName(reg1), &base);
ReplaceReg(REG2_TOKEN, GetFPRegName(reg2), &base);
ReplaceReg(REG3_TOKEN, GetFPRegName(reg3), &base);
ReplaceReg(REG4_TOKEN, GetFPRegName(reg4), &base);
ReplaceRoundingMode(rm, &base);
str += base;
str += "\n";
}
}
}
}
}
return str;
}
std::string RepeatFFFRoundingMode(
void (Riscv64Assembler::*f)(FRegister, FRegister, FRegister, FPRoundingMode),
const std::string& fmt) {
CHECK(f != nullptr);
std::string str;
for (FRegister reg1 : GetFPRegisters()) {
for (FRegister reg2 : GetFPRegisters()) {
for (FRegister reg3 : GetFPRegisters()) {
for (FPRoundingMode rm : kRoundingModes) {
(GetAssembler()->*f)(reg1, reg2, reg3, rm);
std::string base = fmt;
ReplaceReg(REG1_TOKEN, GetFPRegName(reg1), &base);
ReplaceReg(REG2_TOKEN, GetFPRegName(reg2), &base);
ReplaceReg(REG3_TOKEN, GetFPRegName(reg3), &base);
ReplaceRoundingMode(rm, &base);
str += base;
str += "\n";
}
}
}
}
return str;
}
template <typename Reg, typename Imm>
std::string RepeatCTemplateRegImm(void (Riscv64Assembler::*f)(Reg, Imm),
ArrayRef<const Reg> registers,
std::string (Base::*GetName)(const Reg&),
int imm_bits,
int shift,
bool no_zero_imm,
const std::string& fmt) {
auto imms = CreateImmediateValuesBits(abs(imm_bits), /*as_uint=*/imm_bits > 0, shift);
CHECK(f != nullptr);
std::string str;
for (Reg reg : registers) {
for (int64_t imm_raw : imms) {
if (no_zero_imm && imm_raw == 0) {
continue;
}
Imm imm = CreateImmediate(imm_raw);
(GetAssembler()->*f)(reg, imm);
std::string base = fmt;
ReplaceReg(REG_TOKEN, (this->*GetName)(reg), &base);
ReplaceImm(imm, /*bias=*/0, /*multiplier=*/1, &base);
str += base;
str += "\n";
}
}
return str;
}
template <typename Imm>
std::string RepeatCRImm(void (Riscv64Assembler::*f)(XRegister, Imm),
bool is_short,
bool no_zero_reg,
bool no_zero_imm,
int imm_bits,
int shift,
const std::string& fmt) {
auto regs = is_short ? GetRegistersShort() : GetRegisters();
if (no_zero_reg) {
CHECK(!is_short);
CHECK_EQ(regs[0], Zero);
regs = regs.SubArray(1);
}
return RepeatCTemplateRegImm(
f, regs, &AssemblerRISCV64Test::GetRegisterName, imm_bits, shift, no_zero_imm, fmt);
}
template <typename Imm>
std::string RepeatCFImm(void (Riscv64Assembler::*f)(FRegister, Imm),
int imm_bits,
int shift,
const std::string& fmt) {
auto regs = GetFPRegisters();
return RepeatCTemplateRegImm(
f, regs, &AssemblerRISCV64Test::GetFPRegName, imm_bits, shift, /*no_zero_imm=*/false, fmt);
}
template <typename Reg1>
std::string RepeatTemplatedShortRegistersImm(void (Riscv64Assembler::*f)(Reg1,
XRegister,
int32_t),
ArrayRef<const Reg1> reg1_registers,
std::string (Base::*GetName1)(const Reg1&),
int imm_bits,
int shift,
bool no_zero_imm,
const std::string& fmt) {
CHECK(f != nullptr);
auto imms = CreateImmediateValuesBits(abs(imm_bits), imm_bits > 0, shift);
std::string str;
for (Reg1 reg1 : reg1_registers) {
for (XRegister reg2 : GetRegistersShort()) {
for (int64_t imm_raw : imms) {
if (no_zero_imm && imm_raw == 0) {
continue;
}
int32_t imm = CreateImmediate(imm_raw);
(GetAssembler()->*f)(reg1, reg2, imm);
std::string base = fmt;
ReplaceReg(REG1_TOKEN, (this->*GetName1)(reg1), &base);
ReplaceReg(REG2_TOKEN, GetRegisterName(reg2), &base);
ReplaceImm(imm, /*bias=*/0, /*multiplier=*/1, &base);
str += base;
str += "\n";
}
}
}
return str;
}
std::string RepeatCRRImm(void (Riscv64Assembler::*f)(XRegister, XRegister, int32_t),
int imm_bits,
int shift,
const std::string& fmt) {
return RepeatTemplatedShortRegistersImm(f,
GetRegistersShort(),
&AssemblerRISCV64Test::GetRegisterName,
imm_bits,
shift,
/*no_zero_imm=*/false,
fmt);
}
std::string RepeatCFRImm(void (Riscv64Assembler::*f)(FRegister, XRegister, int32_t),
int imm_bits,
int shift,
const std::string& fmt) {
return RepeatTemplatedShortRegistersImm(f,
GetFPRegistersShort(),
&AssemblerRISCV64Test::GetFPRegName,
imm_bits,
shift,
/*no_zero_imm=*/false,
fmt);
}
std::string RepeatCRRShort(void (Riscv64Assembler::*f)(XRegister, XRegister),
const std::string& fmt) {
return RepeatTemplatedRegisters(f,
GetRegistersShort(),
GetRegistersShort(),
&AssemblerRISCV64Test::GetRegisterName,
&AssemblerRISCV64Test::GetRegisterName,
fmt);
}
std::string RepeatCRRNonZero(void (Riscv64Assembler::*f)(XRegister, XRegister),
const std::string& fmt) {
auto regs = GetRegisters();
CHECK_EQ(regs[0], Zero);
auto regs_no_zero = regs.SubArray(1);
return RepeatTemplatedRegisters(f,
regs_no_zero,
regs_no_zero,
&AssemblerRISCV64Test::GetRegisterName,
&AssemblerRISCV64Test::GetRegisterName,
fmt);
}
std::string RepeatCRShort(void (Riscv64Assembler::*f)(XRegister), const std::string& fmt) {
return RepeatTemplatedRegister(
f, GetRegistersShort(), &AssemblerRISCV64Test::GetRegisterName, fmt);
}
template <typename Imm>
std::string RepeatImm(void (Riscv64Assembler::*f)(Imm),
bool no_zero_imm,
int imm_bits,
int shift,
const std::string& fmt) {
auto imms = CreateImmediateValuesBits(abs(imm_bits), imm_bits > 0, shift);
std::string str;
for (int64_t imm_raw : imms) {
if (no_zero_imm && imm_raw == 0) {
continue;
}
Imm imm = CreateImmediate(imm_raw);
(GetAssembler()->*f)(imm);
std::string base = fmt;
ReplaceImm(imm, /*bias=*/0, /*multiplier=*/1, &base);
str += base;
str += "\n";
}
return str;
}
std::string RepeatRNoZero(void (Riscv64Assembler::*f)(XRegister), const std::string& fmt) {
auto regs = GetRegisters();
CHECK_EQ(regs[0], Zero);
return RepeatTemplatedRegister(
f, regs.SubArray(1), &AssemblerRISCV64Test::GetRegisterName, fmt);
}
template <typename Reg1, typename Reg2>
std::string RepeatTemplatedRegistersRoundingMode(
void (Riscv64Assembler::*f)(Reg1, Reg2, FPRoundingMode),
ArrayRef<const Reg1> reg1_registers,
ArrayRef<const Reg2> reg2_registers,
std::string (Base::*GetName1)(const Reg1&),
std::string (Base::*GetName2)(const Reg2&),
const std::string& fmt) {
CHECK(f != nullptr);
std::string str;
for (Reg1 reg1 : reg1_registers) {
for (Reg2 reg2 : reg2_registers) {
for (FPRoundingMode rm : kRoundingModes) {
(GetAssembler()->*f)(reg1, reg2, rm);
std::string base = fmt;
ReplaceReg(REG1_TOKEN, (this->*GetName1)(reg1), &base);
ReplaceReg(REG2_TOKEN, (this->*GetName2)(reg2), &base);
ReplaceRoundingMode(rm, &base);
str += base;
str += "\n";
}
}
}
return str;
}
std::string RepeatFFRoundingMode(
void (Riscv64Assembler::*f)(FRegister, FRegister, FPRoundingMode),
const std::string& fmt) {
return RepeatTemplatedRegistersRoundingMode(f,
GetFPRegisters(),
GetFPRegisters(),
&AssemblerRISCV64Test::GetFPRegName,
&AssemblerRISCV64Test::GetFPRegName,
fmt);
}
std::string RepeatrFRoundingMode(
void (Riscv64Assembler::*f)(XRegister, FRegister, FPRoundingMode),
const std::string& fmt) {
return RepeatTemplatedRegistersRoundingMode(f,
GetRegisters(),
GetFPRegisters(),
&Base::GetSecondaryRegisterName,
&AssemblerRISCV64Test::GetFPRegName,
fmt);
}
std::string RepeatFrRoundingMode(
void (Riscv64Assembler::*f)(FRegister, XRegister, FPRoundingMode),
const std::string& fmt) {
return RepeatTemplatedRegistersRoundingMode(f,
GetFPRegisters(),
GetRegisters(),
&AssemblerRISCV64Test::GetFPRegName,
&Base::GetSecondaryRegisterName,
fmt);
}
template <typename InvalidAqRl>
std::string RepeatRRAqRl(void (Riscv64Assembler::*f)(XRegister, XRegister, AqRl),
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;
ReplaceReg(REG1_TOKEN, GetRegisterName(reg1), &base);
ReplaceReg(REG2_TOKEN, GetRegisterName(reg2), &base);
ReplaceAqRl(aqrl, &base);
str += base;
str += "\n";
}
}
}
return str;
}
template <typename InvalidAqRl>
std::string RepeatRRRAqRl(void (Riscv64Assembler::*f)(XRegister, XRegister, XRegister, AqRl),
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;
ReplaceReg(REG1_TOKEN, GetRegisterName(reg1), &base);
ReplaceReg(REG2_TOKEN, GetRegisterName(reg2), &base);
ReplaceReg(REG3_TOKEN, GetRegisterName(reg3), &base);
ReplaceAqRl(aqrl, &base);
str += base;
str += "\n";
}
}
}
}
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);
std::vector<int64_t> csrs = CreateImmediateValuesBits(12, /*as_uint=*/ true);
std::string str;
for (XRegister reg1 : GetRegisters()) {
for (int64_t csr : csrs) {
for (XRegister reg2 : GetRegisters()) {
(GetAssembler()->*f)(reg1, dchecked_integral_cast<uint32_t>(csr), reg2);
std::string base = fmt;
ReplaceReg(REG1_TOKEN, GetRegisterName(reg1), &base);
ReplaceCsrrImm(CSR_TOKEN, csr, &base);
ReplaceReg(REG2_TOKEN, GetRegisterName(reg2), &base);
str += base;
str += "\n";
}
}
}
return str;
}
std::string RepeatCsrrXi(void (Riscv64Assembler::*f)(XRegister, uint32_t, uint32_t),
const std::string& fmt) {
CHECK(f != nullptr);
std::vector<int64_t> csrs = CreateImmediateValuesBits(12, /*as_uint=*/ true);
std::vector<int64_t> uimms = CreateImmediateValuesBits(2, /*as_uint=*/ true);
std::string str;
for (XRegister reg : GetRegisters()) {
for (int64_t csr : csrs) {
for (int64_t uimm : uimms) {
(GetAssembler()->*f)(
reg, dchecked_integral_cast<uint32_t>(csr), dchecked_integral_cast<uint32_t>(uimm));
std::string base = fmt;
ReplaceReg(REG_TOKEN, GetRegisterName(reg), &base);
ReplaceCsrrImm(CSR_TOKEN, csr, &base);
ReplaceCsrrImm(UIMM_TOKEN, uimm, &base);
str += base;
str += "\n";
}
}
}
return str;
}
std::string RepeatVRAligned(void (Riscv64Assembler::*f)(VRegister, XRegister),
uint32_t alignment,
const std::string& fmt) {
WarnOnCombinations(GetVectorRegisters().size() * GetRegisters().size());
CHECK(f != nullptr);
std::string str;
for (auto reg1 : GetVectorRegisters()) {
for (auto reg2 : GetRegisters()) {
if ((static_cast<uint32_t>(reg1) % alignment) != 0) {
continue;
}
(GetAssembler()->*f)(reg1, reg2);
std::string base = fmt;
ReplaceReg(REG1_TOKEN, GetVecRegName(reg1), &base);
ReplaceReg(REG2_TOKEN, GetRegisterName(reg2), &base);
str += base;
str += "\n";
}
}
return str;
}
std::string RepeatVVAligned(void (Riscv64Assembler::*f)(VRegister, VRegister),
uint32_t alignment,
const std::string& fmt) {
WarnOnCombinations(GetVectorRegisters().size() * GetRegisters().size());
CHECK(f != nullptr);
std::string str;
for (auto reg1 : GetVectorRegisters()) {
if ((static_cast<uint32_t>(reg1) % alignment) != 0) {
continue;
}
for (auto reg2 : GetVectorRegisters()) {
if ((static_cast<uint32_t>(reg2) % alignment) != 0) {
continue;
}
(GetAssembler()->*f)(reg1, reg2);
std::string base = fmt;
ReplaceReg(REG1_TOKEN, GetVecRegName(reg1), &base);
ReplaceReg(REG2_TOKEN, GetVecRegName(reg2), &base);
str += base;
str += "\n";
}
}
return str;
}
template <typename Reg1, typename Reg2, typename Reg3, typename Predicate>
std::string RepeatTemplatedRegistersVmFiltered(
void (Riscv64Assembler::*f)(Reg1, Reg2, Reg3, Riscv64Assembler::VM),
ArrayRef<const Reg1> reg1_registers,
ArrayRef<const Reg2> reg2_registers,
ArrayRef<const Reg3> reg3_registers,
std::string (AssemblerTest::*GetName1)(const Reg1&),
std::string (AssemblerTest::*GetName2)(const Reg2&),
std::string (AssemblerTest::*GetName3)(const Reg3&),
Predicate&& pred,
const std::string& fmt) {
WarnOnCombinations(reg1_registers.size() * reg2_registers.size() * reg3_registers.size());
CHECK(f != nullptr);
std::string str;
for (auto reg1 : reg1_registers) {
for (auto reg2 : reg2_registers) {
for (auto reg3 : reg3_registers) {
for (Riscv64Assembler::VM vm : kVMs) {
if (!pred(reg1, reg2, reg3, vm)) {
continue;
}
(GetAssembler()->*f)(reg1, reg2, reg3, vm);
std::string base = fmt;
ReplaceReg(REG1_TOKEN, (this->*GetName1)(reg1), &base);
ReplaceReg(REG2_TOKEN, (this->*GetName2)(reg2), &base);
ReplaceReg(REG3_TOKEN, (this->*GetName3)(reg3), &base);
ReplaceVm(vm, &base);
str += base;
str += "\n";
}
}
}
}
return str;
}
template <typename Predicate>
std::string RepeatVRRVmFiltered(
void (Riscv64Assembler::*f)(VRegister, XRegister, XRegister, Riscv64Assembler::VM),
const std::string& fmt,
Predicate&& pred) {
return RepeatTemplatedRegistersVmFiltered(f,
GetVectorRegisters(),
GetRegisters(),
GetRegisters(),
&AssemblerRISCV64Test::GetVecRegName,
&AssemblerRISCV64Test::GetRegisterName,
&AssemblerRISCV64Test::GetRegisterName,
std::forward<Predicate>(pred),
fmt);
}
std::string RepeatVRRVm(
void (Riscv64Assembler::*f)(VRegister, XRegister, XRegister, Riscv64Assembler::VM),
const std::string& fmt) {
return RepeatVRRVmFiltered(
f, fmt, [](VRegister, XRegister, XRegister, Riscv64Assembler::VM) { return true; });
}
template <typename Predicate>
std::string RepeatVVRVmFiltered(
void (Riscv64Assembler::*f)(VRegister, VRegister, XRegister, Riscv64Assembler::VM),
const std::string& fmt,
Predicate&& pred) {
return RepeatTemplatedRegistersVmFiltered(f,
GetVectorRegisters(),
GetVectorRegisters(),
GetRegisters(),
&AssemblerRISCV64Test::GetVecRegName,
&AssemblerRISCV64Test::GetVecRegName,
&AssemblerRISCV64Test::GetRegisterName,
std::forward<Predicate>(pred),
fmt);
}
template <typename Predicate>
std::string RepeatVRVVmFiltered(
void (Riscv64Assembler::*f)(VRegister, XRegister, VRegister, Riscv64Assembler::VM),
const std::string& fmt,
Predicate&& pred) {
return RepeatTemplatedRegistersVmFiltered(f,
GetVectorRegisters(),
GetRegisters(),
GetVectorRegisters(),
&AssemblerRISCV64Test::GetVecRegName,
&AssemblerRISCV64Test::GetRegisterName,
&AssemblerRISCV64Test::GetVecRegName,
std::forward<Predicate>(pred),
fmt);
}
std::string RepeatVRVVm(
void (Riscv64Assembler::*f)(VRegister, XRegister, VRegister, Riscv64Assembler::VM),
const std::string& fmt) {
return RepeatVRVVmFiltered(
f, fmt, [](VRegister, XRegister, VRegister, Riscv64Assembler::VM) { return true; });
}
template <typename Predicate>
std::string RepeatVVVVmFiltered(
void (Riscv64Assembler::*f)(VRegister, VRegister, VRegister, Riscv64Assembler::VM),
const std::string& fmt,
Predicate&& pred) {
return RepeatTemplatedRegistersVmFiltered(f,
GetVectorRegisters(),
GetVectorRegisters(),
GetVectorRegisters(),
&AssemblerRISCV64Test::GetVecRegName,
&AssemblerRISCV64Test::GetVecRegName,
&AssemblerRISCV64Test::GetVecRegName,
std::forward<Predicate>(pred),
fmt);
}
std::string RepeatVVVVm(
void (Riscv64Assembler::*f)(VRegister, VRegister, VRegister, Riscv64Assembler::VM),
const std::string& fmt) {
return RepeatVVVVmFiltered(
f, fmt, [](VRegister, VRegister, VRegister, Riscv64Assembler::VM) { return true; });
}
template <typename Predicate>
std::string RepeatVVFVmFiltered(
void (Riscv64Assembler::*f)(VRegister, VRegister, FRegister, Riscv64Assembler::VM),
const std::string& fmt,
Predicate&& pred) {
return RepeatTemplatedRegistersVmFiltered(f,
GetVectorRegisters(),
GetVectorRegisters(),
GetFPRegisters(),
&AssemblerRISCV64Test::GetVecRegName,
&AssemblerRISCV64Test::GetVecRegName,
&AssemblerRISCV64Test::GetFPRegName,
std::forward<Predicate>(pred),
fmt);
}
template <typename Predicate>
std::string RepeatVFVVmFiltered(
void (Riscv64Assembler::*f)(VRegister, FRegister, VRegister, Riscv64Assembler::VM),
const std::string& fmt,
Predicate&& pred) {
return RepeatTemplatedRegistersVmFiltered(f,
GetVectorRegisters(),
GetFPRegisters(),
GetVectorRegisters(),
&AssemblerRISCV64Test::GetVecRegName,
&AssemblerRISCV64Test::GetFPRegName,
&AssemblerRISCV64Test::GetVecRegName,
std::forward<Predicate>(pred),
fmt);
}
template <typename Reg1, typename Reg2, typename Reg3, typename Predicate>
std::string RepeatTemplatedRegistersFiltered(void (Riscv64Assembler::*f)(Reg1, Reg2, Reg3),
ArrayRef<const Reg1> reg1_registers,
ArrayRef<const Reg2> reg2_registers,
ArrayRef<const Reg3> reg3_registers,
std::string (AssemblerTest::*GetName1)(const Reg1&),
std::string (AssemblerTest::*GetName2)(const Reg2&),
std::string (AssemblerTest::*GetName3)(const Reg3&),
Predicate&& pred,
const std::string& fmt) {
WarnOnCombinations(reg1_registers.size() * reg2_registers.size() * reg3_registers.size());
CHECK(f != nullptr);
std::string str;
for (auto reg1 : reg1_registers) {
for (auto reg2 : reg2_registers) {
for (auto reg3 : reg3_registers) {
if (!pred(reg1, reg2, reg3)) {
continue;
}
(GetAssembler()->*f)(reg1, reg2, reg3);
std::string base = fmt;
ReplaceReg(REG1_TOKEN, (this->*GetName1)(reg1), &base);
ReplaceReg(REG2_TOKEN, (this->*GetName2)(reg2), &base);
ReplaceReg(REG3_TOKEN, (this->*GetName3)(reg3), &base);
str += base;
str += "\n";
}
}
}
return str;
}
template <typename Predicate>
std::string RepeatVVRFiltered(void (Riscv64Assembler::*f)(VRegister, VRegister, XRegister),
const std::string& fmt,
Predicate&& pred) {
return RepeatTemplatedRegistersFiltered(f,
GetVectorRegisters(),
GetVectorRegisters(),
GetRegisters(),
&AssemblerRISCV64Test::GetVecRegName,
&AssemblerRISCV64Test::GetVecRegName,
&AssemblerRISCV64Test::GetRegisterName,
std::forward<Predicate>(pred),
fmt);
}
template <typename Predicate>
std::string RepeatVVVFiltered(void (Riscv64Assembler::*f)(VRegister, VRegister, VRegister),
const std::string& fmt,
Predicate&& pred) {
return RepeatTemplatedRegistersFiltered(f,
GetVectorRegisters(),
GetVectorRegisters(),
GetVectorRegisters(),
&AssemblerRISCV64Test::GetVecRegName,
&AssemblerRISCV64Test::GetVecRegName,
&AssemblerRISCV64Test::GetVecRegName,
std::forward<Predicate>(pred),
fmt);
}
template <typename Predicate>
std::string RepeatVVFFiltered(void (Riscv64Assembler::*f)(VRegister, VRegister, FRegister),
const std::string& fmt,
Predicate&& pred) {
return RepeatTemplatedRegistersFiltered(f,
GetVectorRegisters(),
GetVectorRegisters(),
GetFPRegisters(),
&AssemblerRISCV64Test::GetVecRegName,
&AssemblerRISCV64Test::GetVecRegName,
&AssemblerRISCV64Test::GetFPRegName,
std::forward<Predicate>(pred),
fmt);
}
template <typename Predicate, typename ImmType>
std::string RepeatVVIFiltered(void (Riscv64Assembler::*f)(VRegister, VRegister, ImmType),
int imm_bits,
const std::string& fmt,
Predicate&& pred) {
CHECK(f != nullptr);
std::string str;
std::vector<int64_t> imms = CreateImmediateValuesBits(abs(imm_bits), (imm_bits > 0));
WarnOnCombinations(GetVectorRegisters().size() * GetVectorRegisters().size() * imms.size());
for (VRegister reg1 : GetVectorRegisters()) {
for (VRegister reg2 : GetVectorRegisters()) {
for (int64_t imm : imms) {
ImmType new_imm = CreateImmediate(imm);
if (!pred(reg1, reg2, new_imm)) {
continue;
}
(GetAssembler()->*f)(reg1, reg2, new_imm);
std::string base = fmt;
ReplaceReg(REG1_TOKEN, GetVecRegName(reg1), &base);
ReplaceReg(REG2_TOKEN, GetVecRegName(reg2), &base);
ReplaceImm(imm, /*bias=*/ 0, /*multiplier=*/ 1, &base);
str += base;
str += "\n";
}
}
}
return str;
}
template <typename Predicate, typename ImmType>
std::string RepeatVVIbVmFiltered(
void (Riscv64Assembler::*f)(VRegister, VRegister, ImmType, Riscv64Assembler::VM),
int imm_bits,
const std::string& fmt,
Predicate&& pred,
ImmType bias = 0) {
CHECK(f != nullptr);
std::string str;
std::vector<int64_t> imms = CreateImmediateValuesBits(abs(imm_bits), (imm_bits > 0));
WarnOnCombinations(2 * GetVectorRegisters().size() * GetVectorRegisters().size() * imms.size());
for (VRegister reg1 : GetVectorRegisters()) {
for (VRegister reg2 : GetVectorRegisters()) {
for (int64_t imm : imms) {
for (Riscv64Assembler::VM vm : kVMs) {
if (!pred(reg1, reg2, imm, vm)) {
continue;
}
ImmType new_imm = CreateImmediate(imm) + bias;
(GetAssembler()->*f)(reg1, reg2, new_imm, vm);
std::string base = fmt;
ReplaceReg(REG1_TOKEN, GetVecRegName(reg1), &base);
ReplaceImm(imm, bias, /*multiplier=*/ 1, &base);
ReplaceReg(REG2_TOKEN, GetVecRegName(reg2), &base);
ReplaceVm(vm, &base);
str += base;
str += "\n";
}
}
}
}
return str;
}
template <typename Reg1, typename Reg2, typename Predicate>
std::string RepeatTemplatedRegistersVmFiltered(
void (Riscv64Assembler::*f)(Reg1, Reg2, Riscv64Assembler::VM),
ArrayRef<const Reg1> reg1_registers,
ArrayRef<const Reg2> reg2_registers,
std::string (AssemblerTest::*GetName1)(const Reg1&),
std::string (AssemblerTest::*GetName2)(const Reg2&),
Predicate&& pred,
const std::string& fmt) {
CHECK(f != nullptr);
WarnOnCombinations(2 * reg2_registers.size() * reg1_registers.size());
std::string str;
for (auto reg1 : reg1_registers) {
for (auto reg2 : reg2_registers) {
for (Riscv64Assembler::VM vm : kVMs) {
if (!pred(reg1, reg2, vm)) {
continue;
}
(GetAssembler()->*f)(reg1, reg2, vm);
std::string base = fmt;
ReplaceReg(REG1_TOKEN, (this->*GetName1)(reg1), &base);
ReplaceReg(REG2_TOKEN, (this->*GetName2)(reg2), &base);
ReplaceVm(vm, &base);
str += base;
str += "\n";
}
}
}
return str;
}
template <typename Predicate>
std::string RepeatRVVmFiltered(void (Riscv64Assembler::*f)(XRegister,
VRegister,
Riscv64Assembler::VM),
const std::string& fmt,
Predicate&& pred) {
return RepeatTemplatedRegistersVmFiltered(f,
GetRegisters(),
GetVectorRegisters(),
&AssemblerRISCV64Test::GetRegisterName,
&AssemblerRISCV64Test::GetVecRegName,
std::forward<Predicate>(pred),
fmt);
}
std::string RepeatRVVm(void (Riscv64Assembler::*f)(XRegister, VRegister, Riscv64Assembler::VM vm),
const std::string& fmt) {
return RepeatRVVmFiltered(
f, fmt, [](XRegister, VRegister, Riscv64Assembler::VM) { return true; });
}
template <typename Predicate>
std::string RepeatVRVmFiltered(void (Riscv64Assembler::*f)(VRegister,
XRegister,
Riscv64Assembler::VM),
const std::string& fmt,
Predicate&& pred) {
return RepeatTemplatedRegistersVmFiltered(f,
GetVectorRegisters(),
GetRegisters(),
&AssemblerRISCV64Test::GetVecRegName,
&AssemblerRISCV64Test::GetRegisterName,
std::forward<Predicate>(pred),
fmt);
}
std::string RepeatVRVm(void (Riscv64Assembler::*f)(VRegister, XRegister, Riscv64Assembler::VM),
const std::string& fmt) {
return RepeatVRVmFiltered(
f, fmt, [](VRegister, XRegister, Riscv64Assembler::VM) { return true; });
}
template <typename Predicate>
std::string RepeatVVVmFiltered(void (Riscv64Assembler::*f)(VRegister,
VRegister,
Riscv64Assembler::VM),
const std::string& fmt,
Predicate&& pred) {
return RepeatTemplatedRegistersVmFiltered(f,
GetVectorRegisters(),
GetVectorRegisters(),
&AssemblerRISCV64Test::GetVecRegName,
&AssemblerRISCV64Test::GetVecRegName,
std::forward<Predicate>(pred),
fmt);
}
template <typename Predicate>
std::string RepeatVVmFiltered(void (Riscv64Assembler::*f)(VRegister, Riscv64Assembler::VM),
const std::string& fmt,
Predicate&& pred) {
WarnOnCombinations(2 * GetVectorRegisters().size());
CHECK(f != nullptr);
std::string str;
for (VRegister reg1 : GetVectorRegisters()) {
for (Riscv64Assembler::VM vm : kVMs) {
if (!pred(reg1, vm)) {
continue;
}
(GetAssembler()->*f)(reg1, vm);
std::string base = fmt;
ReplaceReg(REG_TOKEN, GetVecRegName(reg1), &base);
ReplaceVm(vm, &base);
str += base;
str += "\n";
}
}
return str;
}
static constexpr bool IsVdAllowed(VRegister vd, Riscv64Assembler::VM vm) {
return vm != Riscv64Assembler::VM::kV0_t || vd != V0;
}
template <typename Reg2>
auto VXVVmSkipV0VmAndNoR1R3Overlap() {
return [](VRegister vd, Reg2, VRegister vs1, Riscv64Assembler::VM vm) {
return IsVdAllowed(vd, vm) && vd != vs1;
};
}
template <typename Reg3>
auto VXVVmSkipV0VmAndNoR1R2Overlap() {
return [](VRegister vd, VRegister vs2, Reg3, Riscv64Assembler::VM vm) {
return IsVdAllowed(vd, vm) && vd != vs2;
};
}
auto VXVVmSkipV0VmAndNoR1R2R3Overlap() {
return [](VRegister vd, VRegister vs2, VRegister vs1, Riscv64Assembler::VM vm) {
return IsVdAllowed(vd, vm) && vd != vs1 && vd != vs2;
};
}
auto VVVmSkipV0VmAndNoR1R2Overlap() {
return [](VRegister vd, VRegister vs2, Riscv64Assembler::VM vm) {
return IsVdAllowed(vd, vm) && vd != vs2;
};
}
template <typename Reg2, typename Reg3>
auto SkipV0Vm() {
return [](VRegister vd, Reg2, Reg3, Riscv64Assembler::VM vm) { return IsVdAllowed(vd, vm); };
}
template <typename Reg2>
auto SkipV0Vm() {
return [](VRegister vd, Reg2, Riscv64Assembler::VM vm) { return IsVdAllowed(vd, vm); };
}
auto SkipV0Vm() {
return [](VRegister vd, Riscv64Assembler::VM vm) { return IsVdAllowed(vd, vm); };
}
template <typename Reg2, typename Reg3>
auto SkipV0() {
return [](VRegister vd, Reg2, Reg3) { return vd != V0; };
}
auto VVVNoR1R2R3Overlap() {
return [](VRegister vd, VRegister vs2, VRegister vs1) { return vd != vs1 && vd != vs2; };
}
template <typename Arg, typename Args, typename Replacer>
std::string TestVSetI(void (Riscv64Assembler::*f)(XRegister, Arg, uint32_t),
Args&& arguments,
Replacer&& replacer,
const std::string& fmt) {
CHECK(f != nullptr);
std::string str;
for (auto reg1 : GetRegisters()) {
for (auto arg : arguments) {
for (Riscv64Assembler::VectorMaskAgnostic vma : kVMAs) {
for (Riscv64Assembler::VectorTailAgnostic vta : kVTAs) {
for (Riscv64Assembler::SelectedElementWidth sew : kSEWs) {
for (Riscv64Assembler::LengthMultiplier lmul : kLMULs) {
uint32_t vtype = Riscv64Assembler::VTypeiValue(vma, vta, sew, lmul);
(GetAssembler()->*f)(reg1, arg, vtype);
std::string base = fmt;
ReplaceReg(REG1_TOKEN, GetRegisterName(reg1), &base);
replacer(arg, &base);
ReplaceVMA(vma, &base);
ReplaceVTA(vta, &base);
ReplaceSEW(sew, &base);
ReplaceLMUL(lmul, &base);
str += base;
str += "\n";
}
}
}
}
}
}
return str;
}
template <typename EmitCssrX>
void TestCsrrXMacro(const std::string& test_name,
const std::string& fmt,
EmitCssrX&& emit_csrrx) {
std::vector<int64_t> csrs = CreateImmediateValuesBits(12, /*as_uint=*/ true);
std::string expected;
for (XRegister reg : GetRegisters()) {
for (int64_t csr : csrs) {
emit_csrrx(dchecked_integral_cast<uint32_t>(csr), reg);
std::string base = fmt;
ReplaceReg(REG_TOKEN, GetRegisterName(reg), &base);
ReplaceCsrrImm(CSR_TOKEN, csr, &base);
expected += base;
expected += "\n";
}
}
DriverStr(expected, test_name);
}
template <typename EmitCssrXi>
void TestCsrrXiMacro(const std::string& test_name,
const std::string& fmt,
EmitCssrXi&& emit_csrrxi) {
std::vector<int64_t> csrs = CreateImmediateValuesBits(12, /*as_uint=*/ true);
std::vector<int64_t> uimms = CreateImmediateValuesBits(2, /*as_uint=*/ true);
std::string expected;
for (int64_t csr : csrs) {
for (int64_t uimm : uimms) {
emit_csrrxi(dchecked_integral_cast<uint32_t>(csr), dchecked_integral_cast<uint32_t>(uimm));
std::string base = fmt;
ReplaceCsrrImm(CSR_TOKEN, csr, &base);
ReplaceCsrrImm(UIMM_TOKEN, uimm, &base);
expected += base;
expected += "\n";
}
}
DriverStr(expected, test_name);
}
private:
static constexpr const char* RM_TOKEN = "{rm}";
static constexpr const char* AQRL_TOKEN = "{aqrl}";
static constexpr const char* CSR_TOKEN = "{csr}";
static constexpr const char* UIMM_TOKEN = "{uimm}";
static constexpr const char* VM_TOKEN = "{vm}";
static constexpr const char* VMA_TOKEN = "{vma}";
static constexpr const char* VTA_TOKEN = "{vta}";
static constexpr const char* SEW_TOKEN = "{sew}";
static constexpr const char* LMUL_TOKEN = "{lmul}";
static constexpr AqRl kAqRls[] = { AqRl::kNone, AqRl::kRelease, AqRl::kAcquire, AqRl::kAqRl };
static constexpr Riscv64Assembler::VM kVMs[] = {Riscv64Assembler::VM::kUnmasked,
Riscv64Assembler::VM::kV0_t};
static constexpr Riscv64Assembler::VectorMaskAgnostic kVMAs[] = {
Riscv64Assembler::VectorMaskAgnostic::kAgnostic,
Riscv64Assembler::VectorMaskAgnostic::kUndisturbed};
static constexpr Riscv64Assembler::VectorTailAgnostic kVTAs[] = {
Riscv64Assembler::VectorTailAgnostic::kAgnostic,
Riscv64Assembler::VectorTailAgnostic::kUndisturbed};
static constexpr Riscv64Assembler::SelectedElementWidth kSEWs[] = {
Riscv64Assembler::SelectedElementWidth::kE8,
Riscv64Assembler::SelectedElementWidth::kE16,
Riscv64Assembler::SelectedElementWidth::kE32,
Riscv64Assembler::SelectedElementWidth::kE64};
static constexpr Riscv64Assembler::LengthMultiplier kLMULs[] = {
Riscv64Assembler::LengthMultiplier::kM1Over8,
Riscv64Assembler::LengthMultiplier::kM1Over4,
Riscv64Assembler::LengthMultiplier::kM1Over2,
Riscv64Assembler::LengthMultiplier::kM1,
Riscv64Assembler::LengthMultiplier::kM2,
Riscv64Assembler::LengthMultiplier::kM4,
Riscv64Assembler::LengthMultiplier::kM8};
static constexpr FPRoundingMode kRoundingModes[] = {
FPRoundingMode::kRNE,
FPRoundingMode::kRTZ,
FPRoundingMode::kRDN,
FPRoundingMode::kRUP,
FPRoundingMode::kRMM,
FPRoundingMode::kDYN
};
void ReplaceRoundingMode(FPRoundingMode rm, /*inout*/ std::string* str) {
const char* replacement;
switch (rm) {
case FPRoundingMode::kRNE:
replacement = "rne";
break;
case FPRoundingMode::kRTZ:
replacement = "rtz";
break;
case FPRoundingMode::kRDN:
replacement = "rdn";
break;
case FPRoundingMode::kRUP:
replacement = "rup";
break;
case FPRoundingMode::kRMM:
replacement = "rmm";
break;
case FPRoundingMode::kDYN:
replacement = "dyn";
break;
default:
LOG(FATAL) << "Unexpected value for rm: " << enum_cast<uint32_t>(rm);
UNREACHABLE();
}
size_t rm_index = str->find(RM_TOKEN);
EXPECT_NE(rm_index, std::string::npos);
if (rm_index != std::string::npos) {
str->replace(rm_index, ConstexprStrLen(RM_TOKEN), replacement);
}
}
void ReplaceAqRl(AqRl aqrl, /*inout*/ std::string* str) {
const char* replacement;
switch (aqrl) {
case AqRl::kNone:
replacement = "";
break;
case AqRl::kRelease:
replacement = ".rl";
break;
case AqRl::kAcquire:
replacement = ".aq";
break;
case AqRl::kAqRl:
replacement = ".aqrl";
break;
default:
LOG(FATAL) << "Unexpected value for `aqrl`: " << enum_cast<uint32_t>(aqrl);
UNREACHABLE();
}
size_t aqrl_index = str->find(AQRL_TOKEN);
EXPECT_NE(aqrl_index, std::string::npos);
if (aqrl_index != std::string::npos) {
str->replace(aqrl_index, ConstexprStrLen(AQRL_TOKEN), replacement);
}
}
void ReplaceVm(Riscv64Assembler::VM vm, /*inout*/ std::string* str) {
const char* replacement;
switch (vm) {
case Riscv64Assembler::VM::kUnmasked:
replacement = "";
break;
case Riscv64Assembler::VM::kV0_t:
replacement = ", v0.t";
break;
default:
LOG(FATAL) << "Unexpected value for `VM`: " << enum_cast<uint32_t>(vm);
UNREACHABLE();
}
size_t vm_index = str->find(VM_TOKEN);
EXPECT_NE(vm_index, std::string::npos);
if (vm_index != std::string::npos) {
str->replace(vm_index, ConstexprStrLen(VM_TOKEN), replacement);
}
}
void ReplaceVMA(Riscv64Assembler::VectorMaskAgnostic vma, /*inout*/ std::string* str) {
const char* replacement;
switch (vma) {
case Riscv64Assembler::VectorMaskAgnostic::kAgnostic:
replacement = "ma";
break;
case Riscv64Assembler::VectorMaskAgnostic::kUndisturbed:
replacement = "mu";
break;
default:
LOG(FATAL) << "Unexpected value for `VectorMaskAgnostic`: " << enum_cast<uint32_t>(vma);
UNREACHABLE();
}
size_t vma_index = str->find(VMA_TOKEN);
EXPECT_NE(vma_index, std::string::npos);
if (vma_index != std::string::npos) {
str->replace(vma_index, ConstexprStrLen(VMA_TOKEN), replacement);
}
}
void ReplaceVTA(Riscv64Assembler::VectorTailAgnostic vta, /*inout*/ std::string* str) {
const char* replacement;
switch (vta) {
case Riscv64Assembler::VectorTailAgnostic::kAgnostic:
replacement = "ta";
break;
case Riscv64Assembler::VectorTailAgnostic::kUndisturbed:
replacement = "tu";
break;
default:
LOG(FATAL) << "Unexpected value for `VectorTailAgnostic`: " << enum_cast<uint32_t>(vta);
UNREACHABLE();
}
size_t vta_index = str->find(VTA_TOKEN);
EXPECT_NE(vta_index, std::string::npos);
if (vta_index != std::string::npos) {
str->replace(vta_index, ConstexprStrLen(VTA_TOKEN), replacement);
}
}
void ReplaceSEW(Riscv64Assembler::SelectedElementWidth sew, /*inout*/ std::string* str) {
const char* replacement;
switch (sew) {
case Riscv64Assembler::SelectedElementWidth::kE8:
replacement = "e8";
break;
case Riscv64Assembler::SelectedElementWidth::kE16:
replacement = "e16";
break;
case Riscv64Assembler::SelectedElementWidth::kE32:
replacement = "e32";
break;
case Riscv64Assembler::SelectedElementWidth::kE64:
replacement = "e64";
break;
default:
LOG(FATAL) << "Unexpected value for `SelectedElementWidth`: " << enum_cast<uint32_t>(sew);
UNREACHABLE();
}
size_t sew_index = str->find(SEW_TOKEN);
EXPECT_NE(sew_index, std::string::npos);
if (sew_index != std::string::npos) {
str->replace(sew_index, ConstexprStrLen(SEW_TOKEN), replacement);
}
}
void ReplaceLMUL(Riscv64Assembler::LengthMultiplier lmul, /*inout*/ std::string* str) {
const char* replacement;
switch (lmul) {
case Riscv64Assembler::LengthMultiplier::kM1Over8:
replacement = "mf8";
break;
case Riscv64Assembler::LengthMultiplier::kM1Over4:
replacement = "mf4";
break;
case Riscv64Assembler::LengthMultiplier::kM1Over2:
replacement = "mf2";
break;
case Riscv64Assembler::LengthMultiplier::kM1:
replacement = "m1";
break;
case Riscv64Assembler::LengthMultiplier::kM2:
replacement = "m2";
break;
case Riscv64Assembler::LengthMultiplier::kM4:
replacement = "m4";
break;
case Riscv64Assembler::LengthMultiplier::kM8:
replacement = "m8";
break;
default:
LOG(FATAL) << "Unexpected value for `LengthMultiplier`: " << enum_cast<uint32_t>(lmul);
UNREACHABLE();
}
size_t lmul_index = str->find(LMUL_TOKEN);
EXPECT_NE(lmul_index, std::string::npos);
if (lmul_index != std::string::npos) {
str->replace(lmul_index, ConstexprStrLen(LMUL_TOKEN), replacement);
}
}
static void ReplaceCsrrImm(const std::string& imm_token,
int64_t imm,
/*inout*/ std::string* str) {
size_t imm_index = str->find(imm_token);
EXPECT_NE(imm_index, std::string::npos);
if (imm_index != std::string::npos) {
str->replace(imm_index, imm_token.length(), std::to_string(imm));
}
}
std::map<XRegister, std::string, RISCV64CpuRegisterCompare> secondary_register_names_;
std::unique_ptr<const Riscv64InstructionSetFeatures> instruction_set_features_;
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");
}
TEST_F(AssemblerRISCV64Test, Auipc) {
DriverStr(RepeatRIb(&Riscv64Assembler::Auipc, 20, "auipc {reg}, {imm}"), "Auipc");
}
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");
}
TEST_F(AssemblerRISCV64Test, Blt) {
// TODO(riscv64): Change "-11, 2" to "-12, 1" for "C" Standard Extension.
DriverStr(RepeatRRIbS(&Riscv64Assembler::Blt, -11, 2, "blt {reg1}, {reg2}, {imm}\n"), "Blt");
}
TEST_F(AssemblerRISCV64Test, Bge) {
// TODO(riscv64): Change "-11, 2" to "-12, 1" for "C" Standard Extension.
DriverStr(RepeatRRIbS(&Riscv64Assembler::Bge, -11, 2, "bge {reg1}, {reg2}, {imm}\n"), "Bge");
}
TEST_F(AssemblerRISCV64Test, Bltu) {
// TODO(riscv64): Change "-11, 2" to "-12, 1" for "C" Standard Extension.
DriverStr(RepeatRRIbS(&Riscv64Assembler::Bltu, -11, 2, "bltu {reg1}, {reg2}, {imm}\n"), "Bltu");
}
TEST_F(AssemblerRISCV64Test, Bgeu) {
// TODO(riscv64): Change "-11, 2" to "-12, 1" for "C" Standard Extension.
DriverStr(RepeatRRIbS(&Riscv64Assembler::Bgeu, -11, 2, "bgeu {reg1}, {reg2}, {imm}\n"), "Bgeu");
}
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");
}
TEST_F(AssemblerRISCV64Test, Slti) {
DriverStr(RepeatRRIb(&Riscv64Assembler::Slti, -12, "slti {reg1}, {reg2}, {imm}"), "Slti");
}
TEST_F(AssemblerRISCV64Test, Sltiu) {
DriverStr(RepeatRRIb(&Riscv64Assembler::Sltiu, -12, "sltiu {reg1}, {reg2}, {imm}"), "Sltiu");
}
TEST_F(AssemblerRISCV64Test, Xori) {
DriverStr(RepeatRRIb(&Riscv64Assembler::Xori, 11, "xori {reg1}, {reg2}, {imm}"), "Xori");
}
TEST_F(AssemblerRISCV64Test, Ori) {
DriverStr(RepeatRRIb(&Riscv64Assembler::Ori, -12, "ori {reg1}, {reg2}, {imm}"), "Ori");
}
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");
}
TEST_F(AssemblerRISCV64Test, Slt) {
DriverStr(RepeatRRR(&Riscv64Assembler::Slt, "slt {reg1}, {reg2}, {reg3}"), "Slt");
}
TEST_F(AssemblerRISCV64Test, Sltu) {
DriverStr(RepeatRRR(&Riscv64Assembler::Sltu, "sltu {reg1}, {reg2}, {reg3}"), "Sltu");
}
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");
}
TEST_F(AssemblerRISCV64Test, Sll) {
DriverStr(RepeatRRR(&Riscv64Assembler::Sll, "sll {reg1}, {reg2}, {reg3}"), "Sll");
}
TEST_F(AssemblerRISCV64Test, Srl) {
DriverStr(RepeatRRR(&Riscv64Assembler::Srl, "srl {reg1}, {reg2}, {reg3}"), "Srl");
}
TEST_F(AssemblerRISCV64Test, Sra) {
DriverStr(RepeatRRR(&Riscv64Assembler::Sra, "sra {reg1}, {reg2}, {reg3}"), "Sra");
}
TEST_F(AssemblerRISCV64Test, Addiw) {
ScopedCSuppression scs(this);
DriverStr(RepeatRRIb(&Riscv64Assembler::Addiw, -12, "addiw {reg1}, {reg2}, {imm}"), "Addiw");
}
TEST_F(AssemblerRISCV64Test, Slliw) {
DriverStr(RepeatRRIb(&Riscv64Assembler::Slliw, /*imm_bits=*/ 5, "slliw {reg1}, {reg2}, {imm}"),
"Slliw");
}
TEST_F(AssemblerRISCV64Test, Srliw) {
DriverStr(RepeatRRIb(&Riscv64Assembler::Srliw, /*imm_bits=*/ 5, "srliw {reg1}, {reg2}, {imm}"),
"Srliw");
}
TEST_F(AssemblerRISCV64Test, Sraiw) {
DriverStr(RepeatRRIb(&Riscv64Assembler::Sraiw, /*imm_bits=*/ 5, "sraiw {reg1}, {reg2}, {imm}"),
"Sraiw");
}
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");
}
TEST_F(AssemblerRISCV64Test, Sllw) {
DriverStr(RepeatRRR(&Riscv64Assembler::Sllw, "sllw {reg1}, {reg2}, {reg3}"), "Sllw");
}
TEST_F(AssemblerRISCV64Test, Srlw) {
DriverStr(RepeatRRR(&Riscv64Assembler::Srlw, "srlw {reg1}, {reg2}, {reg3}"), "Srlw");
}
TEST_F(AssemblerRISCV64Test, Sraw) {
DriverStr(RepeatRRR(&Riscv64Assembler::Sraw, "sraw {reg1}, {reg2}, {reg3}"), "Sraw");
}
TEST_F(AssemblerRISCV64Test, Ecall) {
__ Ecall();
DriverStr("ecall\n", "Ecall");
}
TEST_F(AssemblerRISCV64Test, Ebreak) {
ScopedCSuppression scs(this);
__ Ebreak();
DriverStr("ebreak\n", "Ebreak");
}
TEST_F(AssemblerRISCV64Test, Fence) {
auto get_fence_type_string = [](uint32_t fence_type) {
CHECK_LE(fence_type, 0xfu);
std::string result;
if ((fence_type & kFenceInput) != 0u) {
result += "i";
}
if ((fence_type & kFenceOutput) != 0u) {
result += "o";
}
if ((fence_type & kFenceRead) != 0u) {
result += "r";
}
if ((fence_type & kFenceWrite) != 0u) {
result += "w";
}
if (result.empty()) {
result += "0";
}
return result;
};
std::string expected;
// Note: The `pred` and `succ` are 4 bits each.
// Some combinations are not really useful but the assembler can emit them all.
for (uint32_t pred = 0u; pred != 0x10; ++pred) {
for (uint32_t succ = 0u; succ != 0x10; ++succ) {
__ Fence(pred, succ);
expected +=
"fence " + get_fence_type_string(pred) + ", " + get_fence_type_string(succ) + "\n";
}
}
DriverStr(expected, "Fence");
}
TEST_F(AssemblerRISCV64Test, FenceTso) {
__ FenceTso();
DriverStr("fence.tso", "FenceTso");
}
TEST_F(AssemblerRISCV64Test, FenceI) {
__ FenceI();
DriverStr("fence.i", "FenceI");
}
TEST_F(AssemblerRISCV64Test, Mul) {
ScopedCSuppression scs(this);
DriverStr(RepeatRRR(&Riscv64Assembler::Mul, "mul {reg1}, {reg2}, {reg3}"), "Mul");
}
TEST_F(AssemblerRISCV64Test, Mulh) {
DriverStr(RepeatRRR(&Riscv64Assembler::Mulh, "mulh {reg1}, {reg2}, {reg3}"), "Mulh");
}
TEST_F(AssemblerRISCV64Test, Mulhsu) {
DriverStr(RepeatRRR(&Riscv64Assembler::Mulhsu, "mulhsu {reg1}, {reg2}, {reg3}"), "Mulhsu");
}
TEST_F(AssemblerRISCV64Test, Mulhu) {
DriverStr(RepeatRRR(&Riscv64Assembler::Mulhu, "mulhu {reg1}, {reg2}, {reg3}"), "Mulhu");
}
TEST_F(AssemblerRISCV64Test, Div) {
DriverStr(RepeatRRR(&Riscv64Assembler::Div, "div {reg1}, {reg2}, {reg3}"), "Div");
}
TEST_F(AssemblerRISCV64Test, Divu) {
DriverStr(RepeatRRR(&Riscv64Assembler::Divu, "divu {reg1}, {reg2}, {reg3}"), "Divu");
}
TEST_F(AssemblerRISCV64Test, Rem) {
DriverStr(RepeatRRR(&Riscv64Assembler::Rem, "rem {reg1}, {reg2}, {reg3}"), "Rem");
}
TEST_F(AssemblerRISCV64Test, Remu) {
DriverStr(RepeatRRR(&Riscv64Assembler::Remu, "remu {reg1}, {reg2}, {reg3}"), "Remu");
}
TEST_F(AssemblerRISCV64Test, Mulw) {
DriverStr(RepeatRRR(&Riscv64Assembler::Mulw, "mulw {reg1}, {reg2}, {reg3}"), "Mulw");
}
TEST_F(AssemblerRISCV64Test, Divw) {
DriverStr(RepeatRRR(&Riscv64Assembler::Divw, "divw {reg1}, {reg2}, {reg3}"), "Divw");
}
TEST_F(AssemblerRISCV64Test, Divuw) {
DriverStr(RepeatRRR(&Riscv64Assembler::Divuw, "divuw {reg1}, {reg2}, {reg3}"), "Divuw");
}
TEST_F(AssemblerRISCV64Test, Remw) {
DriverStr(RepeatRRR(&Riscv64Assembler::Remw, "remw {reg1}, {reg2}, {reg3}"), "Remw");
}
TEST_F(AssemblerRISCV64Test, Remuw) {
DriverStr(RepeatRRR(&Riscv64Assembler::Remuw, "remuw {reg1}, {reg2}, {reg3}"), "Remuw");
}
TEST_F(AssemblerRISCV64Test, 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) {
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) {
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) {
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) {
DriverStr(RepeatRRRAqRl(&Riscv64Assembler::AmoSwapW, "amoswap.w{aqrl} {reg1}, {reg2}, ({reg3})"),
"AmoSwapW");
}
TEST_F(AssemblerRISCV64Test, AmoSwapD) {
DriverStr(RepeatRRRAqRl(&Riscv64Assembler::AmoSwapD, "amoswap.d{aqrl} {reg1}, {reg2}, ({reg3})"),
"AmoSwapD");
}
TEST_F(AssemblerRISCV64Test, AmoAddW) {
DriverStr(RepeatRRRAqRl(&Riscv64Assembler::AmoAddW, "amoadd.w{aqrl} {reg1}, {reg2}, ({reg3})"),
"AmoAddW");
}
TEST_F(AssemblerRISCV64Test, AmoAddD) {
DriverStr(RepeatRRRAqRl(&Riscv64Assembler::AmoAddD, "amoadd.d{aqrl} {reg1}, {reg2}, ({reg3})"),
"AmoAddD");
}
TEST_F(AssemblerRISCV64Test, AmoXorW) {
DriverStr(RepeatRRRAqRl(&Riscv64Assembler::AmoXorW, "amoxor.w{aqrl} {reg1}, {reg2}, ({reg3})"),
"AmoXorW");
}
TEST_F(AssemblerRISCV64Test, AmoXorD) {
DriverStr(RepeatRRRAqRl(&Riscv64Assembler::AmoXorD, "amoxor.d{aqrl} {reg1}, {reg2}, ({reg3})"),
"AmoXorD");
}
TEST_F(AssemblerRISCV64Test, AmoAndW) {
DriverStr(RepeatRRRAqRl(&Riscv64Assembler::AmoAndW, "amoand.w{aqrl} {reg1}, {reg2}, ({reg3})"),
"AmoAndW");
}
TEST_F(AssemblerRISCV64Test, AmoAndD) {
DriverStr(RepeatRRRAqRl(&Riscv64Assembler::AmoAndD, "amoand.d{aqrl} {reg1}, {reg2}, ({reg3})"),
"AmoAndD");
}
TEST_F(AssemblerRISCV64Test, AmoOrW) {
DriverStr(RepeatRRRAqRl(&Riscv64Assembler::AmoOrW, "amoor.w{aqrl} {reg1}, {reg2}, ({reg3})"),
"AmoOrW");
}
TEST_F(AssemblerRISCV64Test, AmoOrD) {
DriverStr(RepeatRRRAqRl(&Riscv64Assembler::AmoOrD, "amoor.d{aqrl} {reg1}, {reg2}, ({reg3})"),
"AmoOrD");
}
TEST_F(AssemblerRISCV64Test, AmoMinW) {
DriverStr(RepeatRRRAqRl(&Riscv64Assembler::AmoMinW, "amomin.w{aqrl} {reg1}, {reg2}, ({reg3})"),
"AmoMinW");
}
TEST_F(AssemblerRISCV64Test, AmoMinD) {
DriverStr(RepeatRRRAqRl(&Riscv64Assembler::AmoMinD, "amomin.d{aqrl} {reg1}, {reg2}, ({reg3})"),
"AmoMinD");
}
TEST_F(AssemblerRISCV64Test, AmoMaxW) {
DriverStr(RepeatRRRAqRl(&Riscv64Assembler::AmoMaxW, "amomax.w{aqrl} {reg1}, {reg2}, ({reg3})"),
"AmoMaxW");
}
TEST_F(AssemblerRISCV64Test, AmoMaxD) {
DriverStr(RepeatRRRAqRl(&Riscv64Assembler::AmoMaxD, "amomax.d{aqrl} {reg1}, {reg2}, ({reg3})"),
"AmoMaxD");
}
TEST_F(AssemblerRISCV64Test, AmoMinuW) {
DriverStr(RepeatRRRAqRl(&Riscv64Assembler::AmoMinuW, "amominu.w{aqrl} {reg1}, {reg2}, ({reg3})"),
"AmoMinuW");
}
TEST_F(AssemblerRISCV64Test, AmoMinuD) {
DriverStr(RepeatRRRAqRl(&Riscv64Assembler::AmoMinuD, "amominu.d{aqrl} {reg1}, {reg2}, ({reg3})"),
"AmoMinuD");
}
TEST_F(AssemblerRISCV64Test, AmoMaxuW) {
DriverStr(RepeatRRRAqRl(&Riscv64Assembler::AmoMaxuW, "amomaxu.w{aqrl} {reg1}, {reg2}, ({reg3})"),
"AmoMaxuW");
}
TEST_F(AssemblerRISCV64Test, AmoMaxuD) {
DriverStr(RepeatRRRAqRl(&Riscv64Assembler::AmoMaxuD, "amomaxu.d{aqrl} {reg1}, {reg2}, ({reg3})"),
"AmoMaxuD");
}
TEST_F(AssemblerRISCV64Test, Csrrw) {
DriverStr(RepeatCsrrX(&Riscv64Assembler::Csrrw, "csrrw {reg1}, {csr}, {reg2}"), "Csrrw");
}
TEST_F(AssemblerRISCV64Test, Csrrs) {
DriverStr(RepeatCsrrX(&Riscv64Assembler::Csrrs, "csrrs {reg1}, {csr}, {reg2}"), "Csrrs");
}
TEST_F(AssemblerRISCV64Test, Csrrc) {
DriverStr(RepeatCsrrX(&Riscv64Assembler::Csrrc, "csrrc {reg1}, {csr}, {reg2}"), "Csrrc");
}
TEST_F(AssemblerRISCV64Test, Csrrwi) {
DriverStr(RepeatCsrrXi(&Riscv64Assembler::Csrrwi, "csrrwi {reg}, {csr}, {uimm}"), "Csrrwi");
}
TEST_F(AssemblerRISCV64Test, Csrrsi) {
DriverStr(RepeatCsrrXi(&Riscv64Assembler::Csrrsi, "csrrsi {reg}, {csr}, {uimm}"), "Csrrsi");
}
TEST_F(AssemblerRISCV64Test, Csrrci) {
DriverStr(RepeatCsrrXi(&Riscv64Assembler::Csrrci, "csrrci {reg}, {csr}, {uimm}"), "Csrrci");
}
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");
}
TEST_F(AssemblerRISCV64Test, FMAddS) {
DriverStr(RepeatFFFFRoundingMode(&Riscv64Assembler::FMAddS,
"fmadd.s {reg1}, {reg2}, {reg3}, {reg4}, {rm}"), "FMAddS");
}
TEST_F(AssemblerRISCV64Test, FMAddS_Default) {
DriverStr(RepeatFFFF(&Riscv64Assembler::FMAddS, "fmadd.s {reg1}, {reg2}, {reg3}, {reg4}"),
"FMAddS_Default");
}
TEST_F(AssemblerRISCV64Test, FMAddD) {
DriverStr(RepeatFFFFRoundingMode(&Riscv64Assembler::FMAddD,
"fmadd.d {reg1}, {reg2}, {reg3}, {reg4}, {rm}"), "FMAddD");
}
TEST_F(AssemblerRISCV64Test, FMAddD_Default) {
DriverStr(RepeatFFFF(&Riscv64Assembler::FMAddD, "fmadd.d {reg1}, {reg2}, {reg3}, {reg4}"),
"FMAddD_Default");
}
TEST_F(AssemblerRISCV64Test, FMSubS) {
DriverStr(RepeatFFFFRoundingMode(&Riscv64Assembler::FMSubS,
"fmsub.s {reg1}, {reg2}, {reg3}, {reg4}, {rm}"), "FMSubS");
}
TEST_F(AssemblerRISCV64Test, FMSubS_Default) {
DriverStr(RepeatFFFF(&Riscv64Assembler::FMSubS, "fmsub.s {reg1}, {reg2}, {reg3}, {reg4}"),
"FMSubS_Default");
}
TEST_F(AssemblerRISCV64Test, FMSubD) {
DriverStr(RepeatFFFFRoundingMode(&Riscv64Assembler::FMSubD,
"fmsub.d {reg1}, {reg2}, {reg3}, {reg4}, {rm}"), "FMSubD");
}
TEST_F(AssemblerRISCV64Test, FMSubD_Default) {
DriverStr(RepeatFFFF(&Riscv64Assembler::FMSubD, "fmsub.d {reg1}, {reg2}, {reg3}, {reg4}"),
"FMSubD_Default");
}
TEST_F(AssemblerRISCV64Test, FNMSubS) {
DriverStr(RepeatFFFFRoundingMode(&Riscv64Assembler::FNMSubS,
"fnmsub.s {reg1}, {reg2}, {reg3}, {reg4}, {rm}"), "FNMSubS");
}
TEST_F(AssemblerRISCV64Test, FNMSubS_Default) {
DriverStr(RepeatFFFF(&Riscv64Assembler::FNMSubS, "fnmsub.s {reg1}, {reg2}, {reg3}, {reg4}"),
"FNMSubS_Default");
}
TEST_F(AssemblerRISCV64Test, FNMSubD) {
DriverStr(RepeatFFFFRoundingMode(&Riscv64Assembler::FNMSubD,
"fnmsub.d {reg1}, {reg2}, {reg3}, {reg4}, {rm}"), "FNMSubD");
}
TEST_F(AssemblerRISCV64Test, FNMSubD_Default) {
DriverStr(RepeatFFFF(&Riscv64Assembler::FNMSubD, "fnmsub.d {reg1}, {reg2}, {reg3}, {reg4}"),
"FNMSubD_Default");
}
TEST_F(AssemblerRISCV64Test, FNMAddS) {
DriverStr(RepeatFFFFRoundingMode(&Riscv64Assembler::FNMAddS,
"fnmadd.s {reg1}, {reg2}, {reg3}, {reg4}, {rm}"), "FNMAddS");
}
TEST_F(AssemblerRISCV64Test, FNMAddS_Default) {
DriverStr(RepeatFFFF(&Riscv64Assembler::FNMAddS, "fnmadd.s {reg1}, {reg2}, {reg3}, {reg4}"),
"FNMAddS_Default");
}
TEST_F(AssemblerRISCV64Test, FNMAddD) {
DriverStr(RepeatFFFFRoundingMode(&Riscv64Assembler::FNMAddD,
"fnmadd.d {reg1}, {reg2}, {reg3}, {reg4}, {rm}"), "FNMAddD");
}
TEST_F(AssemblerRISCV64Test, FNMAddD_Default) {
DriverStr(RepeatFFFF(&Riscv64Assembler::FNMAddD, "fnmadd.d {reg1}, {reg2}, {reg3}, {reg4}"),
"FNMAddD_Default");
}
TEST_F(AssemblerRISCV64Test, FAddS) {
DriverStr(RepeatFFFRoundingMode(&Riscv64Assembler::FAddS, "fadd.s {reg1}, {reg2}, {reg3}, {rm}"),
"FAddS");
}
TEST_F(AssemblerRISCV64Test, FAddS_Default) {
DriverStr(RepeatFFF(&Riscv64Assembler::FAddS, "fadd.s {reg1}, {reg2}, {reg3}"), "FAddS_Default");
}
TEST_F(AssemblerRISCV64Test, FAddD) {
DriverStr(RepeatFFFRoundingMode(&Riscv64Assembler::FAddD, "fadd.d {reg1}, {reg2}, {reg3}, {rm}"),
"FAddD");
}
TEST_F(AssemblerRISCV64Test, FAddD_Default) {
DriverStr(RepeatFFF(&Riscv64Assembler::FAddD, "fadd.d {reg1}, {reg2}, {reg3}"), "FAddD_Default");
}
TEST_F(AssemblerRISCV64Test, FSubS) {
DriverStr(RepeatFFFRoundingMode(&Riscv64Assembler::FSubS, "fsub.s {reg1}, {reg2}, {reg3}, {rm}"),
"FSubS");
}
TEST_F(AssemblerRISCV64Test, FSubS_Default) {
DriverStr(RepeatFFF(&Riscv64Assembler::FSubS, "fsub.s {reg1}, {reg2}, {reg3}"), "FSubS_Default");
}
TEST_F(AssemblerRISCV64Test, FSubD) {
DriverStr(RepeatFFFRoundingMode(&Riscv64Assembler::FSubD, "fsub.d {reg1}, {reg2}, {reg3}, {rm}"),
"FSubD");
}
TEST_F(AssemblerRISCV64Test, FSubD_Default) {
DriverStr(RepeatFFF(&Riscv64Assembler::FSubD, "fsub.d {reg1}, {reg2}, {reg3}"), "FSubD_Default");
}
TEST_F(AssemblerRISCV64Test, FMulS) {
DriverStr(RepeatFFFRoundingMode(&Riscv64Assembler::FMulS, "fmul.s {reg1}, {reg2}, {reg3}, {rm}"),
"FMulS");
}
TEST_F(AssemblerRISCV64Test, FMulS_Default) {
DriverStr(RepeatFFF(&Riscv64Assembler::FMulS, "fmul.s {reg1}, {reg2}, {reg3}"), "FMulS_Default");
}
TEST_F(AssemblerRISCV64Test, FMulD) {
DriverStr(RepeatFFFRoundingMode(&Riscv64Assembler::FMulD, "fmul.d {reg1}, {reg2}, {reg3}, {rm}"),
"FMulD");
}
TEST_F(AssemblerRISCV64Test, FMulD_Default) {
DriverStr(RepeatFFF(&Riscv64Assembler::FMulD, "fmul.d {reg1}, {reg2}, {reg3}"), "FMulD_Default");
}
TEST_F(AssemblerRISCV64Test, FDivS) {
DriverStr(RepeatFFFRoundingMode(&Riscv64Assembler::FDivS, "fdiv.s {reg1}, {reg2}, {reg3}, {rm}"),
"FDivS");
}
TEST_F(AssemblerRISCV64Test, FDivS_Default) {
DriverStr(RepeatFFF(&Riscv64Assembler::FDivS, "fdiv.s {reg1}, {reg2}, {reg3}"), "FDivS_Default");
}
TEST_F(AssemblerRISCV64Test, FDivD) {
DriverStr(RepeatFFFRoundingMode(&Riscv64Assembler::FDivD, "fdiv.d {reg1}, {reg2}, {reg3}, {rm}"),
"FDivD");
}
TEST_F(AssemblerRISCV64Test, FDivD_Default) {
DriverStr(RepeatFFF(&Riscv64Assembler::FDivD, "fdiv.d {reg1}, {reg2}, {reg3}"), "FDivD_Default");
}
TEST_F(AssemblerRISCV64Test, FSqrtS) {
DriverStr(RepeatFFRoundingMode(&Riscv64Assembler::FSqrtS, "fsqrt.s {reg1}, {reg2}, {rm}"),
"FSqrtS");
}
TEST_F(AssemblerRISCV64Test, FSqrtS_Default) {
DriverStr(RepeatFF(&Riscv64Assembler::FSqrtS, "fsqrt.s {reg1}, {reg2}"), "FSqrtS_Default");
}
TEST_F(AssemblerRISCV64Test, FSqrtD) {
DriverStr(RepeatFFRoundingMode(&Riscv64Assembler::FSqrtD, "fsqrt.d {reg1}, {reg2}, {rm}"),
"FSqrtD");
}
TEST_F(AssemblerRISCV64Test, FSqrtD_Default) {
DriverStr(RepeatFF(&Riscv64Assembler::FSqrtD, "fsqrt.d {reg1}, {reg2}"), "FSqrtD_Default");
}
TEST_F(AssemblerRISCV64Test, FSgnjS) {
DriverStr(RepeatFFF(&Riscv64Assembler::FSgnjS, "fsgnj.s {reg1}, {reg2}, {reg3}"), "FSgnjS");
}
TEST_F(AssemblerRISCV64Test, FSgnjD) {
DriverStr(RepeatFFF(&Riscv64Assembler::FSgnjD, "fsgnj.d {reg1}, {reg2}, {reg3}"), "FSgnjD");
}
TEST_F(AssemblerRISCV64Test, FSgnjnS) {
DriverStr(RepeatFFF(&Riscv64Assembler::FSgnjnS, "fsgnjn.s {reg1}, {reg2}, {reg3}"), "FSgnjnS");
}
TEST_F(AssemblerRISCV64Test, FSgnjnD) {
DriverStr(RepeatFFF(&Riscv64Assembler::FSgnjnD, "fsgnjn.d {reg1}, {reg2}, {reg3}"), "FSgnjnD");
}
TEST_F(AssemblerRISCV64Test, FSgnjxS) {
DriverStr(RepeatFFF(&Riscv64Assembler::FSgnjxS, "fsgnjx.s {reg1}, {reg2}, {reg3}"), "FSgnjxS");
}
TEST_F(AssemblerRISCV64Test, FSgnjxD) {
DriverStr(RepeatFFF(&Riscv64Assembler::FSgnjxD, "fsgnjx.d {reg1}, {reg2}, {reg3}"), "FSgnjxD");
}
TEST_F(AssemblerRISCV64Test, FMinS) {
DriverStr(RepeatFFF(&Riscv64Assembler::FMinS, "fmin.s {reg1}, {reg2}, {reg3}"), "FMinS");
}
TEST_F(AssemblerRISCV64Test, FMinD) {
DriverStr(RepeatFFF(&Riscv64Assembler::FMinD, "fmin.d {reg1}, {reg2}, {reg3}"), "FMinD");
}
TEST_F(AssemblerRISCV64Test, FMaxS) {
DriverStr(RepeatFFF(&Riscv64Assembler::FMaxS, "fmax.s {reg1}, {reg2}, {reg3}"), "FMaxS");
}
TEST_F(AssemblerRISCV64Test, FMaxD) {
DriverStr(RepeatFFF(&Riscv64Assembler::FMaxD, "fmax.d {reg1}, {reg2}, {reg3}"), "FMaxD");
}
TEST_F(AssemblerRISCV64Test, FCvtSD) {
DriverStr(RepeatFFRoundingMode(&Riscv64Assembler::FCvtSD, "fcvt.s.d {reg1}, {reg2}, {rm}"),
"FCvtSD");
}
TEST_F(AssemblerRISCV64Test, FCvtSD_Default) {
DriverStr(RepeatFF(&Riscv64Assembler::FCvtSD, "fcvt.s.d {reg1}, {reg2}"), "FCvtSD_Default");
}
// This conversion is lossless, so the rounding mode is meaningless and the assembler we're
// testing against does not even accept the rounding mode argument, so this test is disabled.
TEST_F(AssemblerRISCV64Test, DISABLED_FCvtDS) {
DriverStr(RepeatFFRoundingMode(&Riscv64Assembler::FCvtDS, "fcvt.d.s {reg1}, {reg2}, {rm}"),
"FCvtDS");
}
TEST_F(AssemblerRISCV64Test, FCvtDS_Default) {
DriverStr(RepeatFF(&Riscv64Assembler::FCvtDS, "fcvt.d.s {reg1}, {reg2}"), "FCvtDS_Default");
}
TEST_F(AssemblerRISCV64Test, FEqS) {
DriverStr(RepeatRFF(&Riscv64Assembler::FEqS, "feq.s {reg1}, {reg2}, {reg3}"), "FEqS");
}
TEST_F(AssemblerRISCV64Test, FEqD) {
DriverStr(RepeatRFF(&Riscv64Assembler::FEqD, "feq.d {reg1}, {reg2}, {reg3}"), "FEqD");
}
TEST_F(AssemblerRISCV64Test, FLtS) {
DriverStr(RepeatRFF(&Riscv64Assembler::FLtS, "flt.s {reg1}, {reg2}, {reg3}"), "FLtS");
}
TEST_F(AssemblerRISCV64Test, FLtD) {
DriverStr(RepeatRFF(&Riscv64Assembler::FLtD, "flt.d {reg1}, {reg2}, {reg3}"), "FLtD");
}
TEST_F(AssemblerRISCV64Test, FLeS) {
DriverStr(RepeatRFF(&Riscv64Assembler::FLeS, "fle.s {reg1}, {reg2}, {reg3}"), "FLeS");
}
TEST_F(AssemblerRISCV64Test, FLeD) {
DriverStr(RepeatRFF(&Riscv64Assembler::FLeD, "fle.d {reg1}, {reg2}, {reg3}"), "FLeD");
}
TEST_F(AssemblerRISCV64Test, FCvtWS) {
DriverStr(RepeatrFRoundingMode(&Riscv64Assembler::FCvtWS, "fcvt.w.s {reg1}, {reg2}, {rm}"),
"FCvtWS");
}
TEST_F(AssemblerRISCV64Test, FCvtWS_Default) {
DriverStr(RepeatrF(&Riscv64Assembler::FCvtWS, "fcvt.w.s {reg1}, {reg2}"), "FCvtWS_Default");
}
TEST_F(AssemblerRISCV64Test, FCvtWD) {
DriverStr(RepeatrFRoundingMode(&Riscv64Assembler::FCvtWD, "fcvt.w.d {reg1}, {reg2}, {rm}"),
"FCvtWD");
}
TEST_F(AssemblerRISCV64Test, FCvtWD_Default) {
DriverStr(RepeatrF(&Riscv64Assembler::FCvtWD, "fcvt.w.d {reg1}, {reg2}"), "FCvtWD_Default");
}
TEST_F(AssemblerRISCV64Test, FCvtWuS) {
DriverStr(RepeatrFRoundingMode(&Riscv64Assembler::FCvtWuS, "fcvt.wu.s {reg1}, {reg2}, {rm}"),
"FCvtWuS");
}
TEST_F(AssemblerRISCV64Test, FCvtWuS_Default) {
DriverStr(RepeatrF(&Riscv64Assembler::FCvtWuS, "fcvt.wu.s {reg1}, {reg2}"), "FCvtWuS_Default");
}
TEST_F(AssemblerRISCV64Test, FCvtWuD) {
DriverStr(RepeatrFRoundingMode(&Riscv64Assembler::FCvtWuD, "fcvt.wu.d {reg1}, {reg2}, {rm}"),
"FCvtWuD");
}
TEST_F(AssemblerRISCV64Test, FCvtWuD_Default) {
DriverStr(RepeatrF(&Riscv64Assembler::FCvtWuD, "fcvt.wu.d {reg1}, {reg2}"), "FCvtWuD_Default");
}
TEST_F(AssemblerRISCV64Test, FCvtLS) {
DriverStr(RepeatrFRoundingMode(&Riscv64Assembler::FCvtLS, "fcvt.l.s {reg1}, {reg2}, {rm}"),
"FCvtLS");
}
TEST_F(AssemblerRISCV64Test, FCvtLS_Default) {
DriverStr(RepeatrF(&Riscv64Assembler::FCvtLS, "fcvt.l.s {reg1}, {reg2}"), "FCvtLS_Default");
}
TEST_F(AssemblerRISCV64Test, FCvtLD) {
DriverStr(RepeatrFRoundingMode(&Riscv64Assembler::FCvtLD, "fcvt.l.d {reg1}, {reg2}, {rm}"),
"FCvtLD");
}
TEST_F(AssemblerRISCV64Test, FCvtLD_Default) {
DriverStr(RepeatrF(&Riscv64Assembler::FCvtLD, "fcvt.l.d {reg1}, {reg2}"), "FCvtLD_Default");
}
TEST_F(AssemblerRISCV64Test, FCvtLuS) {
DriverStr(RepeatrFRoundingMode(&Riscv64Assembler::FCvtLuS, "fcvt.lu.s {reg1}, {reg2}, {rm}"),
"FCvtLuS");
}
TEST_F(AssemblerRISCV64Test, FCvtLuS_Default) {
DriverStr(RepeatrF(&Riscv64Assembler::FCvtLuS, "fcvt.lu.s {reg1}, {reg2}"), "FCvtLuS_Default");
}
TEST_F(AssemblerRISCV64Test, FCvtLuD) {
DriverStr(RepeatrFRoundingMode(&Riscv64Assembler::FCvtLuD, "fcvt.lu.d {reg1}, {reg2}, {rm}"),
"FCvtLuD");
}
TEST_F(AssemblerRISCV64Test, FCvtLuD_Default) {
DriverStr(RepeatrF(&Riscv64Assembler::FCvtLuD, "fcvt.lu.d {reg1}, {reg2}"), "FCvtLuD_Default");
}
TEST_F(AssemblerRISCV64Test, FCvtSW) {
DriverStr(RepeatFrRoundingMode(&Riscv64Assembler::FCvtSW, "fcvt.s.w {reg1}, {reg2}, {rm}"),
"FCvtSW");
}
TEST_F(AssemblerRISCV64Test, FCvtSW_Default) {
DriverStr(RepeatFr(&Riscv64Assembler::FCvtSW, "fcvt.s.w {reg1}, {reg2}"), "FCvtSW_Default");
}
// This conversion is lossless, so the rounding mode is meaningless and the assembler we're
// testing against does not even accept the rounding mode argument, so this test is disabled.
TEST_F(AssemblerRISCV64Test, DISABLED_FCvtDW) {
DriverStr(RepeatFrRoundingMode(&Riscv64Assembler::FCvtDW, "fcvt.d.w {reg1}, {reg2}, {rm}"),
"FCvtDW");
}
TEST_F(AssemblerRISCV64Test, FCvtDW_Default) {
DriverStr(RepeatFr(&Riscv64Assembler::FCvtDW, "fcvt.d.w {reg1}, {reg2}"), "FCvtDW_Default");
}
TEST_F(AssemblerRISCV64Test, FCvtSWu) {
DriverStr(RepeatFrRoundingMode(&Riscv64Assembler::FCvtSWu, "fcvt.s.wu {reg1}, {reg2}, {rm}"),
"FCvtSWu");
}
TEST_F(AssemblerRISCV64Test, FCvtSWu_Default) {
DriverStr(RepeatFr(&Riscv64Assembler::FCvtSWu, "fcvt.s.wu {reg1}, {reg2}"), "FCvtSWu_Default");
}
// This conversion is lossless, so the rounding mode is meaningless and the assembler we're
// testing against does not even accept the rounding mode argument, so this test is disabled.
TEST_F(AssemblerRISCV64Test, DISABLED_FCvtDWu) {
DriverStr(RepeatFrRoundingMode(&Riscv64Assembler::FCvtDWu, "fcvt.d.wu {reg1}, {reg2}, {rm}"),
"FCvtDWu");
}
TEST_F(AssemblerRISCV64Test, FCvtDWu_Default) {
DriverStr(RepeatFr(&Riscv64Assembler::FCvtDWu, "fcvt.d.wu {reg1}, {reg2}"), "FCvtDWu_Default");
}
TEST_F(AssemblerRISCV64Test, FCvtSL) {
DriverStr(RepeatFrRoundingMode(&Riscv64Assembler::FCvtSL, "fcvt.s.l {reg1}, {reg2}, {rm}"),
"FCvtSL");
}
TEST_F(AssemblerRISCV64Test, FCvtSL_Default) {
DriverStr(RepeatFr(&Riscv64Assembler::FCvtSL, "fcvt.s.l {reg1}, {reg2}"), "FCvtSL_Default");
}
TEST_F(AssemblerRISCV64Test, FCvtDL) {
DriverStr(RepeatFrRoundingMode(&Riscv64Assembler::FCvtDL, "fcvt.d.l {reg1}, {reg2}, {rm}"),
"FCvtDL");
}
TEST_F(AssemblerRISCV64Test, FCvtDL_Default) {
DriverStr(RepeatFr(&Riscv64Assembler::FCvtDL, "fcvt.d.l {reg1}, {reg2}"), "FCvtDL_Default");
}
TEST_F(AssemblerRISCV64Test, FCvtSLu) {
DriverStr(RepeatFrRoundingMode(&Riscv64Assembler::FCvtSLu, "fcvt.s.lu {reg1}, {reg2}, {rm}"),
"FCvtSLu");
}
TEST_F(AssemblerRISCV64Test, FCvtSLu_Default) {
DriverStr(RepeatFr(&Riscv64Assembler::FCvtSLu, "fcvt.s.lu {reg1}, {reg2}"), "FCvtSLu_Default");
}
TEST_F(AssemblerRISCV64Test, FCvtDLu) {
DriverStr(RepeatFrRoundingMode(&Riscv64Assembler::FCvtDLu, "fcvt.d.lu {reg1}, {reg2}, {rm}"),
"FCvtDLu");
}
TEST_F(AssemblerRISCV64Test, FCvtDLu_Default) {
DriverStr(RepeatFr(&Riscv64Assembler::FCvtDLu, "fcvt.d.lu {reg1}, {reg2}"), "FCvtDLu_Default");
}
TEST_F(AssemblerRISCV64Test, FMvXW) {
DriverStr(RepeatRF(&Riscv64Assembler::FMvXW, "fmv.x.w {reg1}, {reg2}"), "FMvXW");
}
TEST_F(AssemblerRISCV64Test, FMvXD) {
DriverStr(RepeatRF(&Riscv64Assembler::FMvXD, "fmv.x.d {reg1}, {reg2}"), "FMvXD");
}
TEST_F(AssemblerRISCV64Test, FMvWX) {
DriverStr(RepeatFR(&Riscv64Assembler::FMvWX, "fmv.w.x {reg1}, {reg2}"), "FMvWX");
}
TEST_F(AssemblerRISCV64Test, FMvDX) {
DriverStr(RepeatFR(&Riscv64Assembler::FMvDX, "fmv.d.x {reg1}, {reg2}"), "FMvDX");
}
TEST_F(AssemblerRISCV64Test, FClassS) {
DriverStr(RepeatRF(&Riscv64Assembler::FClassS, "fclass.s {reg1}, {reg2}"), "FClassS");
}
TEST_F(AssemblerRISCV64Test, FClassD) {
DriverStr(RepeatrF(&Riscv64Assembler::FClassD, "fclass.d {reg1}, {reg2}"), "FClassD");
}
TEST_F(AssemblerRISCV64Test, CLwsp) {
DriverStr(RepeatCRImm(&Riscv64Assembler::CLwsp,
/*is_short=*/false,
/*no_zero_reg=*/true,
/*no_zero_imm=*/false,
/*imm_bits=*/6,
/*shift=*/2,
"c.lwsp {reg}, {imm}(sp)"),
"CLwsp");
}
TEST_F(AssemblerRISCV64Test, CLdsp) {
DriverStr(RepeatCRImm(&Riscv64Assembler::CLdsp,
/*is_short=*/false,
/*no_zero_reg=*/true,
/*no_zero_imm=*/false,
/*imm_bits=*/6,
/*shift=*/3,
"c.ldsp {reg}, {imm}(sp)"),
"CLdsp");
}
TEST_F(AssemblerRISCV64Test, CFLdsp) {
DriverStr(RepeatCFImm(
&Riscv64Assembler::CFLdsp, /*imm_bits=*/6, /*shift=*/3, "c.fldsp {reg}, {imm}(sp)"),
"CFLdsp");
}
TEST_F(AssemblerRISCV64Test, CSwsp) {
DriverStr(RepeatCRImm(&Riscv64Assembler::CSwsp,
/*is_short=*/false,
/*no_zero_reg=*/false,
/*no_zero_imm=*/false,
/*imm_bits=*/6,
/*shift=*/2,
"c.swsp {reg}, {imm}(sp)"),
"CLwsp");
}
TEST_F(AssemblerRISCV64Test, CSdsp) {
DriverStr(RepeatCRImm(&Riscv64Assembler::CSdsp,
/*is_short=*/false,
/*no_zero_reg=*/false,
/*no_zero_imm=*/false,
/*imm_bits=*/6,
/*shift=*/3,
"c.sdsp {reg}, {imm}(sp)"),
"CLdsp");
}
TEST_F(AssemblerRISCV64Test, CFSdsp) {
DriverStr(RepeatCFImm(
&Riscv64Assembler::CFSdsp, /*imm_bits=*/6, /*shift=*/3, "c.fsdsp {reg}, {imm}(sp)"),
"CFLdsp");
}
TEST_F(AssemblerRISCV64Test, CLw) {
DriverStr(RepeatCRRImm(
&Riscv64Assembler::CLw, /*imm_bits=*/5, /*shift=*/2, "c.lw {reg1}, {imm}({reg2})"),
"CLw");
}
TEST_F(AssemblerRISCV64Test, CLd) {
DriverStr(RepeatCRRImm(
&Riscv64Assembler::CLd, /*imm_bits=*/5, /*shift=*/3, "c.ld {reg1}, {imm}({reg2})"),
"CLd");
}
TEST_F(AssemblerRISCV64Test, CFLd) {
DriverStr(RepeatCFRImm(&Riscv64Assembler::CFLd,
/*imm_bits=*/5,
/*shift=*/3,
"c.fld {reg1}, {imm}({reg2})"),
"CFLd");
}
TEST_F(AssemblerRISCV64Test, CSw) {
DriverStr(RepeatCRRImm(
&Riscv64Assembler::CSw, /*imm_bits=*/5, /*shift=*/2, "c.sw {reg1}, {imm}({reg2})"),
"CSw");
}
TEST_F(AssemblerRISCV64Test, CSd) {
DriverStr(RepeatCRRImm(
&Riscv64Assembler::CSd, /*imm_bits=*/5, /*shift=*/3, "c.sd {reg1}, {imm}({reg2})"),
"CSd");
}
TEST_F(AssemblerRISCV64Test, CFSd) {
DriverStr(RepeatCFRImm(&Riscv64Assembler::CFSd,
/*imm_bits=*/5,
/*shift=*/3,
"c.fsd {reg1}, {imm}({reg2})"),
"CFSd");
}
TEST_F(AssemblerRISCV64Test, CLi) {
DriverStr(RepeatCRImm(&Riscv64Assembler::CLi,
/*is_short=*/false,
/*no_zero_reg=*/true,
/*no_zero_imm=*/false,
/*imm_bits=*/-6,
/*shift=*/0,
"c.li {reg}, {imm}"),
"CLi");
}
TEST_F(AssemblerRISCV64Test, CLui) {
std::string str;
auto imms = CreateImmediateValuesBits(/*imm_bits=*/5, /*as_uint=*/true);
for (uint32_t v = 0xfffe0; v <= 0xfffff; ++v) {
imms.push_back(v);
}
for (XRegister reg : GetRegisters()) {
for (int64_t imm_raw : imms) {
if (imm_raw == 0) {
continue;
}
if (reg == Zero || reg == SP) {
continue;
}
uint32_t imm = CreateImmediate(imm_raw);
GetAssembler()->CLui(reg, imm);
std::string base = "c.lui {reg}, {imm}";
ReplaceReg(REG_TOKEN, GetRegisterName(reg), &base);
ReplaceImm(imm, /*bias=*/0, /*multiplier=*/1, &base);
str += base;
str += "\n";
}
}
DriverStr(str, "CLui");
}
TEST_F(AssemblerRISCV64Test, CAddi) {
DriverStr(RepeatCRImm(&Riscv64Assembler::CAddi,
/*is_short=*/false,
/*no_zero_reg=*/true,
/*no_zero_imm=*/true,
/*imm_bits=*/-6,
/*shift=*/0,
"c.addi {reg}, {imm}"),
"CAddi");
}
TEST_F(AssemblerRISCV64Test, CAddiw) {
DriverStr(RepeatCRImm(&Riscv64Assembler::CAddiw,
/*is_short=*/false,
/*no_zero_reg=*/true,
/*no_zero_imm=*/false,
/*imm_bits=*/-6,
/*shift=*/0,
"c.addiw {reg}, {imm}"),
"CAddiw");
}
TEST_F(AssemblerRISCV64Test, CAddi16Sp) {
DriverStr(RepeatImm(&Riscv64Assembler::CAddi16Sp,
/*no_zero_imm=*/true,
/*imm_bits=*/-6,
/*shift=*/4,
"c.addi16sp sp, {imm}"),
"CAddi16Sp");
}
TEST_F(AssemblerRISCV64Test, CAddi4Spn) {
DriverStr(RepeatCRImm(&Riscv64Assembler::CAddi4Spn,
/*is_short=*/true,
/*no_zero_reg=*/false,
/*no_zero_imm=*/true,
/*imm_bits=*/8,
/*shift=*/2,
"c.addi4spn {reg}, sp, {imm}"),
"CAddi4Spn");
}
TEST_F(AssemblerRISCV64Test, CSlli) {
DriverStr(RepeatCRImm(&Riscv64Assembler::CSlli,
/*is_short=*/false,
/*no_zero_reg=*/true,
/*no_zero_imm=*/true,
/*imm_bits=*/6,
/*shift=*/0,
"c.slli {reg}, {imm}"),
"CSlli");
}
TEST_F(AssemblerRISCV64Test, CSRli) {
DriverStr(RepeatCRImm(&Riscv64Assembler::CSrli,
/*is_short=*/true,
/*no_zero_reg=*/false,
/*no_zero_imm=*/true,
/*imm_bits=*/6,
/*shift=*/0,
"c.srli {reg}, {imm}"),
"CSRli");
}
TEST_F(AssemblerRISCV64Test, CSRai) {
DriverStr(RepeatCRImm(&Riscv64Assembler::CSrai,
/*is_short=*/true,
/*no_zero_reg=*/false,
/*no_zero_imm=*/true,
/*imm_bits=*/6,
/*shift=*/0,
"c.srai {reg}, {imm}"),
"CSRai");
}
TEST_F(AssemblerRISCV64Test, CAndi) {
DriverStr(RepeatCRImm(&Riscv64Assembler::CAndi,
/*is_short=*/true,
/*no_zero_reg=*/false,
/*no_zero_imm=*/false,
/*imm_bits=*/-6,
/*shift=*/0,
"c.andi {reg}, {imm}"),
"CAndi");
}
TEST_F(AssemblerRISCV64Test, CMv) {
DriverStr(RepeatCRRNonZero(&Riscv64Assembler::CMv, "c.mv {reg1}, {reg2}"), "CMv");
}
TEST_F(AssemblerRISCV64Test, CAdd) {
DriverStr(RepeatCRRNonZero(&Riscv64Assembler::CAdd, "c.add {reg1}, {reg2}"), "CAdd");
}
TEST_F(AssemblerRISCV64Test, CAnd) {
DriverStr(RepeatCRRShort(&Riscv64Assembler::CAnd, "c.and {reg1}, {reg2}"), "CAnd");
}
TEST_F(AssemblerRISCV64Test, COr) {
DriverStr(RepeatCRRShort(&Riscv64Assembler::COr, "c.or {reg1}, {reg2}"), "COr");
}
TEST_F(AssemblerRISCV64Test, CXor) {
DriverStr(RepeatCRRShort(&Riscv64Assembler::CXor, "c.xor {reg1}, {reg2}"), "CXor");
}
TEST_F(AssemblerRISCV64Test, CSub) {
DriverStr(RepeatCRRShort(&Riscv64Assembler::CSub, "c.sub {reg1}, {reg2}"), "CSub");
}
TEST_F(AssemblerRISCV64Test, CAddw) {
DriverStr(RepeatCRRShort(&Riscv64Assembler::CAddw, "c.addw {reg1}, {reg2}"), "CAddw");
}
TEST_F(AssemblerRISCV64Test, CSubw) {
DriverStr(RepeatCRRShort(&Riscv64Assembler::CSubw, "c.subw {reg1}, {reg2}"), "CSubw");
}
TEST_F(AssemblerRISCV64Test, CLbu) {
DriverStr(RepeatCRRImm(&Riscv64Assembler::CLbu,
/*imm_bits=*/2,
/*shift=*/0,
"c.lbu {reg1}, {imm}({reg2})"),
"CLbu");
}
TEST_F(AssemblerRISCV64Test, CLhu) {
DriverStr(RepeatCRRImm(&Riscv64Assembler::CLhu,
/*imm_bits=*/1,
/*shift=*/1,
"c.lhu {reg1}, {imm}({reg2})"),
"CLhu");
}
TEST_F(AssemblerRISCV64Test, CLh) {
DriverStr(RepeatCRRImm(&Riscv64Assembler::CLh,
/*imm_bits=*/1,
/*shift=*/1,
"c.lh {reg1}, {imm}({reg2})"),
"CLh");
}
TEST_F(AssemblerRISCV64Test, CSb) {
DriverStr(RepeatCRRImm(&Riscv64Assembler::CSb,
/*imm_bits=*/2,
/*shift=*/0,
"c.sb {reg1}, {imm}({reg2})"),
"CSb");
}
TEST_F(AssemblerRISCV64Test, CSh) {
DriverStr(RepeatCRRImm(&Riscv64Assembler::CSh,
/*imm_bits=*/1,
/*shift=*/1,
"c.sh {reg1}, {imm}({reg2})"),
"CSh");
}
TEST_F(AssemblerRISCV64Test, CZext_b) {
DriverStr(RepeatCRShort(&Riscv64Assembler::CZext_b, "c.zext.b {reg}"), "CZext_b");
}
TEST_F(AssemblerRISCV64Test, CSext_b) {
DriverStr(RepeatCRShort(&Riscv64Assembler::CSext_b, "c.sext.b {reg}"), "CSext_b");
}
TEST_F(AssemblerRISCV64Test, CZext_h) {
DriverStr(RepeatCRShort(&Riscv64Assembler::CZext_h, "c.zext.h {reg}"), "CZext_h");
}
TEST_F(AssemblerRISCV64Test, CSext_h) {
DriverStr(RepeatCRShort(&Riscv64Assembler::CSext_h, "c.sext.h {reg}"), "CSext_h");
}
TEST_F(AssemblerRISCV64Test, CZext_w) {
DriverStr(RepeatCRShort(&Riscv64Assembler::CZext_w, "c.zext.w {reg}"), "CZext_w");
}
TEST_F(AssemblerRISCV64Test, CNot) {
DriverStr(RepeatCRShort(&Riscv64Assembler::CNot, "c.not {reg}"), "CNot");
}
TEST_F(AssemblerRISCV64Test, CMul) {
DriverStr(RepeatCRRShort(&Riscv64Assembler::CMul, "c.mul {reg1}, {reg2}"), "CMul");
}
TEST_F(AssemblerRISCV64Test, CJ) {
DriverStr(
RepeatImm(
&Riscv64Assembler::CJ, /*no_zero_imm=*/false, /*imm_bits=*/-11, /*shift=*/1, "c.j {imm}"),
"CJ");
}
TEST_F(AssemblerRISCV64Test, CJr) {
DriverStr(RepeatRNoZero(&Riscv64Assembler::CJr, "c.jr {reg}"), "CJr");
}
TEST_F(AssemblerRISCV64Test, CJalr) {
DriverStr(RepeatRNoZero(&Riscv64Assembler::CJalr, "c.jalr {reg}"), "CJalr");
}
TEST_F(AssemblerRISCV64Test, CBeqz) {
DriverStr(RepeatCRImm(&Riscv64Assembler::CBeqz,
/*is_short=*/true,
/*no_zero_reg=*/false,
/*no_zero_imm=*/false,
/*imm_bits=*/-8,
/*shift=*/1,
"c.beqz {reg}, {imm}"),
"CBeqz");
}
TEST_F(AssemblerRISCV64Test, CBnez) {
DriverStr(RepeatCRImm(&Riscv64Assembler::CBnez,
/*is_short=*/true,
/*no_zero_reg=*/false,
/*no_zero_imm=*/false,
/*imm_bits=*/-8,
/*shift=*/1,
"c.bnez {reg}, {imm}"),
"CBnez");
}
TEST_F(AssemblerRISCV64Test, CEbreak) {
__ CEbreak();
DriverStr("c.ebreak", "CEbreak");
}
TEST_F(AssemblerRISCV64Test, CNop) {
__ CNop();
DriverStr("c.nop", "CNop");
}
TEST_F(AssemblerRISCV64Test, CUnimp) {
__ 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");
}
TEST_F(AssemblerRISCV64Test, Sh1Add) {
DriverStr(RepeatRRR(&Riscv64Assembler::Sh1Add, "sh1add {reg1}, {reg2}, {reg3}"), "Sh1Add");
}
TEST_F(AssemblerRISCV64Test, Sh1AddUw) {
DriverStr(RepeatRRR(&Riscv64Assembler::Sh1AddUw, "sh1add.uw {reg1}, {reg2}, {reg3}"), "Sh1AddUw");
}
TEST_F(AssemblerRISCV64Test, Sh2Add) {
DriverStr(RepeatRRR(&Riscv64Assembler::Sh2Add, "sh2add {reg1}, {reg2}, {reg3}"), "Sh2Add");
}
TEST_F(AssemblerRISCV64Test, Sh2AddUw) {
DriverStr(RepeatRRR(&Riscv64Assembler::Sh2AddUw, "sh2add.uw {reg1}, {reg2}, {reg3}"), "Sh2AddUw");
}
TEST_F(AssemblerRISCV64Test, Sh3Add) {
DriverStr(RepeatRRR(&Riscv64Assembler::Sh3Add, "sh3add {reg1}, {reg2}, {reg3}"), "Sh3Add");
}
TEST_F(AssemblerRISCV64Test, Sh3AddUw) {
DriverStr(RepeatRRR(&Riscv64Assembler::Sh3AddUw, "sh3add.uw {reg1}, {reg2}, {reg3}"), "Sh3AddUw");
}
TEST_F(AssemblerRISCV64Test, SlliUw) {
DriverStr(RepeatRRIb(&Riscv64Assembler::SlliUw, 6, "slli.uw {reg1}, {reg2}, {imm}"), "SlliUw");
}
TEST_F(AssemblerRISCV64Test, Andn) {
DriverStr(RepeatRRR(&Riscv64Assembler::Andn, "andn {reg1}, {reg2}, {reg3}"), "Andn");
}
TEST_F(AssemblerRISCV64Test, Orn) {
DriverStr(RepeatRRR(&Riscv64Assembler::Orn, "orn {reg1}, {reg2}, {reg3}"), "Orn");
}
TEST_F(AssemblerRISCV64Test, Xnor) {
DriverStr(RepeatRRR(&Riscv64Assembler::Xnor, "xnor {reg1}, {reg2}, {reg3}"), "Xnor");
}
TEST_F(AssemblerRISCV64Test, Clz) {
DriverStr(RepeatRR(&Riscv64Assembler::Clz, "clz {reg1}, {reg2}"), "Clz");
}
TEST_F(AssemblerRISCV64Test, Clzw) {
DriverStr(RepeatRR(&Riscv64Assembler::Clzw, "clzw {reg1}, {reg2}"), "Clzw");
}
TEST_F(AssemblerRISCV64Test, Ctz) {
DriverStr(RepeatRR(&Riscv64Assembler::Ctz, "ctz {reg1}, {reg2}"), "Ctz");
}
TEST_F(AssemblerRISCV64Test, Ctzw) {
DriverStr(RepeatRR(&Riscv64Assembler::Ctzw, "ctzw {reg1}, {reg2}"), "Ctzw");
}
TEST_F(AssemblerRISCV64Test, Cpop) {
DriverStr(RepeatRR(&Riscv64Assembler::Cpop, "cpop {reg1}, {reg2}"), "Cpop");
}
TEST_F(AssemblerRISCV64Test, Cpopw) {
DriverStr(RepeatRR(&Riscv64Assembler::Cpopw, "cpopw {reg1}, {reg2}"), "Cpopw");
}
TEST_F(AssemblerRISCV64Test, Min) {
DriverStr(RepeatRRR(&Riscv64Assembler::Min, "min {reg1}, {reg2}, {reg3}"), "Min");
}
TEST_F(AssemblerRISCV64Test, Minu) {
DriverStr(RepeatRRR(&Riscv64Assembler::Minu, "minu {reg1}, {reg2}, {reg3}"), "Minu");
}
TEST_F(AssemblerRISCV64Test, Max) {
DriverStr(RepeatRRR(&Riscv64Assembler::Max, "max {reg1}, {reg2}, {reg3}"), "Max");
}
TEST_F(AssemblerRISCV64Test, Maxu) {
DriverStr(RepeatRRR(&Riscv64Assembler::Maxu, "maxu {reg1}, {reg2}, {reg3}"), "Maxu");
}
TEST_F(AssemblerRISCV64Test, Rol) {
DriverStr(RepeatRRR(&Riscv64Assembler::Rol, "rol {reg1}, {reg2}, {reg3}"), "Rol");
}
TEST_F(AssemblerRISCV64Test, Rolw) {
DriverStr(RepeatRRR(&Riscv64Assembler::Rolw, "rolw {reg1}, {reg2}, {reg3}"), "Rolw");
}
TEST_F(AssemblerRISCV64Test, Ror) {
DriverStr(RepeatRRR(&Riscv64Assembler::Ror, "ror {reg1}, {reg2}, {reg3}"), "Ror");
}
TEST_F(AssemblerRISCV64Test, Rorw) {
DriverStr(RepeatRRR(&Riscv64Assembler::Rorw, "rorw {reg1}, {reg2}, {reg3}"), "Rorw");
}
TEST_F(AssemblerRISCV64Test, Rori) {
DriverStr(RepeatRRIb(&Riscv64Assembler::Rori, 6, "rori {reg1}, {reg2}, {imm}"), "Rori");
}
TEST_F(AssemblerRISCV64Test, Roriw) {
DriverStr(RepeatRRIb(&Riscv64Assembler::Roriw, /*imm_bits=*/ 5, "roriw {reg1}, {reg2}, {imm}"),
"Roriw");
}
TEST_F(AssemblerRISCV64Test, OrcB) {
DriverStr(RepeatRR(&Riscv64Assembler::OrcB, "orc.b {reg1}, {reg2}"), "OrcB");
}
TEST_F(AssemblerRISCV64Test, Rev8) {
DriverStr(RepeatRR(&Riscv64Assembler::Rev8, "rev8 {reg1}, {reg2}"), "Rev8");
}
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");
}
// Vector Instructions
TEST_F(AssemblerRISCV64Test, VSetvl) {
DriverStr(RepeatRRR(&Riscv64Assembler::VSetvl, "vsetvl {reg1}, {reg2}, {reg3}"), "VSetvl");
}
TEST_F(AssemblerRISCV64Test, VSetivli) {
auto replacer = [=](uint32_t uimm, std::string* s) {
ReplaceImm(uimm, /*bias=*/ 0, /*multiplier=*/ 1, s);
};
std::vector<int64_t> imms = CreateImmediateValuesBits(5, true);
DriverStr(TestVSetI(&Riscv64Assembler::VSetivli,
imms,
replacer,
"vsetivli {reg1}, {imm}, {sew}, {lmul}, {vta}, {vma}"),
"VSetivli");
}
TEST_F(AssemblerRISCV64Test, VSetvli) {
auto replacer = [=](XRegister reg, std::string* s) {
ReplaceReg(REG2_TOKEN, GetRegisterName(reg), s);
};
DriverStr(TestVSetI(&Riscv64Assembler::VSetvli,
GetRegisters(),
replacer,
"vsetvli {reg1}, {reg2}, {sew}, {lmul}, {vta}, {vma}"),
"VSetvli");
}
TEST_F(AssemblerRISCV64Test, VLe8) {
DriverStr(RepeatVRVmFiltered(
&Riscv64Assembler::VLe8, "vle8.v {reg1}, ({reg2}){vm}", SkipV0Vm<XRegister>()),
"VLe8");
}
TEST_F(AssemblerRISCV64Test, VLe16) {
DriverStr(RepeatVRVmFiltered(
&Riscv64Assembler::VLe16, "vle16.v {reg1}, ({reg2}){vm}", SkipV0Vm<XRegister>()),
"VLe16");
}
TEST_F(AssemblerRISCV64Test, VLe32) {
DriverStr(RepeatVRVmFiltered(
&Riscv64Assembler::VLe32, "vle32.v {reg1}, ({reg2}){vm}", SkipV0Vm<XRegister>()),
"VLe32");
}
TEST_F(AssemblerRISCV64Test, VLe64) {
DriverStr(RepeatVRVmFiltered(
&Riscv64Assembler::VLe64, "vle64.v {reg1}, ({reg2}){vm}", SkipV0Vm<XRegister>()),
"VLe64");
}
TEST_F(AssemblerRISCV64Test, VLm) {
DriverStr(RepeatVR(&Riscv64Assembler::VLm, "vlm.v {reg1}, ({reg2})"), "VLm");
}
TEST_F(AssemblerRISCV64Test, VSe8) {
DriverStr(RepeatVRVm(&Riscv64Assembler::VSe8, "vse8.v {reg1}, ({reg2}){vm}"), "VSe8");
}
TEST_F(AssemblerRISCV64Test, VSe16) {
DriverStr(RepeatVRVm(&Riscv64Assembler::VSe16, "vse16.v {reg1}, ({reg2}){vm}"), "VSe16");
}
TEST_F(AssemblerRISCV64Test, VSe32) {
DriverStr(RepeatVRVm(&Riscv64Assembler::VSe32, "vse32.v {reg1}, ({reg2}){vm}"), "VSe32");
}
TEST_F(AssemblerRISCV64Test, VSe64) {
DriverStr(RepeatVRVm(&Riscv64Assembler::VSe64, "vse64.v {reg1}, ({reg2}){vm}"), "VSe64");
}
TEST_F(AssemblerRISCV64Test, VSm) {
DriverStr(RepeatVR(&Riscv64Assembler::VSm, "vsm.v {reg1}, ({reg2})"), "VSm");
}
TEST_F(AssemblerRISCV64Test, VLe8ff) {
DriverStr(RepeatVR(&Riscv64Assembler::VLe8ff, "vle8ff.v {reg1}, ({reg2})"), "VLe8ff");
}
TEST_F(AssemblerRISCV64Test, VLe16ff) {
DriverStr(RepeatVR(&Riscv64Assembler::VLe16ff, "vle16ff.v {reg1}, ({reg2})"), "VLe16ff");
}
TEST_F(AssemblerRISCV64Test, VLe32ff) {
DriverStr(RepeatVR(&Riscv64Assembler::VLe32ff, "vle32ff.v {reg1}, ({reg2})"), "VLe32ff");
}
TEST_F(AssemblerRISCV64Test, VLe64ff) {
DriverStr(RepeatVR(&Riscv64Assembler::VLe64ff, "vle64ff.v {reg1}, ({reg2})"), "VLe64ff");
}
TEST_F(AssemblerRISCV64Test, VLse8) {
DriverStr(RepeatVRRVmFiltered(&Riscv64Assembler::VLse8,
"vlse8.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, XRegister>()),
"VLse8");
}
TEST_F(AssemblerRISCV64Test, VLse16) {
DriverStr(RepeatVRRVmFiltered(&Riscv64Assembler::VLse16,
"vlse16.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, XRegister>()),
"VLse16");
}
TEST_F(AssemblerRISCV64Test, VLse32) {
DriverStr(RepeatVRRVmFiltered(&Riscv64Assembler::VLse32,
"vlse32.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, XRegister>()),
"VLse32");
}
TEST_F(AssemblerRISCV64Test, VLse64) {
DriverStr(RepeatVRRVmFiltered(&Riscv64Assembler::VLse64,
"vlse64.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, XRegister>()),
"VLse64");
}
TEST_F(AssemblerRISCV64Test, VSse8) {
DriverStr(RepeatVRRVm(&Riscv64Assembler::VSse8, "vsse8.v {reg1}, ({reg2}), {reg3}{vm}"), "VSse8");
}
TEST_F(AssemblerRISCV64Test, VSse16) {
DriverStr(RepeatVRRVm(&Riscv64Assembler::VSse16, "vsse16.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSse16");
}
TEST_F(AssemblerRISCV64Test, VSse32) {
DriverStr(RepeatVRRVm(&Riscv64Assembler::VSse32, "vsse32.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSse32");
}
TEST_F(AssemblerRISCV64Test, VSse64) {
DriverStr(RepeatVRRVm(&Riscv64Assembler::VSse64, "vsse64.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSse64");
}
TEST_F(AssemblerRISCV64Test, VLoxei8) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLoxei8,
"vloxei8.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLoxei8");
}
TEST_F(AssemblerRISCV64Test, VLoxei16) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLoxei16,
"vloxei16.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLoxei16");
}
TEST_F(AssemblerRISCV64Test, VLoxei32) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLoxei32,
"vloxei32.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLoxei32");
}
TEST_F(AssemblerRISCV64Test, VLoxei64) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLoxei64,
"vloxei64.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLoxei64");
}
TEST_F(AssemblerRISCV64Test, VLuxei8) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLuxei8,
"vluxei8.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLuxei8");
}
TEST_F(AssemblerRISCV64Test, VLuxei16) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLuxei16,
"vluxei16.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLuxei16");
}
TEST_F(AssemblerRISCV64Test, VLuxei32) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLuxei32,
"vluxei32.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLuxei32");
}
TEST_F(AssemblerRISCV64Test, VLuxei64) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLuxei64,
"vluxei64.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLuxei64");
}
TEST_F(AssemblerRISCV64Test, VSoxei8) {
DriverStr(RepeatVRVVm(&Riscv64Assembler::VSoxei8, "vsoxei8.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSoxei8");
}
TEST_F(AssemblerRISCV64Test, VSoxei16) {
DriverStr(RepeatVRVVm(&Riscv64Assembler::VSoxei16, "vsoxei16.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSoxei16");
}
TEST_F(AssemblerRISCV64Test, VSoxei32) {
DriverStr(RepeatVRVVm(&Riscv64Assembler::VSoxei32, "vsoxei32.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSoxei32");
}
TEST_F(AssemblerRISCV64Test, VSoxei64) {
DriverStr(RepeatVRVVm(&Riscv64Assembler::VSoxei64, "vsoxei64.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSoxei64");
}
TEST_F(AssemblerRISCV64Test, VSuxei8) {
DriverStr(RepeatVRVVm(&Riscv64Assembler::VSuxei8, "vsuxei8.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSuxei8");
}
TEST_F(AssemblerRISCV64Test, VSuxei16) {
DriverStr(RepeatVRVVm(&Riscv64Assembler::VSuxei16, "vsuxei16.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSuxei16");
}
TEST_F(AssemblerRISCV64Test, VSuxei32) {
DriverStr(RepeatVRVVm(&Riscv64Assembler::VSuxei32, "vsuxei32.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSuxei32");
}
TEST_F(AssemblerRISCV64Test, VSuxei64) {
DriverStr(RepeatVRVVm(&Riscv64Assembler::VSuxei64, "vsuxei64.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSuxei64");
}
TEST_F(AssemblerRISCV64Test, VLseg2e8) {
DriverStr(
RepeatVRVmFiltered(
&Riscv64Assembler::VLseg2e8, "vlseg2e8.v {reg1}, ({reg2}){vm}", SkipV0Vm<XRegister>()),
"VLseg2e8");
}
TEST_F(AssemblerRISCV64Test, VLseg2e16) {
DriverStr(
RepeatVRVmFiltered(
&Riscv64Assembler::VLseg2e16, "vlseg2e16.v {reg1}, ({reg2}){vm}", SkipV0Vm<XRegister>()),
"VLseg2e16");
}
TEST_F(AssemblerRISCV64Test, VLseg2e32) {
DriverStr(
RepeatVRVmFiltered(
&Riscv64Assembler::VLseg2e32, "vlseg2e32.v {reg1}, ({reg2}){vm}", SkipV0Vm<XRegister>()),
"VLseg2e32");
}
TEST_F(AssemblerRISCV64Test, VLseg2e64) {
DriverStr(
RepeatVRVmFiltered(
&Riscv64Assembler::VLseg2e64, "vlseg2e64.v {reg1}, ({reg2}){vm}", SkipV0Vm<XRegister>()),
"VLseg2e64");
}
TEST_F(AssemblerRISCV64Test, VLseg3e8) {
DriverStr(
RepeatVRVmFiltered(
&Riscv64Assembler::VLseg3e8, "vlseg3e8.v {reg1}, ({reg2}){vm}", SkipV0Vm<XRegister>()),
"VLseg3e8");
}
TEST_F(AssemblerRISCV64Test, VLseg3e16) {
DriverStr(
RepeatVRVmFiltered(
&Riscv64Assembler::VLseg3e16, "vlseg3e16.v {reg1}, ({reg2}){vm}", SkipV0Vm<XRegister>()),
"VLseg3e16");
}
TEST_F(AssemblerRISCV64Test, VLseg3e32) {
DriverStr(
RepeatVRVmFiltered(
&Riscv64Assembler::VLseg3e32, "vlseg3e32.v {reg1}, ({reg2}){vm}", SkipV0Vm<XRegister>()),
"VLseg3e32");
}
TEST_F(AssemblerRISCV64Test, VLseg3e64) {
DriverStr(
RepeatVRVmFiltered(
&Riscv64Assembler::VLseg3e64, "vlseg3e64.v {reg1}, ({reg2}){vm}", SkipV0Vm<XRegister>()),
"VLseg3e64");
}
TEST_F(AssemblerRISCV64Test, VLseg4e8) {
DriverStr(
RepeatVRVmFiltered(
&Riscv64Assembler::VLseg4e8, "vlseg4e8.v {reg1}, ({reg2}){vm}", SkipV0Vm<XRegister>()),
"VLseg4e8");
}
TEST_F(AssemblerRISCV64Test, VLseg4e16) {
DriverStr(
RepeatVRVmFiltered(
&Riscv64Assembler::VLseg4e16, "vlseg4e16.v {reg1}, ({reg2}){vm}", SkipV0Vm<XRegister>()),
"VLseg4e16");
}
TEST_F(AssemblerRISCV64Test, VLseg4e32) {
DriverStr(
RepeatVRVmFiltered(
&Riscv64Assembler::VLseg4e32, "vlseg4e32.v {reg1}, ({reg2}){vm}", SkipV0Vm<XRegister>()),
"VLseg4e32");
}
TEST_F(AssemblerRISCV64Test, VLseg4e64) {
DriverStr(
RepeatVRVmFiltered(
&Riscv64Assembler::VLseg4e64, "vlseg4e64.v {reg1}, ({reg2}){vm}", SkipV0Vm<XRegister>()),
"VLseg4e64");
}
TEST_F(AssemblerRISCV64Test, VLseg5e8) {
DriverStr(
RepeatVRVmFiltered(
&Riscv64Assembler::VLseg5e8, "vlseg5e8.v {reg1}, ({reg2}){vm}", SkipV0Vm<XRegister>()),
"VLseg5e8");
}
TEST_F(AssemblerRISCV64Test, VLseg5e16) {
DriverStr(
RepeatVRVmFiltered(
&Riscv64Assembler::VLseg5e16, "vlseg5e16.v {reg1}, ({reg2}){vm}", SkipV0Vm<XRegister>()),
"VLseg5e16");
}
TEST_F(AssemblerRISCV64Test, VLseg5e32) {
DriverStr(
RepeatVRVmFiltered(
&Riscv64Assembler::VLseg5e32, "vlseg5e32.v {reg1}, ({reg2}){vm}", SkipV0Vm<XRegister>()),
"VLseg5e32");
}
TEST_F(AssemblerRISCV64Test, VLseg5e64) {
DriverStr(
RepeatVRVmFiltered(
&Riscv64Assembler::VLseg5e64, "vlseg5e64.v {reg1}, ({reg2}){vm}", SkipV0Vm<XRegister>()),
"VLseg5e64");
}
TEST_F(AssemblerRISCV64Test, VLseg6e8) {
DriverStr(
RepeatVRVmFiltered(
&Riscv64Assembler::VLseg6e8, "vlseg6e8.v {reg1}, ({reg2}){vm}", SkipV0Vm<XRegister>()),
"VLseg6e8");
}
TEST_F(AssemblerRISCV64Test, VLseg6e16) {
DriverStr(
RepeatVRVmFiltered(
&Riscv64Assembler::VLseg6e16, "vlseg6e16.v {reg1}, ({reg2}){vm}", SkipV0Vm<XRegister>()),
"VLseg6e16");
}
TEST_F(AssemblerRISCV64Test, VLseg6e32) {
DriverStr(
RepeatVRVmFiltered(
&Riscv64Assembler::VLseg6e32, "vlseg6e32.v {reg1}, ({reg2}){vm}", SkipV0Vm<XRegister>()),
"VLseg6e32");
}
TEST_F(AssemblerRISCV64Test, VLseg6e64) {
DriverStr(
RepeatVRVmFiltered(
&Riscv64Assembler::VLseg6e64, "vlseg6e64.v {reg1}, ({reg2}){vm}", SkipV0Vm<XRegister>()),
"VLseg6e64");
}
TEST_F(AssemblerRISCV64Test, VLseg7e8) {
DriverStr(
RepeatVRVmFiltered(
&Riscv64Assembler::VLseg7e8, "vlseg7e8.v {reg1}, ({reg2}){vm}", SkipV0Vm<XRegister>()),
"VLseg7e8");
}
TEST_F(AssemblerRISCV64Test, VLseg7e16) {
DriverStr(
RepeatVRVmFiltered(
&Riscv64Assembler::VLseg7e16, "vlseg7e16.v {reg1}, ({reg2}){vm}", SkipV0Vm<XRegister>()),
"VLseg7e16");
}
TEST_F(AssemblerRISCV64Test, VLseg7e32) {
DriverStr(
RepeatVRVmFiltered(
&Riscv64Assembler::VLseg7e32, "vlseg7e32.v {reg1}, ({reg2}){vm}", SkipV0Vm<XRegister>()),
"VLseg7e32");
}
TEST_F(AssemblerRISCV64Test, VLseg7e64) {
DriverStr(
RepeatVRVmFiltered(
&Riscv64Assembler::VLseg7e64, "vlseg7e64.v {reg1}, ({reg2}){vm}", SkipV0Vm<XRegister>()),
"VLseg7e64");
}
TEST_F(AssemblerRISCV64Test, VLseg8e8) {
DriverStr(
RepeatVRVmFiltered(
&Riscv64Assembler::VLseg8e8, "vlseg8e8.v {reg1}, ({reg2}){vm}", SkipV0Vm<XRegister>()),
"VLseg8e8");
}
TEST_F(AssemblerRISCV64Test, VLseg8e16) {
DriverStr(
RepeatVRVmFiltered(
&Riscv64Assembler::VLseg8e16, "vlseg8e16.v {reg1}, ({reg2}){vm}", SkipV0Vm<XRegister>()),
"VLseg8e16");
}
TEST_F(AssemblerRISCV64Test, VLseg8e32) {
DriverStr(
RepeatVRVmFiltered(
&Riscv64Assembler::VLseg8e32, "vlseg8e32.v {reg1}, ({reg2}){vm}", SkipV0Vm<XRegister>()),
"VLseg8e32");
}
TEST_F(AssemblerRISCV64Test, VLseg8e64) {
DriverStr(
RepeatVRVmFiltered(
&Riscv64Assembler::VLseg8e64, "vlseg8e64.v {reg1}, ({reg2}){vm}", SkipV0Vm<XRegister>()),
"VLseg8e64");
}
TEST_F(AssemblerRISCV64Test, VSseg2e8) {
DriverStr(RepeatVRVm(&Riscv64Assembler::VSseg2e8, "vsseg2e8.v {reg1}, ({reg2}){vm}"), "VSseg2e8");
}
TEST_F(AssemblerRISCV64Test, VSseg2e16) {
DriverStr(RepeatVRVm(&Riscv64Assembler::VSseg2e16, "vsseg2e16.v {reg1}, ({reg2}){vm}"),
"VSseg2e16");
}
TEST_F(AssemblerRISCV64Test, VSseg2e32) {
DriverStr(RepeatVRVm(&Riscv64Assembler::VSseg2e32, "vsseg2e32.v {reg1}, ({reg2}){vm}"),
"VSseg2e32");
}
TEST_F(AssemblerRISCV64Test, VSseg2e64) {
DriverStr(RepeatVRVm(&Riscv64Assembler::VSseg2e64, "vsseg2e64.v {reg1}, ({reg2}){vm}"),
"VSseg2e64");
}
TEST_F(AssemblerRISCV64Test, VSseg3e8) {
DriverStr(RepeatVRVm(&Riscv64Assembler::VSseg3e8, "vsseg3e8.v {reg1}, ({reg2}){vm}"), "VSseg3e8");
}
TEST_F(AssemblerRISCV64Test, VSseg3e16) {
DriverStr(RepeatVRVm(&Riscv64Assembler::VSseg3e16, "vsseg3e16.v {reg1}, ({reg2}){vm}"),
"VSseg3e16");
}
TEST_F(AssemblerRISCV64Test, VSseg3e32) {
DriverStr(RepeatVRVm(&Riscv64Assembler::VSseg3e32, "vsseg3e32.v {reg1}, ({reg2}){vm}"),
"VSseg3e32");
}
TEST_F(AssemblerRISCV64Test, VSseg3e64) {
DriverStr(RepeatVRVm(&Riscv64Assembler::VSseg3e64, "vsseg3e64.v {reg1}, ({reg2}){vm}"),
"VSseg3e64");
}
TEST_F(AssemblerRISCV64Test, VSseg4e8) {
DriverStr(RepeatVRVm(&Riscv64Assembler::VSseg4e8, "vsseg4e8.v {reg1}, ({reg2}){vm}"), "VSseg4e8");
}
TEST_F(AssemblerRISCV64Test, VSseg4e16) {
DriverStr(RepeatVRVm(&Riscv64Assembler::VSseg4e16, "vsseg4e16.v {reg1}, ({reg2}){vm}"),
"VSseg4e16");
}
TEST_F(AssemblerRISCV64Test, VSseg4e32) {
DriverStr(RepeatVRVm(&Riscv64Assembler::VSseg4e32, "vsseg4e32.v {reg1}, ({reg2}){vm}"),
"VSseg4e32");
}
TEST_F(AssemblerRISCV64Test, VSseg4e64) {
DriverStr(RepeatVRVm(&Riscv64Assembler::VSseg4e64, "vsseg4e64.v {reg1}, ({reg2}){vm}"),
"VSseg4e64");
}
TEST_F(AssemblerRISCV64Test, VSseg5e8) {
DriverStr(RepeatVRVm(&Riscv64Assembler::VSseg5e8, "vsseg5e8.v {reg1}, ({reg2}){vm}"), "VSseg5e8");
}
TEST_F(AssemblerRISCV64Test, VSseg5e16) {
DriverStr(RepeatVRVm(&Riscv64Assembler::VSseg5e16, "vsseg5e16.v {reg1}, ({reg2}){vm}"),
"VSseg5e16");
}
TEST_F(AssemblerRISCV64Test, VSseg5e32) {
DriverStr(RepeatVRVm(&Riscv64Assembler::VSseg5e32, "vsseg5e32.v {reg1}, ({reg2}){vm}"),
"VSseg5e32");
}
TEST_F(AssemblerRISCV64Test, VSseg5e64) {
DriverStr(RepeatVRVm(&Riscv64Assembler::VSseg5e64, "vsseg5e64.v {reg1}, ({reg2}){vm}"),
"VSseg5e64");
}
TEST_F(AssemblerRISCV64Test, VSseg6e8) {
DriverStr(RepeatVRVm(&Riscv64Assembler::VSseg6e8, "vsseg6e8.v {reg1}, ({reg2}){vm}"), "VSseg6e8");
}
TEST_F(AssemblerRISCV64Test, VSseg6e16) {
DriverStr(RepeatVRVm(&Riscv64Assembler::VSseg6e16, "vsseg6e16.v {reg1}, ({reg2}){vm}"),
"VSseg6e16");
}
TEST_F(AssemblerRISCV64Test, VSseg6e32) {
DriverStr(RepeatVRVm(&Riscv64Assembler::VSseg6e32, "vsseg6e32.v {reg1}, ({reg2}){vm}"),
"VSseg6e32");
}
TEST_F(AssemblerRISCV64Test, VSseg6e64) {
DriverStr(RepeatVRVm(&Riscv64Assembler::VSseg6e64, "vsseg6e64.v {reg1}, ({reg2}){vm}"),
"VSseg6e64");
}
TEST_F(AssemblerRISCV64Test, VSseg7e8) {
DriverStr(RepeatVRVm(&Riscv64Assembler::VSseg7e8, "vsseg7e8.v {reg1}, ({reg2}){vm}"), "VSseg7e8");
}
TEST_F(AssemblerRISCV64Test, VSseg7e16) {
DriverStr(RepeatVRVm(&Riscv64Assembler::VSseg7e16, "vsseg7e16.v {reg1}, ({reg2}){vm}"),
"VSseg7e16");
}
TEST_F(AssemblerRISCV64Test, VSseg7e32) {
DriverStr(RepeatVRVm(&Riscv64Assembler::VSseg7e32, "vsseg7e32.v {reg1}, ({reg2}){vm}"),
"VSseg7e32");
}
TEST_F(AssemblerRISCV64Test, VSseg7e64) {
DriverStr(RepeatVRVm(&Riscv64Assembler::VSseg7e64, "vsseg7e64.v {reg1}, ({reg2}){vm}"),
"VSseg7e64");
}
TEST_F(AssemblerRISCV64Test, VSseg8e8) {
DriverStr(RepeatVRVm(&Riscv64Assembler::VSseg8e8, "vsseg8e8.v {reg1}, ({reg2}){vm}"), "VSseg8e8");
}
TEST_F(AssemblerRISCV64Test, VSseg8e16) {
DriverStr(RepeatVRVm(&Riscv64Assembler::VSseg8e16, "vsseg8e16.v {reg1}, ({reg2}){vm}"),
"VSseg8e16");
}
TEST_F(AssemblerRISCV64Test, VSseg8e32) {
DriverStr(RepeatVRVm(&Riscv64Assembler::VSseg8e32, "vsseg8e32.v {reg1}, ({reg2}){vm}"),
"VSseg8e32");
}
TEST_F(AssemblerRISCV64Test, VSseg8e64) {
DriverStr(RepeatVRVm(&Riscv64Assembler::VSseg8e64, "vsseg8e64.v {reg1}, ({reg2}){vm}"),
"VSseg8e64");
}
TEST_F(AssemblerRISCV64Test, VLseg2e8ff) {
DriverStr(RepeatVRVmFiltered(&Riscv64Assembler::VLseg2e8ff,
"vlseg2e8ff.v {reg1}, ({reg2}){vm}",
SkipV0Vm<XRegister>()),
"VLseg2e8ff");
}
TEST_F(AssemblerRISCV64Test, VLseg2e16ff) {
DriverStr(RepeatVRVmFiltered(&Riscv64Assembler::VLseg2e16ff,
"vlseg2e16ff.v {reg1}, ({reg2}){vm}",
SkipV0Vm<XRegister>()),
"VLseg2e16ff");
}
TEST_F(AssemblerRISCV64Test, VLseg2e32ff) {
DriverStr(RepeatVRVmFiltered(&Riscv64Assembler::VLseg2e32ff,
"vlseg2e32ff.v {reg1}, ({reg2}){vm}",
SkipV0Vm<XRegister>()),
"VLseg2e32ff");
}
TEST_F(AssemblerRISCV64Test, VLseg2e64ff) {
DriverStr(RepeatVRVmFiltered(&Riscv64Assembler::VLseg2e64ff,
"vlseg2e64ff.v {reg1}, ({reg2}){vm}",
SkipV0Vm<XRegister>()),
"VLseg2e64ff");
}
TEST_F(AssemblerRISCV64Test, VLseg3e8ff) {
DriverStr(RepeatVRVmFiltered(&Riscv64Assembler::VLseg3e8ff,
"vlseg3e8ff.v {reg1}, ({reg2}){vm}",
SkipV0Vm<XRegister>()),
"VLseg3e8ff");
}
TEST_F(AssemblerRISCV64Test, VLseg3e16ff) {
DriverStr(RepeatVRVmFiltered(&Riscv64Assembler::VLseg3e16ff,
"vlseg3e16ff.v {reg1}, ({reg2}){vm}",
SkipV0Vm<XRegister>()),
"VLseg3e16ff");
}
TEST_F(AssemblerRISCV64Test, VLseg3e32ff) {
DriverStr(RepeatVRVmFiltered(&Riscv64Assembler::VLseg3e32ff,
"vlseg3e32ff.v {reg1}, ({reg2}){vm}",
SkipV0Vm<XRegister>()),
"VLseg3e32ff");
}
TEST_F(AssemblerRISCV64Test, VLseg3e64ff) {
DriverStr(RepeatVRVmFiltered(&Riscv64Assembler::VLseg3e64ff,
"vlseg3e64ff.v {reg1}, ({reg2}){vm}",
SkipV0Vm<XRegister>()),
"VLseg3e64ff");
}
TEST_F(AssemblerRISCV64Test, VLseg4e8ff) {
DriverStr(RepeatVRVmFiltered(&Riscv64Assembler::VLseg4e8ff,
"vlseg4e8ff.v {reg1}, ({reg2}){vm}",
SkipV0Vm<XRegister>()),
"VLseg4e8ff");
}
TEST_F(AssemblerRISCV64Test, VLseg4e16ff) {
DriverStr(RepeatVRVmFiltered(&Riscv64Assembler::VLseg4e16ff,
"vlseg4e16ff.v {reg1}, ({reg2}){vm}",
SkipV0Vm<XRegister>()),
"VLseg4e16ff");
}
TEST_F(AssemblerRISCV64Test, VLseg4e32ff) {
DriverStr(RepeatVRVmFiltered(&Riscv64Assembler::VLseg4e32ff,
"vlseg4e32ff.v {reg1}, ({reg2}){vm}",
SkipV0Vm<XRegister>()),
"VLseg4e32ff");
}
TEST_F(AssemblerRISCV64Test, VLseg4e64ff) {
DriverStr(RepeatVRVmFiltered(&Riscv64Assembler::VLseg4e64ff,
"vlseg4e64ff.v {reg1}, ({reg2}){vm}",
SkipV0Vm<XRegister>()),
"VLseg4e64ff");
}
TEST_F(AssemblerRISCV64Test, VLseg5e8ff) {
DriverStr(RepeatVRVmFiltered(&Riscv64Assembler::VLseg5e8ff,
"vlseg5e8ff.v {reg1}, ({reg2}){vm}",
SkipV0Vm<XRegister>()),
"VLseg5e8ff");
}
TEST_F(AssemblerRISCV64Test, VLseg5e16ff) {
DriverStr(RepeatVRVmFiltered(&Riscv64Assembler::VLseg5e16ff,
"vlseg5e16ff.v {reg1}, ({reg2}){vm}",
SkipV0Vm<XRegister>()),
"VLseg5e16ff");
}
TEST_F(AssemblerRISCV64Test, VLseg5e32ff) {
DriverStr(RepeatVRVmFiltered(&Riscv64Assembler::VLseg5e32ff,
"vlseg5e32ff.v {reg1}, ({reg2}){vm}",
SkipV0Vm<XRegister>()),
"VLseg5e32ff");
}
TEST_F(AssemblerRISCV64Test, VLseg5e64ff) {
DriverStr(RepeatVRVmFiltered(&Riscv64Assembler::VLseg5e64ff,
"vlseg5e64ff.v {reg1}, ({reg2}){vm}",
SkipV0Vm<XRegister>()),
"VLseg5e64ff");
}
TEST_F(AssemblerRISCV64Test, VLseg6e8ff) {
DriverStr(RepeatVRVmFiltered(&Riscv64Assembler::VLseg6e8ff,
"vlseg6e8ff.v {reg1}, ({reg2}){vm}",
SkipV0Vm<XRegister>()),
"VLseg6e8ff");
}
TEST_F(AssemblerRISCV64Test, VLseg6e16ff) {
DriverStr(RepeatVRVmFiltered(&Riscv64Assembler::VLseg6e16ff,
"vlseg6e16ff.v {reg1}, ({reg2}){vm}",
SkipV0Vm<XRegister>()),
"VLseg6e16ff");
}
TEST_F(AssemblerRISCV64Test, VLseg6e32ff) {
DriverStr(RepeatVRVmFiltered(&Riscv64Assembler::VLseg6e32ff,
"vlseg6e32ff.v {reg1}, ({reg2}){vm}",
SkipV0Vm<XRegister>()),
"VLseg6e32ff");
}
TEST_F(AssemblerRISCV64Test, VLseg6e64ff) {
DriverStr(RepeatVRVmFiltered(&Riscv64Assembler::VLseg6e64ff,
"vlseg6e64ff.v {reg1}, ({reg2}){vm}",
SkipV0Vm<XRegister>()),
"VLseg6e64ff");
}
TEST_F(AssemblerRISCV64Test, VLseg7e8ff) {
DriverStr(RepeatVRVmFiltered(&Riscv64Assembler::VLseg7e8ff,
"vlseg7e8ff.v {reg1}, ({reg2}){vm}",
SkipV0Vm<XRegister>()),
"VLseg7e8ff");
}
TEST_F(AssemblerRISCV64Test, VLseg7e16ff) {
DriverStr(RepeatVRVmFiltered(&Riscv64Assembler::VLseg7e16ff,
"vlseg7e16ff.v {reg1}, ({reg2}){vm}",
SkipV0Vm<XRegister>()),
"VLseg7e16ff");
}
TEST_F(AssemblerRISCV64Test, VLseg7e32ff) {
DriverStr(RepeatVRVmFiltered(&Riscv64Assembler::VLseg7e32ff,
"vlseg7e32ff.v {reg1}, ({reg2}){vm}",
SkipV0Vm<XRegister>()),
"VLseg7e32ff");
}
TEST_F(AssemblerRISCV64Test, VLseg7e64ff) {
DriverStr(RepeatVRVmFiltered(&Riscv64Assembler::VLseg7e64ff,
"vlseg7e64ff.v {reg1}, ({reg2}){vm}",
SkipV0Vm<XRegister>()),
"VLseg7e64ff");
}
TEST_F(AssemblerRISCV64Test, VLseg8e8ff) {
DriverStr(RepeatVRVmFiltered(&Riscv64Assembler::VLseg8e8ff,
"vlseg8e8ff.v {reg1}, ({reg2}){vm}",
SkipV0Vm<XRegister>()),
"VLseg8e8ff");
}
TEST_F(AssemblerRISCV64Test, VLseg8e16ff) {
DriverStr(RepeatVRVmFiltered(&Riscv64Assembler::VLseg8e16ff,
"vlseg8e16ff.v {reg1}, ({reg2}){vm}",
SkipV0Vm<XRegister>()),
"VLseg8e16ff");
}
TEST_F(AssemblerRISCV64Test, VLseg8e32ff) {
DriverStr(RepeatVRVmFiltered(&Riscv64Assembler::VLseg8e32ff,
"vlseg8e32ff.v {reg1}, ({reg2}){vm}",
SkipV0Vm<XRegister>()),
"VLseg8e32ff");
}
TEST_F(AssemblerRISCV64Test, VLseg8e64ff) {
DriverStr(RepeatVRVmFiltered(&Riscv64Assembler::VLseg8e64ff,
"vlseg8e64ff.v {reg1}, ({reg2}){vm}",
SkipV0Vm<XRegister>()),
"VLseg8e64ff");
}
TEST_F(AssemblerRISCV64Test, VLsseg2e8) {
DriverStr(RepeatVRRVmFiltered(&Riscv64Assembler::VLsseg2e8,
"vlsseg2e8.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, XRegister>()),
"VLsseg2e8");
}
TEST_F(AssemblerRISCV64Test, VLsseg2e16) {
DriverStr(RepeatVRRVmFiltered(&Riscv64Assembler::VLsseg2e16,
"vlsseg2e16.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, XRegister>()),
"VLsseg2e16");
}
TEST_F(AssemblerRISCV64Test, VLsseg2e32) {
DriverStr(RepeatVRRVmFiltered(&Riscv64Assembler::VLsseg2e32,
"vlsseg2e32.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, XRegister>()),
"VLsseg2e32");
}
TEST_F(AssemblerRISCV64Test, VLsseg2e64) {
DriverStr(RepeatVRRVmFiltered(&Riscv64Assembler::VLsseg2e64,
"vlsseg2e64.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, XRegister>()),
"VLsseg2e64");
}
TEST_F(AssemblerRISCV64Test, VLsseg3e8) {
DriverStr(RepeatVRRVmFiltered(&Riscv64Assembler::VLsseg3e8,
"vlsseg3e8.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, XRegister>()),
"VLsseg3e8");
}
TEST_F(AssemblerRISCV64Test, VLsseg3e16) {
DriverStr(RepeatVRRVmFiltered(&Riscv64Assembler::VLsseg3e16,
"vlsseg3e16.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, XRegister>()),
"VLsseg3e16");
}
TEST_F(AssemblerRISCV64Test, VLsseg3e32) {
DriverStr(RepeatVRRVmFiltered(&Riscv64Assembler::VLsseg3e32,
"vlsseg3e32.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, XRegister>()),
"VLsseg3e32");
}
TEST_F(AssemblerRISCV64Test, VLsseg3e64) {
DriverStr(RepeatVRRVmFiltered(&Riscv64Assembler::VLsseg3e64,
"vlsseg3e64.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, XRegister>()),
"VLsseg3e64");
}
TEST_F(AssemblerRISCV64Test, VLsseg4e8) {
DriverStr(RepeatVRRVmFiltered(&Riscv64Assembler::VLsseg4e8,
"vlsseg4e8.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, XRegister>()),
"VLsseg4e8");
}
TEST_F(AssemblerRISCV64Test, VLsseg4e16) {
DriverStr(RepeatVRRVmFiltered(&Riscv64Assembler::VLsseg4e16,
"vlsseg4e16.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, XRegister>()),
"VLsseg4e16");
}
TEST_F(AssemblerRISCV64Test, VLsseg4e32) {
DriverStr(RepeatVRRVmFiltered(&Riscv64Assembler::VLsseg4e32,
"vlsseg4e32.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, XRegister>()),
"VLsseg4e32");
}
TEST_F(AssemblerRISCV64Test, VLsseg4e64) {
DriverStr(RepeatVRRVmFiltered(&Riscv64Assembler::VLsseg4e64,
"vlsseg4e64.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, XRegister>()),
"VLsseg4e64");
}
TEST_F(AssemblerRISCV64Test, VLsseg5e8) {
DriverStr(RepeatVRRVmFiltered(&Riscv64Assembler::VLsseg5e8,
"vlsseg5e8.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, XRegister>()),
"VLsseg5e8");
}
TEST_F(AssemblerRISCV64Test, VLsseg5e16) {
DriverStr(RepeatVRRVmFiltered(&Riscv64Assembler::VLsseg5e16,
"vlsseg5e16.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, XRegister>()),
"VLsseg5e16");
}
TEST_F(AssemblerRISCV64Test, VLsseg5e32) {
DriverStr(RepeatVRRVmFiltered(&Riscv64Assembler::VLsseg5e32,
"vlsseg5e32.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, XRegister>()),
"VLsseg5e32");
}
TEST_F(AssemblerRISCV64Test, VLsseg5e64) {
DriverStr(RepeatVRRVmFiltered(&Riscv64Assembler::VLsseg5e64,
"vlsseg5e64.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, XRegister>()),
"VLsseg5e64");
}
TEST_F(AssemblerRISCV64Test, VLsseg6e8) {
DriverStr(RepeatVRRVmFiltered(&Riscv64Assembler::VLsseg6e8,
"vlsseg6e8.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, XRegister>()),
"VLsseg6e8");
}
TEST_F(AssemblerRISCV64Test, VLsseg6e16) {
DriverStr(RepeatVRRVmFiltered(&Riscv64Assembler::VLsseg6e16,
"vlsseg6e16.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, XRegister>()),
"VLsseg6e16");
}
TEST_F(AssemblerRISCV64Test, VLsseg6e32) {
DriverStr(RepeatVRRVmFiltered(&Riscv64Assembler::VLsseg6e32,
"vlsseg6e32.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, XRegister>()),
"VLsseg6e32");
}
TEST_F(AssemblerRISCV64Test, VLsseg6e64) {
DriverStr(RepeatVRRVmFiltered(&Riscv64Assembler::VLsseg6e64,
"vlsseg6e64.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, XRegister>()),
"VLsseg6e64");
}
TEST_F(AssemblerRISCV64Test, VLsseg7e8) {
DriverStr(RepeatVRRVmFiltered(&Riscv64Assembler::VLsseg7e8,
"vlsseg7e8.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, XRegister>()),
"VLsseg7e8");
}
TEST_F(AssemblerRISCV64Test, VLsseg7e16) {
DriverStr(RepeatVRRVmFiltered(&Riscv64Assembler::VLsseg7e16,
"vlsseg7e16.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, XRegister>()),
"VLsseg7e16");
}
TEST_F(AssemblerRISCV64Test, VLsseg7e32) {
DriverStr(RepeatVRRVmFiltered(&Riscv64Assembler::VLsseg7e32,
"vlsseg7e32.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, XRegister>()),
"VLsseg7e32");
}
TEST_F(AssemblerRISCV64Test, VLsseg7e64) {
DriverStr(RepeatVRRVmFiltered(&Riscv64Assembler::VLsseg7e64,
"vlsseg7e64.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, XRegister>()),
"VLsseg7e64");
}
TEST_F(AssemblerRISCV64Test, VLsseg8e8) {
DriverStr(RepeatVRRVmFiltered(&Riscv64Assembler::VLsseg8e8,
"vlsseg8e8.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, XRegister>()),
"VLsseg8e8");
}
TEST_F(AssemblerRISCV64Test, VLsseg8e16) {
DriverStr(RepeatVRRVmFiltered(&Riscv64Assembler::VLsseg8e16,
"vlsseg8e16.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, XRegister>()),
"VLsseg8e16");
}
TEST_F(AssemblerRISCV64Test, VLsseg8e32) {
DriverStr(RepeatVRRVmFiltered(&Riscv64Assembler::VLsseg8e32,
"vlsseg8e32.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, XRegister>()),
"VLsseg8e32");
}
TEST_F(AssemblerRISCV64Test, VLsseg8e64) {
DriverStr(RepeatVRRVmFiltered(&Riscv64Assembler::VLsseg8e64,
"vlsseg8e64.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, XRegister>()),
"VLsseg8e64");
}
TEST_F(AssemblerRISCV64Test, VSsseg2e8) {
DriverStr(RepeatVRRVm(&Riscv64Assembler::VSsseg2e8, "vssseg2e8.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSsseg2e8");
}
TEST_F(AssemblerRISCV64Test, VSsseg2e16) {
DriverStr(RepeatVRRVm(&Riscv64Assembler::VSsseg2e16, "vssseg2e16.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSsseg2e16");
}
TEST_F(AssemblerRISCV64Test, VSsseg2e32) {
DriverStr(RepeatVRRVm(&Riscv64Assembler::VSsseg2e32, "vssseg2e32.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSsseg2e32");
}
TEST_F(AssemblerRISCV64Test, VSsseg2e64) {
DriverStr(RepeatVRRVm(&Riscv64Assembler::VSsseg2e64, "vssseg2e64.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSsseg2e64");
}
TEST_F(AssemblerRISCV64Test, VSsseg3e8) {
DriverStr(RepeatVRRVm(&Riscv64Assembler::VSsseg3e8, "vssseg3e8.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSsseg3e8");
}
TEST_F(AssemblerRISCV64Test, VSsseg3e16) {
DriverStr(RepeatVRRVm(&Riscv64Assembler::VSsseg3e16, "vssseg3e16.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSsseg3e16");
}
TEST_F(AssemblerRISCV64Test, VSsseg3e32) {
DriverStr(RepeatVRRVm(&Riscv64Assembler::VSsseg3e32, "vssseg3e32.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSsseg3e32");
}
TEST_F(AssemblerRISCV64Test, VSsseg3e64) {
DriverStr(RepeatVRRVm(&Riscv64Assembler::VSsseg3e64, "vssseg3e64.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSsseg3e64");
}
TEST_F(AssemblerRISCV64Test, VSsseg4e8) {
DriverStr(RepeatVRRVm(&Riscv64Assembler::VSsseg4e8, "vssseg4e8.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSsseg4e8");
}
TEST_F(AssemblerRISCV64Test, VSsseg4e16) {
DriverStr(RepeatVRRVm(&Riscv64Assembler::VSsseg4e16, "vssseg4e16.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSsseg4e16");
}
TEST_F(AssemblerRISCV64Test, VSsseg4e32) {
DriverStr(RepeatVRRVm(&Riscv64Assembler::VSsseg4e32, "vssseg4e32.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSsseg4e32");
}
TEST_F(AssemblerRISCV64Test, VSsseg4e64) {
DriverStr(RepeatVRRVm(&Riscv64Assembler::VSsseg4e64, "vssseg4e64.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSsseg4e64");
}
TEST_F(AssemblerRISCV64Test, VSsseg5e8) {
DriverStr(RepeatVRRVm(&Riscv64Assembler::VSsseg5e8, "vssseg5e8.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSsseg5e8");
}
TEST_F(AssemblerRISCV64Test, VSsseg5e16) {
DriverStr(RepeatVRRVm(&Riscv64Assembler::VSsseg5e16, "vssseg5e16.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSsseg5e16");
}
TEST_F(AssemblerRISCV64Test, VSsseg5e32) {
DriverStr(RepeatVRRVm(&Riscv64Assembler::VSsseg5e32, "vssseg5e32.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSsseg5e32");
}
TEST_F(AssemblerRISCV64Test, VSsseg5e64) {
DriverStr(RepeatVRRVm(&Riscv64Assembler::VSsseg5e64, "vssseg5e64.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSsseg5e64");
}
TEST_F(AssemblerRISCV64Test, VSsseg6e8) {
DriverStr(RepeatVRRVm(&Riscv64Assembler::VSsseg6e8, "vssseg6e8.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSsseg6e8");
}
TEST_F(AssemblerRISCV64Test, VSsseg6e16) {
DriverStr(RepeatVRRVm(&Riscv64Assembler::VSsseg6e16, "vssseg6e16.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSsseg6e16");
}
TEST_F(AssemblerRISCV64Test, VSsseg6e32) {
DriverStr(RepeatVRRVm(&Riscv64Assembler::VSsseg6e32, "vssseg6e32.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSsseg6e32");
}
TEST_F(AssemblerRISCV64Test, VSsseg6e64) {
DriverStr(RepeatVRRVm(&Riscv64Assembler::VSsseg6e64, "vssseg6e64.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSsseg6e64");
}
TEST_F(AssemblerRISCV64Test, VSsseg7e8) {
DriverStr(RepeatVRRVm(&Riscv64Assembler::VSsseg7e8, "vssseg7e8.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSsseg7e8");
}
TEST_F(AssemblerRISCV64Test, VSsseg7e16) {
DriverStr(RepeatVRRVm(&Riscv64Assembler::VSsseg7e16, "vssseg7e16.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSsseg7e16");
}
TEST_F(AssemblerRISCV64Test, VSsseg7e32) {
DriverStr(RepeatVRRVm(&Riscv64Assembler::VSsseg7e32, "vssseg7e32.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSsseg7e32");
}
TEST_F(AssemblerRISCV64Test, VSsseg7e64) {
DriverStr(RepeatVRRVm(&Riscv64Assembler::VSsseg7e64, "vssseg7e64.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSsseg7e64");
}
TEST_F(AssemblerRISCV64Test, VSsseg8e8) {
DriverStr(RepeatVRRVm(&Riscv64Assembler::VSsseg8e8, "vssseg8e8.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSsseg8e8");
}
TEST_F(AssemblerRISCV64Test, VSsseg8e16) {
DriverStr(RepeatVRRVm(&Riscv64Assembler::VSsseg8e16, "vssseg8e16.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSsseg8e16");
}
TEST_F(AssemblerRISCV64Test, VSsseg8e32) {
DriverStr(RepeatVRRVm(&Riscv64Assembler::VSsseg8e32, "vssseg8e32.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSsseg8e32");
}
TEST_F(AssemblerRISCV64Test, VSsseg8e64) {
DriverStr(RepeatVRRVm(&Riscv64Assembler::VSsseg8e64, "vssseg8e64.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSsseg8e64");
}
TEST_F(AssemblerRISCV64Test, VLuxseg2ei8) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLuxseg2ei8,
"vluxseg2ei8.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLuxseg2ei8");
}
TEST_F(AssemblerRISCV64Test, VLuxseg2ei16) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLuxseg2ei16,
"vluxseg2ei16.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLuxseg2ei16");
}
TEST_F(AssemblerRISCV64Test, VLuxseg2ei32) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLuxseg2ei32,
"vluxseg2ei32.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLuxseg2ei32");
}
TEST_F(AssemblerRISCV64Test, VLuxseg2ei64) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLuxseg2ei64,
"vluxseg2ei64.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLuxseg2ei64");
}
TEST_F(AssemblerRISCV64Test, VLuxseg3ei8) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLuxseg3ei8,
"vluxseg3ei8.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLuxseg3ei8");
}
TEST_F(AssemblerRISCV64Test, VLuxseg3ei16) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLuxseg3ei16,
"vluxseg3ei16.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLuxseg3ei16");
}
TEST_F(AssemblerRISCV64Test, VLuxseg3ei32) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLuxseg3ei32,
"vluxseg3ei32.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLuxseg3ei32");
}
TEST_F(AssemblerRISCV64Test, VLuxseg3ei64) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLuxseg3ei64,
"vluxseg3ei64.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLuxseg3ei64");
}
TEST_F(AssemblerRISCV64Test, VLuxseg4ei8) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLuxseg4ei8,
"vluxseg4ei8.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLuxseg4ei8");
}
TEST_F(AssemblerRISCV64Test, VLuxseg4ei16) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLuxseg4ei16,
"vluxseg4ei16.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLuxseg4ei16");
}
TEST_F(AssemblerRISCV64Test, VLuxseg4ei32) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLuxseg4ei32,
"vluxseg4ei32.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLuxseg4ei32");
}
TEST_F(AssemblerRISCV64Test, VLuxseg4ei64) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLuxseg4ei64,
"vluxseg4ei64.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLuxseg4ei64");
}
TEST_F(AssemblerRISCV64Test, VLuxseg5ei8) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLuxseg5ei8,
"vluxseg5ei8.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLuxseg5ei8");
}
TEST_F(AssemblerRISCV64Test, VLuxseg5ei16) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLuxseg5ei16,
"vluxseg5ei16.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLuxseg5ei16");
}
TEST_F(AssemblerRISCV64Test, VLuxseg5ei32) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLuxseg5ei32,
"vluxseg5ei32.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLuxseg5ei32");
}
TEST_F(AssemblerRISCV64Test, VLuxseg5ei64) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLuxseg5ei64,
"vluxseg5ei64.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLuxseg5ei64");
}
TEST_F(AssemblerRISCV64Test, VLuxseg6ei8) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLuxseg6ei8,
"vluxseg6ei8.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLuxseg6ei8");
}
TEST_F(AssemblerRISCV64Test, VLuxseg6ei16) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLuxseg6ei16,
"vluxseg6ei16.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLuxseg6ei16");
}
TEST_F(AssemblerRISCV64Test, VLuxseg6ei32) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLuxseg6ei32,
"vluxseg6ei32.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLuxseg6ei32");
}
TEST_F(AssemblerRISCV64Test, VLuxseg6ei64) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLuxseg6ei64,
"vluxseg6ei64.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLuxseg6ei64");
}
TEST_F(AssemblerRISCV64Test, VLuxseg7ei8) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLuxseg7ei8,
"vluxseg7ei8.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLuxseg7ei8");
}
TEST_F(AssemblerRISCV64Test, VLuxseg7ei16) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLuxseg7ei16,
"vluxseg7ei16.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLuxseg7ei16");
}
TEST_F(AssemblerRISCV64Test, VLuxseg7ei32) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLuxseg7ei32,
"vluxseg7ei32.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLuxseg7ei32");
}
TEST_F(AssemblerRISCV64Test, VLuxseg7ei64) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLuxseg7ei64,
"vluxseg7ei64.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLuxseg7ei64");
}
TEST_F(AssemblerRISCV64Test, VLuxseg8ei8) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLuxseg8ei8,
"vluxseg8ei8.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLuxseg8ei8");
}
TEST_F(AssemblerRISCV64Test, VLuxseg8ei16) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLuxseg8ei16,
"vluxseg8ei16.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLuxseg8ei16");
}
TEST_F(AssemblerRISCV64Test, VLuxseg8ei32) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLuxseg8ei32,
"vluxseg8ei32.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLuxseg8ei32");
}
TEST_F(AssemblerRISCV64Test, VLuxseg8ei64) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLuxseg8ei64,
"vluxseg8ei64.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLuxseg8ei64");
}
TEST_F(AssemblerRISCV64Test, VSuxseg2ei8) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSuxseg2ei8, "vsuxseg2ei8.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSuxseg2ei8");
}
TEST_F(AssemblerRISCV64Test, VSuxseg2ei16) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSuxseg2ei16, "vsuxseg2ei16.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSuxseg2ei16");
}
TEST_F(AssemblerRISCV64Test, VSuxseg2ei32) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSuxseg2ei32, "vsuxseg2ei32.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSuxseg2ei32");
}
TEST_F(AssemblerRISCV64Test, VSuxseg2ei64) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSuxseg2ei64, "vsuxseg2ei64.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSuxseg2ei64");
}
TEST_F(AssemblerRISCV64Test, VSuxseg3ei8) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSuxseg3ei8, "vsuxseg3ei8.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSuxseg3ei8");
}
TEST_F(AssemblerRISCV64Test, VSuxseg3ei16) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSuxseg3ei16, "vsuxseg3ei16.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSuxseg3ei16");
}
TEST_F(AssemblerRISCV64Test, VSuxseg3ei32) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSuxseg3ei32, "vsuxseg3ei32.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSuxseg3ei32");
}
TEST_F(AssemblerRISCV64Test, VSuxseg3ei64) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSuxseg3ei64, "vsuxseg3ei64.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSuxseg3ei64");
}
TEST_F(AssemblerRISCV64Test, VSuxseg4ei8) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSuxseg4ei8, "vsuxseg4ei8.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSuxseg4ei8");
}
TEST_F(AssemblerRISCV64Test, VSuxseg4ei16) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSuxseg4ei16, "vsuxseg4ei16.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSuxseg4ei16");
}
TEST_F(AssemblerRISCV64Test, VSuxseg4ei32) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSuxseg4ei32, "vsuxseg4ei32.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSuxseg4ei32");
}
TEST_F(AssemblerRISCV64Test, VSuxseg4ei64) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSuxseg4ei64, "vsuxseg4ei64.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSuxseg4ei64");
}
TEST_F(AssemblerRISCV64Test, VSuxseg5ei8) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSuxseg5ei8, "vsuxseg5ei8.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSuxseg5ei8");
}
TEST_F(AssemblerRISCV64Test, VSuxseg5ei16) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSuxseg5ei16, "vsuxseg5ei16.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSuxseg5ei16");
}
TEST_F(AssemblerRISCV64Test, VSuxseg5ei32) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSuxseg5ei32, "vsuxseg5ei32.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSuxseg5ei32");
}
TEST_F(AssemblerRISCV64Test, VSuxseg5ei64) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSuxseg5ei64, "vsuxseg5ei64.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSuxseg5ei64");
}
TEST_F(AssemblerRISCV64Test, VSuxseg6ei8) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSuxseg6ei8, "vsuxseg6ei8.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSuxseg6ei8");
}
TEST_F(AssemblerRISCV64Test, VSuxseg6ei16) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSuxseg6ei16, "vsuxseg6ei16.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSuxseg6ei16");
}
TEST_F(AssemblerRISCV64Test, VSuxseg6ei32) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSuxseg6ei32, "vsuxseg6ei32.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSuxseg6ei32");
}
TEST_F(AssemblerRISCV64Test, VSuxseg6ei64) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSuxseg6ei64, "vsuxseg6ei64.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSuxseg6ei64");
}
TEST_F(AssemblerRISCV64Test, VSuxseg7ei8) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSuxseg7ei8, "vsuxseg7ei8.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSuxseg7ei8");
}
TEST_F(AssemblerRISCV64Test, VSuxseg7ei16) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSuxseg7ei16, "vsuxseg7ei16.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSuxseg7ei16");
}
TEST_F(AssemblerRISCV64Test, VSuxseg7ei32) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSuxseg7ei32, "vsuxseg7ei32.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSuxseg7ei32");
}
TEST_F(AssemblerRISCV64Test, VSuxseg7ei64) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSuxseg7ei64, "vsuxseg7ei64.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSuxseg7ei64");
}
TEST_F(AssemblerRISCV64Test, VSuxseg8ei8) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSuxseg8ei8, "vsuxseg8ei8.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSuxseg8ei8");
}
TEST_F(AssemblerRISCV64Test, VSuxseg8ei16) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSuxseg8ei16, "vsuxseg8ei16.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSuxseg8ei16");
}
TEST_F(AssemblerRISCV64Test, VSuxseg8ei32) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSuxseg8ei32, "vsuxseg8ei32.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSuxseg8ei32");
}
TEST_F(AssemblerRISCV64Test, VSuxseg8ei64) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSuxseg8ei64, "vsuxseg8ei64.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSuxseg8ei64");
}
TEST_F(AssemblerRISCV64Test, VLoxseg2ei8) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLoxseg2ei8,
"vloxseg2ei8.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLoxseg2ei8");
}
TEST_F(AssemblerRISCV64Test, VLoxseg2ei16) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLoxseg2ei16,
"vloxseg2ei16.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLoxseg2ei16");
}
TEST_F(AssemblerRISCV64Test, VLoxseg2ei32) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLoxseg2ei32,
"vloxseg2ei32.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLoxseg2ei32");
}
TEST_F(AssemblerRISCV64Test, VLoxseg2ei64) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLoxseg2ei64,
"vloxseg2ei64.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLoxseg2ei64");
}
TEST_F(AssemblerRISCV64Test, VLoxseg3ei8) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLoxseg3ei8,
"vloxseg3ei8.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLoxseg3ei8");
}
TEST_F(AssemblerRISCV64Test, VLoxseg3ei16) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLoxseg3ei16,
"vloxseg3ei16.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLoxseg3ei16");
}
TEST_F(AssemblerRISCV64Test, VLoxseg3ei32) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLoxseg3ei32,
"vloxseg3ei32.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLoxseg3ei32");
}
TEST_F(AssemblerRISCV64Test, VLoxseg3ei64) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLoxseg3ei64,
"vloxseg3ei64.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLoxseg3ei64");
}
TEST_F(AssemblerRISCV64Test, VLoxseg4ei8) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLoxseg4ei8,
"vloxseg4ei8.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLoxseg4ei8");
}
TEST_F(AssemblerRISCV64Test, VLoxseg4ei16) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLoxseg4ei16,
"vloxseg4ei16.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLoxseg4ei16");
}
TEST_F(AssemblerRISCV64Test, VLoxseg4ei32) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLoxseg4ei32,
"vloxseg4ei32.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLoxseg4ei32");
}
TEST_F(AssemblerRISCV64Test, VLoxseg4ei64) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLoxseg4ei64,
"vloxseg4ei64.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLoxseg4ei64");
}
TEST_F(AssemblerRISCV64Test, VLoxseg5ei8) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLoxseg5ei8,
"vloxseg5ei8.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLoxseg5ei8");
}
TEST_F(AssemblerRISCV64Test, VLoxseg5ei16) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLoxseg5ei16,
"vloxseg5ei16.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLoxseg5ei16");
}
TEST_F(AssemblerRISCV64Test, VLoxseg5ei32) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLoxseg5ei32,
"vloxseg5ei32.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLoxseg5ei32");
}
TEST_F(AssemblerRISCV64Test, VLoxseg5ei64) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLoxseg5ei64,
"vloxseg5ei64.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLoxseg5ei64");
}
TEST_F(AssemblerRISCV64Test, VLoxseg6ei8) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLoxseg6ei8,
"vloxseg6ei8.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLoxseg6ei8");
}
TEST_F(AssemblerRISCV64Test, VLoxseg6ei16) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLoxseg6ei16,
"vloxseg6ei16.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLoxseg6ei16");
}
TEST_F(AssemblerRISCV64Test, VLoxseg6ei32) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLoxseg6ei32,
"vloxseg6ei32.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLoxseg6ei32");
}
TEST_F(AssemblerRISCV64Test, VLoxseg6ei64) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLoxseg6ei64,
"vloxseg6ei64.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLoxseg6ei64");
}
TEST_F(AssemblerRISCV64Test, VLoxseg7ei8) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLoxseg7ei8,
"vloxseg7ei8.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLoxseg7ei8");
}
TEST_F(AssemblerRISCV64Test, VLoxseg7ei16) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLoxseg7ei16,
"vloxseg7ei16.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLoxseg7ei16");
}
TEST_F(AssemblerRISCV64Test, VLoxseg7ei32) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLoxseg7ei32,
"vloxseg7ei32.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLoxseg7ei32");
}
TEST_F(AssemblerRISCV64Test, VLoxseg7ei64) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLoxseg7ei64,
"vloxseg7ei64.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLoxseg7ei64");
}
TEST_F(AssemblerRISCV64Test, VLoxseg8ei8) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLoxseg8ei8,
"vloxseg8ei8.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLoxseg8ei8");
}
TEST_F(AssemblerRISCV64Test, VLoxseg8ei16) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLoxseg8ei16,
"vloxseg8ei16.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLoxseg8ei16");
}
TEST_F(AssemblerRISCV64Test, VLoxseg8ei32) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLoxseg8ei32,
"vloxseg8ei32.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLoxseg8ei32");
}
TEST_F(AssemblerRISCV64Test, VLoxseg8ei64) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VLoxseg8ei64,
"vloxseg8ei64.v {reg1}, ({reg2}), {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VLoxseg8ei64");
}
TEST_F(AssemblerRISCV64Test, VSoxseg2ei8) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSoxseg2ei8, "vsoxseg2ei8.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSoxseg2ei8");
}
TEST_F(AssemblerRISCV64Test, VSoxseg2ei16) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSoxseg2ei16, "vsoxseg2ei16.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSoxseg2ei16");
}
TEST_F(AssemblerRISCV64Test, VSoxseg2ei32) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSoxseg2ei32, "vsoxseg2ei32.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSoxseg2ei32");
}
TEST_F(AssemblerRISCV64Test, VSoxseg2ei64) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSoxseg2ei64, "vsoxseg2ei64.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSoxseg2ei64");
}
TEST_F(AssemblerRISCV64Test, VSoxseg3ei8) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSoxseg3ei8, "vsoxseg3ei8.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSoxseg3ei8");
}
TEST_F(AssemblerRISCV64Test, VSoxseg3ei16) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSoxseg3ei16, "vsoxseg3ei16.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSoxseg3ei16");
}
TEST_F(AssemblerRISCV64Test, VSoxseg3ei32) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSoxseg3ei32, "vsoxseg3ei32.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSoxseg3ei32");
}
TEST_F(AssemblerRISCV64Test, VSoxseg3ei64) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSoxseg3ei64, "vsoxseg3ei64.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSoxseg3ei64");
}
TEST_F(AssemblerRISCV64Test, VSoxseg4ei8) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSoxseg4ei8, "vsoxseg4ei8.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSoxseg4ei8");
}
TEST_F(AssemblerRISCV64Test, VSoxseg4ei16) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSoxseg4ei16, "vsoxseg4ei16.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSoxseg4ei16");
}
TEST_F(AssemblerRISCV64Test, VSoxseg4ei32) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSoxseg4ei32, "vsoxseg4ei32.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSoxseg4ei32");
}
TEST_F(AssemblerRISCV64Test, VSoxseg4ei64) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSoxseg4ei64, "vsoxseg4ei64.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSoxseg4ei64");
}
TEST_F(AssemblerRISCV64Test, VSoxseg5ei8) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSoxseg5ei8, "vsoxseg5ei8.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSoxseg5ei8");
}
TEST_F(AssemblerRISCV64Test, VSoxseg5ei16) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSoxseg5ei16, "vsoxseg5ei16.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSoxseg5ei16");
}
TEST_F(AssemblerRISCV64Test, VSoxseg5ei32) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSoxseg5ei32, "vsoxseg5ei32.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSoxseg5ei32");
}
TEST_F(AssemblerRISCV64Test, VSoxseg5ei64) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSoxseg5ei64, "vsoxseg5ei64.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSoxseg5ei64");
}
TEST_F(AssemblerRISCV64Test, VSoxseg6ei8) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSoxseg6ei8, "vsoxseg6ei8.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSoxseg6ei8");
}
TEST_F(AssemblerRISCV64Test, VSoxseg6ei16) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSoxseg6ei16, "vsoxseg6ei16.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSoxseg6ei16");
}
TEST_F(AssemblerRISCV64Test, VSoxseg6ei32) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSoxseg6ei32, "vsoxseg6ei32.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSoxseg6ei32");
}
TEST_F(AssemblerRISCV64Test, VSoxseg6ei64) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSoxseg6ei64, "vsoxseg6ei64.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSoxseg6ei64");
}
TEST_F(AssemblerRISCV64Test, VSoxseg7ei8) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSoxseg7ei8, "vsoxseg7ei8.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSoxseg7ei8");
}
TEST_F(AssemblerRISCV64Test, VSoxseg7ei16) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSoxseg7ei16, "vsoxseg7ei16.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSoxseg7ei16");
}
TEST_F(AssemblerRISCV64Test, VSoxseg7ei32) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSoxseg7ei32, "vsoxseg7ei32.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSoxseg7ei32");
}
TEST_F(AssemblerRISCV64Test, VSoxseg7ei64) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSoxseg7ei64, "vsoxseg7ei64.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSoxseg7ei64");
}
TEST_F(AssemblerRISCV64Test, VSoxseg8ei8) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSoxseg8ei8, "vsoxseg8ei8.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSoxseg8ei8");
}
TEST_F(AssemblerRISCV64Test, VSoxseg8ei16) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSoxseg8ei16, "vsoxseg8ei16.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSoxseg8ei16");
}
TEST_F(AssemblerRISCV64Test, VSoxseg8ei32) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSoxseg8ei32, "vsoxseg8ei32.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSoxseg8ei32");
}
TEST_F(AssemblerRISCV64Test, VSoxseg8ei64) {
DriverStr(
RepeatVRVVm(&Riscv64Assembler::VSoxseg8ei64, "vsoxseg8ei64.v {reg1}, ({reg2}), {reg3}{vm}"),
"VSoxseg8ei64");
}
TEST_F(AssemblerRISCV64Test, VL1re8) {
DriverStr(
RepeatVRAligned(&Riscv64Assembler::VL1re8, /*alignment=*/ 1, "vl1re8.v {reg1}, ({reg2})"),
"VL1re8");
}
TEST_F(AssemblerRISCV64Test, VL1re16) {
DriverStr(
RepeatVRAligned(&Riscv64Assembler::VL1re16, /*alignment=*/ 1, "vl1re16.v {reg1}, ({reg2})"),
"VL1re16");
}
TEST_F(AssemblerRISCV64Test, VL1re32) {
DriverStr(
RepeatVRAligned(&Riscv64Assembler::VL1re32, /*alignment=*/ 1, "vl1re32.v {reg1}, ({reg2})"),
"VL1re32");
}
TEST_F(AssemblerRISCV64Test, VL1re64) {
DriverStr(
RepeatVRAligned(&Riscv64Assembler::VL1re64, /*alignment=*/ 1, "vl1re64.v {reg1}, ({reg2})"),
"VL1re64");
}
TEST_F(AssemblerRISCV64Test, VL2re8) {
DriverStr(
RepeatVRAligned(&Riscv64Assembler::VL2re8, /*alignment=*/ 2, "vl2re8.v {reg1}, ({reg2})"),
"VL2re8");
}
TEST_F(AssemblerRISCV64Test, VL2re16) {
DriverStr(
RepeatVRAligned(&Riscv64Assembler::VL2re16, /*alignment=*/ 2, "vl2re16.v {reg1}, ({reg2})"),
"VL2re16");
}
TEST_F(AssemblerRISCV64Test, VL2re32) {
DriverStr(
RepeatVRAligned(&Riscv64Assembler::VL2re32, /*alignment=*/ 2, "vl2re32.v {reg1}, ({reg2})"),
"VL2re32");
}
TEST_F(AssemblerRISCV64Test, VL2re64) {
DriverStr(
RepeatVRAligned(&Riscv64Assembler::VL2re64, /*alignment=*/ 2, "vl2re64.v {reg1}, ({reg2})"),
"VL2re64");
}
TEST_F(AssemblerRISCV64Test, VL4re8) {
DriverStr(
RepeatVRAligned(&Riscv64Assembler::VL4re8, /*alignment=*/ 4, "vl4re8.v {reg1}, ({reg2})"),
"VL4re8");
}
TEST_F(AssemblerRISCV64Test, VL4re16) {
DriverStr(
RepeatVRAligned(&Riscv64Assembler::VL4re16, /*alignment=*/ 4, "vl4re16.v {reg1}, ({reg2})"),
"VL4re16");
}
TEST_F(AssemblerRISCV64Test, VL4re32) {
DriverStr(
RepeatVRAligned(&Riscv64Assembler::VL4re32, /*alignment=*/ 4, "vl4re32.v {reg1}, ({reg2})"),
"VL4re32");
}
TEST_F(AssemblerRISCV64Test, VL4re64) {
DriverStr(
RepeatVRAligned(&Riscv64Assembler::VL4re64, /*alignment=*/ 4, "vl4re64.v {reg1}, ({reg2})"),
"VL4re64");
}
TEST_F(AssemblerRISCV64Test, VL8re8) {
DriverStr(
RepeatVRAligned(&Riscv64Assembler::VL8re8, /*alignment=*/ 8, "vl8re8.v {reg1}, ({reg2})"),
"VL8re8");
}
TEST_F(AssemblerRISCV64Test, VL8re16) {
DriverStr(
RepeatVRAligned(&Riscv64Assembler::VL8re16, /*alignment=*/ 8, "vl8re16.v {reg1}, ({reg2})"),
"VL8re16");
}
TEST_F(AssemblerRISCV64Test, VL8re32) {
DriverStr(
RepeatVRAligned(&Riscv64Assembler::VL8re32, /*alignment=*/ 8, "vl8re32.v {reg1}, ({reg2})"),
"VL8re32");
}
TEST_F(AssemblerRISCV64Test, VL8re64) {
DriverStr(
RepeatVRAligned(&Riscv64Assembler::VL8re64, /*alignment=*/ 8, "vl8re64.v {reg1}, ({reg2})"),
"VL8re64");
}
TEST_F(AssemblerRISCV64Test, VL1r) {
DriverStr(RepeatVRAligned(&Riscv64Assembler::VL1r, /*alignment=*/ 1, "vl1r.v {reg1}, ({reg2})"),
"VL1r");
}
TEST_F(AssemblerRISCV64Test, VL2r) {
DriverStr(RepeatVRAligned(&Riscv64Assembler::VL2r, /*alignment=*/ 2, "vl2r.v {reg1}, ({reg2})"),
"VL2r");
}
TEST_F(AssemblerRISCV64Test, VL4r) {
DriverStr(RepeatVRAligned(&Riscv64Assembler::VL4r, /*alignment=*/ 4, "vl4r.v {reg1}, ({reg2})"),
"VL4r");
}
TEST_F(AssemblerRISCV64Test, VL8r) {
DriverStr(RepeatVRAligned(&Riscv64Assembler::VL8r, /*alignment=*/ 8, "vl8r.v {reg1}, ({reg2})"),
"VL8r");
}
TEST_F(AssemblerRISCV64Test, VS1r) {
DriverStr(RepeatVRAligned(&Riscv64Assembler::VS1r, /*alignment=*/ 1, "vs1r.v {reg1}, ({reg2})"),
"VS1r");
}
TEST_F(AssemblerRISCV64Test, VS2r) {
DriverStr(RepeatVRAligned(&Riscv64Assembler::VS2r, /*alignment=*/ 2, "vs2r.v {reg1}, ({reg2})"),
"VS2r");
}
TEST_F(AssemblerRISCV64Test, VS4r) {
DriverStr(RepeatVRAligned(&Riscv64Assembler::VS4r, /*alignment=*/ 4, "vs4r.v {reg1}, ({reg2})"),
"VS4r");
}
TEST_F(AssemblerRISCV64Test, VS8r) {
DriverStr(RepeatVRAligned(&Riscv64Assembler::VS8r, /*alignment=*/ 8, "vs8r.v {reg1}, ({reg2})"),
"VS8r");
}
TEST_F(AssemblerRISCV64Test, VAdd_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VAdd_vv,
"vadd.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VAdd_vv");
}
TEST_F(AssemblerRISCV64Test, VAdd_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VAdd_vx,
"vadd.vx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, XRegister>()),
"VAdd_vx");
}
TEST_F(AssemblerRISCV64Test, VAdd_vi) {
DriverStr(RepeatVVIbVmFiltered(&Riscv64Assembler::VAdd_vi,
/*imm_bits=*/ -5,
"vadd.vi {reg1}, {reg2}, {imm}{vm}",
SkipV0Vm<VRegister, int32_t>()),
"VAdd_vi");
}
TEST_F(AssemblerRISCV64Test, VSub_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VSub_vv,
"vsub.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VSub_vv");
}
TEST_F(AssemblerRISCV64Test, VSub_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VSub_vx,
"vsub.vx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, XRegister>()),
"VSub_vx");
}
TEST_F(AssemblerRISCV64Test, VRsub_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VRsub_vx,
"vrsub.vx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, XRegister>()),
"VRsub_vx");
}
TEST_F(AssemblerRISCV64Test, VRsub_vi) {
DriverStr(RepeatVVIbVmFiltered(&Riscv64Assembler::VRsub_vi,
/*imm_bits=*/ -5,
"vrsub.vi {reg1}, {reg2}, {imm}{vm}",
SkipV0Vm<VRegister, int32_t>()),
"VRsub_vi");
}
TEST_F(AssemblerRISCV64Test, VNeg_v) {
DriverStr(RepeatVV(&Riscv64Assembler::VNeg_v, "vneg.v {reg1}, {reg2}"), "VNeg_v");
}
TEST_F(AssemblerRISCV64Test, VMinu_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VMinu_vv,
"vminu.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VMinu_vv");
}
TEST_F(AssemblerRISCV64Test, VMinu_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VMinu_vx,
"vminu.vx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, XRegister>()),
"VMinu_vx");
}
TEST_F(AssemblerRISCV64Test, VMin_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VMin_vv,
"vmin.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VMin_vv");
}
TEST_F(AssemblerRISCV64Test, VMin_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VMin_vx,
"vmin.vx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, XRegister>()),
"VMin_vx");
}
TEST_F(AssemblerRISCV64Test, VMaxu_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VMaxu_vv,
"vmaxu.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VMaxu_vv");
}
TEST_F(AssemblerRISCV64Test, VMaxu_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VMaxu_vx,
"vmaxu.vx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, XRegister>()),
"VMaxu_vx");
}
TEST_F(AssemblerRISCV64Test, VMax_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VMax_vv,
"vmax.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VMax_vv");
}
TEST_F(AssemblerRISCV64Test, VMax_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VMax_vx,
"vmax.vx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, XRegister>()),
"VMax_vx");
}
TEST_F(AssemblerRISCV64Test, VAnd_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VAnd_vv,
"vand.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VAnd_vv");
}
TEST_F(AssemblerRISCV64Test, VAnd_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VAnd_vx,
"vand.vx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, XRegister>()),
"VAnd_vx");
}
TEST_F(AssemblerRISCV64Test, VAnd_vi) {
DriverStr(RepeatVVIbVmFiltered(&Riscv64Assembler::VAnd_vi,
/*imm_bits=*/ -5,
"vand.vi {reg1}, {reg2}, {imm}{vm}",
SkipV0Vm<VRegister, int32_t>()),
"VAnd_vi");
}
TEST_F(AssemblerRISCV64Test, VOr_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VOr_vv,
"vor.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VOr_vv");
}
TEST_F(AssemblerRISCV64Test, VOr_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VOr_vx,
"vor.vx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, XRegister>()),
"VOr_vx");
}
TEST_F(AssemblerRISCV64Test, VOr_vi) {
DriverStr(RepeatVVIbVmFiltered(&Riscv64Assembler::VOr_vi,
/*imm_bits=*/ -5,
"vor.vi {reg1}, {reg2}, {imm}{vm}",
SkipV0Vm<VRegister, int32_t>()),
"VOr_vi");
}
TEST_F(AssemblerRISCV64Test, VXor_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VXor_vv,
"vxor.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VXor_vv");
}
TEST_F(AssemblerRISCV64Test, VXor_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VXor_vx,
"vxor.vx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, XRegister>()),
"VXor_vx");
}
TEST_F(AssemblerRISCV64Test, VXor_vi) {
DriverStr(RepeatVVIbVmFiltered(&Riscv64Assembler::VXor_vi,
/*imm_bits=*/ -5,
"vxor.vi {reg1}, {reg2}, {imm}{vm}",
SkipV0Vm<VRegister, int32_t>()),
"VXor_vi");
}
TEST_F(AssemblerRISCV64Test, VNot_v) {
DriverStr(RepeatVVVmFiltered(
&Riscv64Assembler::VNot_v, "vnot.v {reg1}, {reg2}{vm}", SkipV0Vm<VRegister>()),
"VNot_v");
}
TEST_F(AssemblerRISCV64Test, VRgather_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VRgather_vv,
"vrgather.vv {reg1}, {reg2}, {reg3}{vm}",
VXVVmSkipV0VmAndNoR1R2R3Overlap()),
"VRgather_vv");
}
TEST_F(AssemblerRISCV64Test, VRgather_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VRgather_vx,
"vrgather.vx {reg1}, {reg2}, {reg3}{vm}",
VXVVmSkipV0VmAndNoR1R2Overlap<XRegister>()),
"VRgather_vx");
}
TEST_F(AssemblerRISCV64Test, VRgather_vi) {
DriverStr(RepeatVVIbVmFiltered(&Riscv64Assembler::VRgather_vi,
/*imm_bits=*/ 5,
"vrgather.vi {reg1}, {reg2}, {imm}{vm}",
VXVVmSkipV0VmAndNoR1R2Overlap<uint32_t>()),
"VRgather_vi");
}
TEST_F(AssemblerRISCV64Test, VSlideup_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VSlideup_vx,
"vslideup.vx {reg1}, {reg2}, {reg3}{vm}",
VXVVmSkipV0VmAndNoR1R2Overlap<XRegister>()),
"VSlideup_vx");
}
TEST_F(AssemblerRISCV64Test, VSlideup_vi) {
DriverStr(RepeatVVIbVmFiltered(&Riscv64Assembler::VSlideup_vi,
/*imm_bits=*/ 5,
"vslideup.vi {reg1}, {reg2}, {imm}{vm}",
VXVVmSkipV0VmAndNoR1R2Overlap<uint32_t>()),
"VSlideup_vi");
}
TEST_F(AssemblerRISCV64Test, VRgatherei16_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VRgatherei16_vv,
"vrgatherei16.vv {reg1}, {reg2}, {reg3}{vm}",
VXVVmSkipV0VmAndNoR1R2R3Overlap()),
"VRgatherei16_vv");
}
TEST_F(AssemblerRISCV64Test, VSlidedown_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VSlidedown_vx,
"vslidedown.vx {reg1}, {reg2}, {reg3}{vm}",
VXVVmSkipV0VmAndNoR1R2Overlap<XRegister>()),
"VSlidedown_vx");
}
TEST_F(AssemblerRISCV64Test, VSlidedown_vi) {
DriverStr(RepeatVVIbVmFiltered(&Riscv64Assembler::VSlidedown_vi,
/*imm_bits=*/ 5,
"vslidedown.vi {reg1}, {reg2}, {imm}{vm}",
SkipV0Vm<VRegister, uint32_t>()),
"VSlidedown_vi");
}
TEST_F(AssemblerRISCV64Test, VAdc_vvm) {
DriverStr(RepeatVVVFiltered(&Riscv64Assembler::VAdc_vvm,
"vadc.vvm {reg1}, {reg2}, {reg3}, v0",
SkipV0<VRegister, VRegister>()),
"VAdc_vvm");
}
TEST_F(AssemblerRISCV64Test, VAdc_vxm) {
DriverStr(RepeatVVRFiltered(&Riscv64Assembler::VAdc_vxm,
"vadc.vxm {reg1}, {reg2}, {reg3}, v0",
SkipV0<VRegister, XRegister>()),
"VAdc_vxm");
}
TEST_F(AssemblerRISCV64Test, VAdc_vim) {
DriverStr(RepeatVVIFiltered(&Riscv64Assembler::VAdc_vim,
/*imm_bits=*/ -5,
"vadc.vim {reg1}, {reg2}, {imm}, v0",
SkipV0<VRegister, int32_t>()),
"VAdc_vim");
}
TEST_F(AssemblerRISCV64Test, VMadc_vvm) {
DriverStr(RepeatVVV(&Riscv64Assembler::VMadc_vvm, "vmadc.vvm {reg1}, {reg2}, {reg3}, v0"),
"VMadc_vvm");
}
TEST_F(AssemblerRISCV64Test, VMadc_vxm) {
DriverStr(RepeatVVR(&Riscv64Assembler::VMadc_vxm, "vmadc.vxm {reg1}, {reg2}, {reg3}, v0"),
"VMadc_vxm");
}
TEST_F(AssemblerRISCV64Test, VMadc_vim) {
DriverStr(RepeatVVIb(&Riscv64Assembler::VMadc_vim,
/*imm_bits=*/ -5,
"vmadc.vim {reg1}, {reg2}, {imm}, v0"),
"VMadc_vim");
}
TEST_F(AssemblerRISCV64Test, VMadc_vv) {
DriverStr(RepeatVVV(&Riscv64Assembler::VMadc_vv, "vmadc.vv {reg1}, {reg2}, {reg3}"), "VMadc_vv");
}
TEST_F(AssemblerRISCV64Test, VMadc_vx) {
DriverStr(RepeatVVR(&Riscv64Assembler::VMadc_vx, "vmadc.vx {reg1}, {reg2}, {reg3}"), "VMadc_vx");
}
TEST_F(AssemblerRISCV64Test, VMadc_vi) {
DriverStr(RepeatVVIb(&Riscv64Assembler::VMadc_vi,
/*imm_bits=*/ -5,
"vmadc.vi {reg1}, {reg2}, {imm}"),
"VMadc_vi");
}
TEST_F(AssemblerRISCV64Test, VSbc_vvm) {
DriverStr(RepeatVVVFiltered(&Riscv64Assembler::VSbc_vvm,
"vsbc.vvm {reg1}, {reg2}, {reg3}, v0",
SkipV0<VRegister, VRegister>()),
"VSbc_vvm");
}
TEST_F(AssemblerRISCV64Test, VSbc_vxm) {
DriverStr(RepeatVVRFiltered(&Riscv64Assembler::VSbc_vxm,
"vsbc.vxm {reg1}, {reg2}, {reg3}, v0",
SkipV0<VRegister, XRegister>()),
"VSbc_vxm");
}
TEST_F(AssemblerRISCV64Test, VMsbc_vvm) {
DriverStr(RepeatVVV(&Riscv64Assembler::VMsbc_vvm, "vmsbc.vvm {reg1}, {reg2}, {reg3}, v0"),
"VMsbc_vvm");
}
TEST_F(AssemblerRISCV64Test, VMsbc_vxm) {
DriverStr(RepeatVVR(&Riscv64Assembler::VMsbc_vxm, "vmsbc.vxm {reg1}, {reg2}, {reg3}, v0"),
"VMsbc_vxm");
}
TEST_F(AssemblerRISCV64Test, VMsbc_vv) {
DriverStr(RepeatVVV(&Riscv64Assembler::VMsbc_vv, "vmsbc.vv {reg1}, {reg2}, {reg3}"), "VMsbc_vvm");
}
TEST_F(AssemblerRISCV64Test, VMsbc_vx) {
DriverStr(RepeatVVR(&Riscv64Assembler::VMsbc_vx, "vmsbc.vx {reg1}, {reg2}, {reg3}"), "VMsbc_vxm");
}
TEST_F(AssemblerRISCV64Test, VMerge_vvm) {
DriverStr(RepeatVVVFiltered(&Riscv64Assembler::VMerge_vvm,
"vmerge.vvm {reg1}, {reg2}, {reg3}, v0",
SkipV0<VRegister, VRegister>()),
"VMerge_vvm");
}
TEST_F(AssemblerRISCV64Test, VMerge_vxm) {
DriverStr(RepeatVVRFiltered(&Riscv64Assembler::VMerge_vxm,
"vmerge.vxm {reg1}, {reg2}, {reg3}, v0",
SkipV0<VRegister, XRegister>()),
"VMerge_vxm");
}
TEST_F(AssemblerRISCV64Test, VMerge_vim) {
DriverStr(RepeatVVIFiltered(&Riscv64Assembler::VMerge_vim,
/*imm_bits=*/ -5,
"vmerge.vim {reg1}, {reg2}, {imm}, v0",
SkipV0<VRegister, int32_t>()),
"VMerge_vim");
}
TEST_F(AssemblerRISCV64Test, VMv_vv) {
DriverStr(RepeatVV(&Riscv64Assembler::VMv_vv, "vmv.v.v {reg1}, {reg2}"), "VMmv_vv");
}
TEST_F(AssemblerRISCV64Test, VMv_vx) {
DriverStr(RepeatVR(&Riscv64Assembler::VMv_vx, "vmv.v.x {reg1}, {reg2}"), "VMv_vx");
}
TEST_F(AssemblerRISCV64Test, VMv_vi) {
DriverStr(RepeatVIb(&Riscv64Assembler::VMv_vi, /*imm_bits=*/ -5, "vmv.v.i {reg}, {imm}"),
"VMv_vi");
}
TEST_F(AssemblerRISCV64Test, VMseq_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VMseq_vv,
"vmseq.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VMseq_vv");
}
TEST_F(AssemblerRISCV64Test, VMseq_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VMseq_vx,
"vmseq.vx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, XRegister>()),
"VMseq_vx");
}
TEST_F(AssemblerRISCV64Test, VMseq_vi) {
DriverStr(RepeatVVIbVmFiltered(&Riscv64Assembler::VMseq_vi,
/*imm_bits=*/ -5,
"vmseq.vi {reg1}, {reg2}, {imm}{vm}",
SkipV0Vm<VRegister, int32_t>()),
"VMseq_vi");
}
TEST_F(AssemblerRISCV64Test, VMsne_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VMsne_vv,
"vmsne.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VMsne_vv");
}
TEST_F(AssemblerRISCV64Test, VMsne_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VMsne_vx,
"vmsne.vx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, XRegister>()),
"VMsne_vx");
}
TEST_F(AssemblerRISCV64Test, VMsne_vi) {
DriverStr(RepeatVVIbVmFiltered(&Riscv64Assembler::VMsne_vi,
/*imm_bits=*/ -5,
"vmsne.vi {reg1}, {reg2}, {imm}{vm}",
SkipV0Vm<VRegister, int32_t>()),
"VMsne_vi");
}
TEST_F(AssemblerRISCV64Test, VMsltu_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VMsltu_vv,
"vmsltu.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VMsltu_vv");
}
TEST_F(AssemblerRISCV64Test, VMsltu_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VMsltu_vx,
"vmsltu.vx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, XRegister>()),
"VMsltu_vx");
}
TEST_F(AssemblerRISCV64Test, VMsgtu_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VMsgtu_vv,
"vmsgtu.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VMsgtu_vv");
}
TEST_F(AssemblerRISCV64Test, VMslt_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VMslt_vv,
"vmslt.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VMslt_vv");
}
TEST_F(AssemblerRISCV64Test, VMslt_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VMslt_vx,
"vmslt.vx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, XRegister>()),
"VMslt_vx");
}
TEST_F(AssemblerRISCV64Test, VMsgt_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VMsgt_vv,
"vmsgt.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VMsgt_vv");
}
TEST_F(AssemblerRISCV64Test, VMsleu_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VMsleu_vv,
"vmsleu.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VMsleu_vv");
}
TEST_F(AssemblerRISCV64Test, VMsleu_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VMsleu_vx,
"vmsleu.vx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, XRegister>()),
"VMsleu_vx");
}
TEST_F(AssemblerRISCV64Test, VMsleu_vi) {
DriverStr(RepeatVVIbVmFiltered(&Riscv64Assembler::VMsleu_vi,
/*imm_bits=*/ -5,
"vmsleu.vi {reg1}, {reg2}, {imm}{vm}",
SkipV0Vm<VRegister, int32_t>()),
"VMsleu_vi");
}
TEST_F(AssemblerRISCV64Test, VMsgeu_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VMsgeu_vv,
"vmsgeu.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VMsgeu_vv");
}
TEST_F(AssemblerRISCV64Test, VMsltu_vi) {
DriverStr(RepeatVVIbVmFiltered(&Riscv64Assembler::VMsltu_vi,
/*imm_bits=*/ 4,
"vmsltu.vi {reg1}, {reg2}, {imm}{vm}",
SkipV0Vm<VRegister, uint32_t>(),
/*bias=*/ 1),
"VMsltu_vi");
}
TEST_F(AssemblerRISCV64Test, VMsle_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VMsle_vv,
"vmsle.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VMsle_vv");
}
TEST_F(AssemblerRISCV64Test, VMsle_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VMsle_vx,
"vmsle.vx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, XRegister>()),
"VMsle_vx");
}
TEST_F(AssemblerRISCV64Test, VMsle_vi) {
DriverStr(RepeatVVIbVmFiltered(&Riscv64Assembler::VMsle_vi,
/*imm_bits=*/ -5,
"vmsle.vi {reg1}, {reg2}, {imm}{vm}",
SkipV0Vm<VRegister, int32_t>()),
"VMsle_vi");
}
TEST_F(AssemblerRISCV64Test, VMsge_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VMsge_vv,
"vmsge.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VMsge_vv");
}
TEST_F(AssemblerRISCV64Test, VMslt_vi) {
DriverStr(RepeatVVIbVmFiltered(&Riscv64Assembler::VMslt_vi,
/*imm_bits=*/ -5,
"vmslt.vi {reg1}, {reg2}, {imm}{vm}",
SkipV0Vm<VRegister, int32_t>(),
/*bias=*/ 1),
"VMslt_vi");
}
TEST_F(AssemblerRISCV64Test, VMsgtu_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VMsgtu_vx,
"vmsgtu.vx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, XRegister>()),
"VMsgtu_vx");
}
TEST_F(AssemblerRISCV64Test, VMsgtu_vi) {
DriverStr(RepeatVVIbVmFiltered(&Riscv64Assembler::VMsgtu_vi,
/*imm_bits=*/ -5,
"vmsgtu.vi {reg1}, {reg2}, {imm}{vm}",
SkipV0Vm<VRegister, int32_t>()),
"VMsgtu_vi");
}
TEST_F(AssemblerRISCV64Test, VMsgeu_vi) {
DriverStr(RepeatVVIbVmFiltered(&Riscv64Assembler::VMsgeu_vi,
/*imm_bits=*/ 4,
"vmsgeu.vi {reg1}, {reg2}, {imm}{vm}",
SkipV0Vm<VRegister, uint32_t>(),
/*bias=*/ 1),
"VMsgeu_vi");
}
TEST_F(AssemblerRISCV64Test, VMsgt_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VMsgt_vx,
"vmsgt.vx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, XRegister>()),
"VMsgt_vx");
}
TEST_F(AssemblerRISCV64Test, VMsgt_vi) {
DriverStr(RepeatVVIbVmFiltered(&Riscv64Assembler::VMsgt_vi,
/*imm_bits=*/ -5,
"vmsgt.vi {reg1}, {reg2}, {imm}{vm}",
SkipV0Vm<VRegister, int32_t>()),
"VMsgt_vi");
}
TEST_F(AssemblerRISCV64Test, VMsge_vi) {
DriverStr(RepeatVVIbVmFiltered(&Riscv64Assembler::VMsge_vi,
/*imm_bits=*/ -5,
"vmsge.vi {reg1}, {reg2}, {imm}{vm}",
SkipV0Vm<VRegister, int32_t>(),
/*bias=*/ 1),
"VMsge_vi");
}
TEST_F(AssemblerRISCV64Test, VSaddu_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VSaddu_vv,
"vsaddu.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VSaddu_vv");
}
TEST_F(AssemblerRISCV64Test, VSaddu_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VSaddu_vx,
"vsaddu.vx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, XRegister>()),
"VSaddu_vx");
}
TEST_F(AssemblerRISCV64Test, VSaddu_vi) {
DriverStr(RepeatVVIbVmFiltered(&Riscv64Assembler::VSaddu_vi,
/*imm_bits=*/ -5,
"vsaddu.vi {reg1}, {reg2}, {imm}{vm}",
SkipV0Vm<VRegister, int32_t>()),
"VSaddu_vi");
}
TEST_F(AssemblerRISCV64Test, VSadd_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VSadd_vv,
"vsadd.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VSadd_vv");
}
TEST_F(AssemblerRISCV64Test, VSadd_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VSadd_vx,
"vsadd.vx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, XRegister>()),
"VSadd_vx");
}
TEST_F(AssemblerRISCV64Test, VSadd_vi) {
DriverStr(RepeatVVIbVmFiltered(&Riscv64Assembler::VSadd_vi,
/*imm_bits=*/ -5,
"vsadd.vi {reg1}, {reg2}, {imm}{vm}",
SkipV0Vm<VRegister, int32_t>()),
"VSadd_vi");
}
TEST_F(AssemblerRISCV64Test, VSsubu_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VSsubu_vv,
"vssubu.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VSsubu_vv");
}
TEST_F(AssemblerRISCV64Test, VSsubu_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VSsubu_vx,
"vssubu.vx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, XRegister>()),
"VSsubu_vx");
}
TEST_F(AssemblerRISCV64Test, VSsub_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VSsub_vv,
"vssub.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VSsub_vv");
}
TEST_F(AssemblerRISCV64Test, VSsub_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VSsub_vx,
"vssub.vx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, XRegister>()),
"VSsub_vx");
}
TEST_F(AssemblerRISCV64Test, VSll_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VSll_vv,
"vsll.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VSll_vv");
}
TEST_F(AssemblerRISCV64Test, VSll_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VSll_vx,
"vsll.vx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, XRegister>()),
"VSll_vx");
}
TEST_F(AssemblerRISCV64Test, VSll_vi) {
DriverStr(RepeatVVIbVmFiltered(&Riscv64Assembler::VSll_vi,
/*imm_bits=*/ 5,
"vsll.vi {reg1}, {reg2}, {imm}{vm}",
SkipV0Vm<VRegister, uint32_t>()),
"VSll_vi");
}
TEST_F(AssemblerRISCV64Test, VSmul_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VSmul_vv,
"vsmul.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VSmul_vv");
}
TEST_F(AssemblerRISCV64Test, VSmul_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VSmul_vx,
"vsmul.vx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, XRegister>()),
"VSmul_vx");
}
TEST_F(AssemblerRISCV64Test, Vmv1r_v) {
DriverStr(RepeatVVAligned(&Riscv64Assembler::Vmv1r_v, /*alignment=*/ 1, "vmv1r.v {reg1}, {reg2}"),
"Vmv1r_v");
}
TEST_F(AssemblerRISCV64Test, Vmv2r_v) {
DriverStr(RepeatVVAligned(&Riscv64Assembler::Vmv2r_v, /*alignment=*/ 2, "vmv2r.v {reg1}, {reg2}"),
"Vmv2r_v");
}
TEST_F(AssemblerRISCV64Test, Vmv4r_v) {
DriverStr(RepeatVVAligned(&Riscv64Assembler::Vmv4r_v, /*alignment=*/ 4, "vmv4r.v {reg1}, {reg2}"),
"Vmv4r_v");
}
TEST_F(AssemblerRISCV64Test, Vmv8r_v) {
DriverStr(RepeatVVAligned(&Riscv64Assembler::Vmv8r_v, /*alignment=*/ 8, "vmv8r.v {reg1}, {reg2}"),
"Vmv8r_v");
}
TEST_F(AssemblerRISCV64Test, VSrl_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VSrl_vv,
"vsrl.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VSrl_vv");
}
TEST_F(AssemblerRISCV64Test, VSrl_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VSrl_vx,
"vsrl.vx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, XRegister>()),
"VSrl_vx");
}
TEST_F(AssemblerRISCV64Test, VSrl_vi) {
DriverStr(RepeatVVIbVmFiltered(&Riscv64Assembler::VSrl_vi,
/*imm_bits=*/ 5,
"vsrl.vi {reg1}, {reg2}, {imm}{vm}",
SkipV0Vm<VRegister, uint32_t>()),
"VSrl_vi");
}
TEST_F(AssemblerRISCV64Test, VSra_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VSra_vv,
"vsra.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VSra_vv");
}
TEST_F(AssemblerRISCV64Test, VSra_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VSra_vx,
"vsra.vx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, XRegister>()),
"VSra_vx");
}
TEST_F(AssemblerRISCV64Test, VSra_vi) {
DriverStr(RepeatVVIbVmFiltered(&Riscv64Assembler::VSra_vi,
/*imm_bits=*/ 5,
"vsra.vi {reg1}, {reg2}, {imm}{vm}",
SkipV0Vm<VRegister, uint32_t>()),
"VSra_vi");
}
TEST_F(AssemblerRISCV64Test, VSsrl_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VSsrl_vv,
"vssrl.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VSsrl_vv");
}
TEST_F(AssemblerRISCV64Test, VSsrl_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VSsrl_vx,
"vssrl.vx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, XRegister>()),
"VSsrl_vx");
}
TEST_F(AssemblerRISCV64Test, VSsrl_vi) {
DriverStr(RepeatVVIbVmFiltered(&Riscv64Assembler::VSsrl_vi,
/*imm_bits=*/ 5,
"vssrl.vi {reg1}, {reg2}, {imm}{vm}",
SkipV0Vm<VRegister, uint32_t>()),
"VSsrl_vi");
}
TEST_F(AssemblerRISCV64Test, VSsra_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VSsra_vv,
"vssra.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VSsra_vv");
}
TEST_F(AssemblerRISCV64Test, VSsra_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VSsra_vx,
"vssra.vx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, XRegister>()),
"VSsra_vx");
}
TEST_F(AssemblerRISCV64Test, VSsra_vi) {
DriverStr(RepeatVVIbVmFiltered(&Riscv64Assembler::VSsra_vi,
/*imm_bits=*/ 5,
"vssra.vi {reg1}, {reg2}, {imm}{vm}",
SkipV0Vm<VRegister, uint32_t>()),
"VSsra_vi");
}
TEST_F(AssemblerRISCV64Test, VNsrl_wv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VNsrl_wv,
"vnsrl.wv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VNsrl_wv");
}
TEST_F(AssemblerRISCV64Test, VNsrl_wx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VNsrl_wx,
"vnsrl.wx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, XRegister>()),
"VNsrl_wx");
}
TEST_F(AssemblerRISCV64Test, VNsrl_wi) {
DriverStr(RepeatVVIbVmFiltered(&Riscv64Assembler::VNsrl_wi,
/*imm_bits=*/ 5,
"vnsrl.wi {reg1}, {reg2}, {imm}{vm}",
SkipV0Vm<VRegister, uint32_t>()),
"VNsrl_wi");
}
TEST_F(AssemblerRISCV64Test, VNcvt_x_x_w) {
DriverStr(
RepeatVVVmFiltered(
&Riscv64Assembler::VNcvt_x_x_w, "vncvt.x.x.w {reg1}, {reg2}{vm}", SkipV0Vm<VRegister>()),
"VNcvt_x_x_w");
}
TEST_F(AssemblerRISCV64Test, VNsra_wv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VNsra_wv,
"vnsra.wv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VNsra_wv");
}
TEST_F(AssemblerRISCV64Test, VNsra_wx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VNsra_wx,
"vnsra.wx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, XRegister>()),
"VNsra_wx");
}
TEST_F(AssemblerRISCV64Test, VNsra_wi) {
DriverStr(RepeatVVIbVmFiltered(&Riscv64Assembler::VNsra_wi,
/*imm_bits=*/ 5,
"vnsra.wi {reg1}, {reg2}, {imm}{vm}",
SkipV0Vm<VRegister, uint32_t>()),
"VNsra_wi");
}
TEST_F(AssemblerRISCV64Test, VNclipu_wv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VNclipu_wv,
"vnclipu.wv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VNclipu_wv");
}
TEST_F(AssemblerRISCV64Test, VNclipu_wx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VNclipu_wx,
"vnclipu.wx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, XRegister>()),
"VNclipu_wx");
}
TEST_F(AssemblerRISCV64Test, VNclipu_wi) {
DriverStr(RepeatVVIbVmFiltered(&Riscv64Assembler::VNclipu_wi,
/*imm_bits=*/ 5,
"vnclipu.wi {reg1}, {reg2}, {imm}{vm}",
SkipV0Vm<VRegister, uint32_t>()),
"VNclipu_wi");
}
TEST_F(AssemblerRISCV64Test, VNclip_wv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VNclip_wv,
"vnclip.wv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VNclip_wv");
}
TEST_F(AssemblerRISCV64Test, VNclip_wx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VNclip_wx,
"vnclip.wx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, XRegister>()),
"VNclip_wx");
}
TEST_F(AssemblerRISCV64Test, VNclip_wi) {
DriverStr(RepeatVVIbVmFiltered(&Riscv64Assembler::VNclip_wi,
/*imm_bits=*/ 5,
"vnclip.wi {reg1}, {reg2}, {imm}{vm}",
SkipV0Vm<VRegister, uint32_t>()),
"VNclip_wi");
}
TEST_F(AssemblerRISCV64Test, VWredsumu_vs) {
DriverStr(RepeatVVVVm(&Riscv64Assembler::VWredsumu_vs, "vwredsumu.vs {reg1}, {reg2}, {reg3}{vm}"),
"VWredsumu_vs");
}
TEST_F(AssemblerRISCV64Test, VWredsum_vs) {
DriverStr(RepeatVVVVm(&Riscv64Assembler::VWredsum_vs, "vwredsum.vs {reg1}, {reg2}, {reg3}{vm}"),
"VWredsum_vs");
}
TEST_F(AssemblerRISCV64Test, VRedsum_vs) {
DriverStr(RepeatVVVVm(&Riscv64Assembler::VRedsum_vs, "vredsum.vs {reg1}, {reg2}, {reg3}{vm}"),
"VRedsum_vs");
}
TEST_F(AssemblerRISCV64Test, VRedand_vs) {
DriverStr(RepeatVVVVm(&Riscv64Assembler::VRedand_vs, "vredand.vs {reg1}, {reg2}, {reg3}{vm}"),
"VRedand_vs");
}
TEST_F(AssemblerRISCV64Test, VRedor_vs) {
DriverStr(RepeatVVVVm(&Riscv64Assembler::VRedor_vs, "vredor.vs {reg1}, {reg2}, {reg3}{vm}"),
"VRedor_vs");
}
TEST_F(AssemblerRISCV64Test, VRedxor_vs) {
DriverStr(RepeatVVVVm(&Riscv64Assembler::VRedxor_vs, "vredxor.vs {reg1}, {reg2}, {reg3}{vm}"),
"VRedxor_vs");
}
TEST_F(AssemblerRISCV64Test, VRedminu_vs) {
DriverStr(RepeatVVVVm(&Riscv64Assembler::VRedminu_vs, "vredminu.vs {reg1}, {reg2}, {reg3}{vm}"),
"VRedminu_vs");
}
TEST_F(AssemblerRISCV64Test, VRedmin_vs) {
DriverStr(RepeatVVVVm(&Riscv64Assembler::VRedmin_vs, "vredmin.vs {reg1}, {reg2}, {reg3}{vm}"),
"VRedmin_vs");
}
TEST_F(AssemblerRISCV64Test, VRedmaxu_vs) {
DriverStr(RepeatVVVVm(&Riscv64Assembler::VRedmaxu_vs, "vredmaxu.vs {reg1}, {reg2}, {reg3}{vm}"),
"VRedmaxu_vs");
}
TEST_F(AssemblerRISCV64Test, VRedmax_vs) {
DriverStr(RepeatVVVVm(&Riscv64Assembler::VRedmax_vs, "vredmax.vs {reg1}, {reg2}, {reg3}{vm}"),
"VRedmax_vs");
}
TEST_F(AssemblerRISCV64Test, VAaddu_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VAaddu_vv,
"vaaddu.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VAaddu_vv");
}
TEST_F(AssemblerRISCV64Test, VAaddu_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VAaddu_vx,
"vaaddu.vx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, XRegister>()),
"VAaddu_vx");
}
TEST_F(AssemblerRISCV64Test, VAadd_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VAadd_vv,
"vaadd.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VAadd_vv");
}
TEST_F(AssemblerRISCV64Test, VAadd_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VAadd_vx,
"vaadd.vx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, XRegister>()),
"VAadd_vx");
}
TEST_F(AssemblerRISCV64Test, VAsubu_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VAsubu_vv,
"vasubu.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VAsubu_vv");
}
TEST_F(AssemblerRISCV64Test, VAsubu_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VAsubu_vx,
"vasubu.vx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, XRegister>()),
"VAsubu_vx");
}
TEST_F(AssemblerRISCV64Test, VAsub_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VAsub_vv,
"vasub.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VAsub_vv");
}
TEST_F(AssemblerRISCV64Test, VAsub_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VAsub_vx,
"vasub.vx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, XRegister>()),
"VAsub_vx");
}
TEST_F(AssemblerRISCV64Test, VSlide1up_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VSlide1up_vx,
"vslide1up.vx {reg1}, {reg2}, {reg3}{vm}",
VXVVmSkipV0VmAndNoR1R2Overlap<XRegister>()),
"VSlide1up_vx");
}
TEST_F(AssemblerRISCV64Test, VSlide1down_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VSlide1down_vx,
"vslide1down.vx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, XRegister>()),
"VSlide1down_vx");
}
TEST_F(AssemblerRISCV64Test, VCompress_vm) {
DriverStr(RepeatVVVFiltered(&Riscv64Assembler::VCompress_vm,
"vcompress.vm {reg1}, {reg2}, {reg3}",
VVVNoR1R2R3Overlap()),
"VCompress_vm");
}
TEST_F(AssemblerRISCV64Test, VMandn_mm) {
DriverStr(RepeatVVV(&Riscv64Assembler::VMandn_mm, "vmandn.mm {reg1}, {reg2}, {reg3}"),
"VMandn_mm");
}
TEST_F(AssemblerRISCV64Test, VMand_mm) {
DriverStr(RepeatVVV(&Riscv64Assembler::VMand_mm, "vmand.mm {reg1}, {reg2}, {reg3}"), "VMand_mm");
}
TEST_F(AssemblerRISCV64Test, VMmv_m) {
DriverStr(RepeatVV(&Riscv64Assembler::VMmv_m, "vmmv.m {reg1}, {reg2}"), "VMmv_m");
}
TEST_F(AssemblerRISCV64Test, VMor_mm) {
DriverStr(RepeatVVV(&Riscv64Assembler::VMor_mm, "vmor.mm {reg1}, {reg2}, {reg3}"), "VMor_mm");
}
TEST_F(AssemblerRISCV64Test, VMxor_mm) {
DriverStr(RepeatVVV(&Riscv64Assembler::VMxor_mm, "vmxor.mm {reg1}, {reg2}, {reg3}"), "VMxor_mm");
}
TEST_F(AssemblerRISCV64Test, VMclr_m) {
DriverStr(RepeatV(&Riscv64Assembler::VMclr_m, "vmclr.m {reg}"), "VMclr_m");
}
TEST_F(AssemblerRISCV64Test, VMorn_mm) {
DriverStr(RepeatVVV(&Riscv64Assembler::VMorn_mm, "vmorn.mm {reg1}, {reg2}, {reg3}"), "VMorn_mm");
}
TEST_F(AssemblerRISCV64Test, VMnand_mm) {
DriverStr(RepeatVVV(&Riscv64Assembler::VMnand_mm, "vmnand.mm {reg1}, {reg2}, {reg3}"),
"VMnand_m");
}
TEST_F(AssemblerRISCV64Test, VMnot_m) {
DriverStr(RepeatVV(&Riscv64Assembler::VMnot_m, "vmnot.m {reg1}, {reg2}"), "VMnot_m");
}
TEST_F(AssemblerRISCV64Test, VMnor_mm) {
DriverStr(RepeatVVV(&Riscv64Assembler::VMnor_mm, "vmnor.mm {reg1}, {reg2}, {reg3}"), "VMnor_mm");
}
TEST_F(AssemblerRISCV64Test, VMxnor_mm) {
DriverStr(RepeatVVV(&Riscv64Assembler::VMxnor_mm, "vmxnor.mm {reg1}, {reg2}, {reg3}"),
"VMxnor_mm");
}
TEST_F(AssemblerRISCV64Test, VMset_m) {
DriverStr(RepeatV(&Riscv64Assembler::VMset_m, "vmset.m {reg}"), "VMset_m");
}
TEST_F(AssemblerRISCV64Test, VDivu_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VDivu_vv,
"vdivu.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VDivu_vv");
}
TEST_F(AssemblerRISCV64Test, VDivu_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VDivu_vx,
"vdivu.vx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, XRegister>()),
"VDivu_vx");
}
TEST_F(AssemblerRISCV64Test, VDiv_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VDiv_vv,
"vdiv.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VDiv_vv");
}
TEST_F(AssemblerRISCV64Test, VDiv_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VDiv_vx,
"vdiv.vx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, XRegister>()),
"VDiv_vx");
}
TEST_F(AssemblerRISCV64Test, VRemu_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VRemu_vv,
"vremu.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VRemu_vv");
}
TEST_F(AssemblerRISCV64Test, VRemu_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VRemu_vx,
"vremu.vx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, XRegister>()),
"VRemu_vx");
}
TEST_F(AssemblerRISCV64Test, VRem_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VRem_vv,
"vrem.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VRem_vv");
}
TEST_F(AssemblerRISCV64Test, VRem_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VRem_vx,
"vrem.vx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, XRegister>()),
"VRem_vx");
}
TEST_F(AssemblerRISCV64Test, VMulhu_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VMulhu_vv,
"vmulhu.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VMulhu_vv");
}
TEST_F(AssemblerRISCV64Test, VMulhu_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VMulhu_vx,
"vmulhu.vx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, XRegister>()),
"VMulhu_vx");
}
TEST_F(AssemblerRISCV64Test, VMul_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VMul_vv,
"vmul.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VMul_vv");
}
TEST_F(AssemblerRISCV64Test, VMul_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VMul_vx,
"vmul.vx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, XRegister>()),
"VMul_vx");
}
TEST_F(AssemblerRISCV64Test, VMulhsu_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VMulhsu_vv,
"vmulhsu.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VMulhsu_vv");
}
TEST_F(AssemblerRISCV64Test, VMulhsu_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VMulhsu_vx,
"vmulhsu.vx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, XRegister>()),
"VMulhsu_vx");
}
TEST_F(AssemblerRISCV64Test, VMulh_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VMulh_vv,
"vmulh.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VMulh_vv");
}
TEST_F(AssemblerRISCV64Test, VMulh_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VMulh_vx,
"vmulh.vx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, XRegister>()),
"VMulh_vx");
}
TEST_F(AssemblerRISCV64Test, VMadd_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VMadd_vv,
"vmadd.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VMadd_vv");
}
TEST_F(AssemblerRISCV64Test, VMadd_vx) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VMadd_vx,
"vmadd.vx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VMadd_vx");
}
TEST_F(AssemblerRISCV64Test, VNmsub_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VNmsub_vv,
"vnmsub.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VNmsub_vv");
}
TEST_F(AssemblerRISCV64Test, VNmsub_vx) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VNmsub_vx,
"vnmsub.vx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VNmsub_vx");
}
TEST_F(AssemblerRISCV64Test, VMacc_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VMacc_vv,
"vmacc.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VMacc_vv");
}
TEST_F(AssemblerRISCV64Test, VMacc_vx) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VMacc_vx,
"vmacc.vx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VMacc_vx");
}
TEST_F(AssemblerRISCV64Test, VNmsac_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VNmsac_vv,
"vnmsac.vv {reg1}, {reg2}, {reg3}{vm}",
VXVVmSkipV0VmAndNoR1R2R3Overlap()),
"VNmsac_vv");
}
TEST_F(AssemblerRISCV64Test, VNmsac_vx) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VNmsac_vx,
"vnmsac.vx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<XRegister, VRegister>()),
"VNmsac_vx");
}
TEST_F(AssemblerRISCV64Test, VWaddu_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VWaddu_vv,
"vwaddu.vv {reg1}, {reg2}, {reg3}{vm}",
VXVVmSkipV0VmAndNoR1R2R3Overlap()),
"VWaddu_vv");
}
TEST_F(AssemblerRISCV64Test, VWaddu_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VWaddu_vx,
"vwaddu.vx {reg1}, {reg2}, {reg3}{vm}",
VXVVmSkipV0VmAndNoR1R2Overlap<XRegister>()),
"VWaddu_vx");
}
TEST_F(AssemblerRISCV64Test, VWcvtu_x_x_v) {
DriverStr(RepeatVVVmFiltered(&Riscv64Assembler::VWcvtu_x_x_v,
"vwcvtu.x.x.v {reg1}, {reg2}{vm}",
VVVmSkipV0VmAndNoR1R2Overlap()),
"VWcvtu_x_x_v");
}
TEST_F(AssemblerRISCV64Test, VWadd_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VWadd_vv,
"vwadd.vv {reg1}, {reg2}, {reg3}{vm}",
VXVVmSkipV0VmAndNoR1R2R3Overlap()),
"VWadd_vv");
}
TEST_F(AssemblerRISCV64Test, VWadd_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VWadd_vx,
"vwadd.vx {reg1}, {reg2}, {reg3}{vm}",
VXVVmSkipV0VmAndNoR1R2Overlap<XRegister>()),
"VWadd_vx");
}
TEST_F(AssemblerRISCV64Test, VWcvt_x_x_v) {
DriverStr(RepeatVVVmFiltered(&Riscv64Assembler::VWcvt_x_x_v,
"vwcvt.x.x.v {reg1}, {reg2}{vm}",
VVVmSkipV0VmAndNoR1R2Overlap()),
"VWcvt_x_x_v");
}
TEST_F(AssemblerRISCV64Test, VWsubu_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VWsubu_vv,
"vwsubu.vv {reg1}, {reg2}, {reg3}{vm}",
VXVVmSkipV0VmAndNoR1R2R3Overlap()),
"VWsubu_vv");
}
TEST_F(AssemblerRISCV64Test, VWsubu_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VWsubu_vx,
"vwsubu.vx {reg1}, {reg2}, {reg3}{vm}",
VXVVmSkipV0VmAndNoR1R2Overlap<XRegister>()),
"VWsubu_vx");
}
TEST_F(AssemblerRISCV64Test, VWsub_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VWsub_vv,
"vwsub.vv {reg1}, {reg2}, {reg3}{vm}",
VXVVmSkipV0VmAndNoR1R2R3Overlap()),
"VWsub_vv");
}
TEST_F(AssemblerRISCV64Test, VWsub_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VWsub_vx,
"vwsub.vx {reg1}, {reg2}, {reg3}{vm}",
VXVVmSkipV0VmAndNoR1R2Overlap<XRegister>()),
"VWsub_vx");
}
TEST_F(AssemblerRISCV64Test, VWaddu_wv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VWaddu_wv,
"vwaddu.wv {reg1}, {reg2}, {reg3}{vm}",
VXVVmSkipV0VmAndNoR1R3Overlap<VRegister>()),
"VWaddu_wv");
}
TEST_F(AssemblerRISCV64Test, VWaddu_wx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VWaddu_wx,
"vwaddu.wx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, XRegister>()),
"VWaddu_wx");
}
TEST_F(AssemblerRISCV64Test, VWadd_wv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VWadd_wv,
"vwadd.wv {reg1}, {reg2}, {reg3}{vm}",
VXVVmSkipV0VmAndNoR1R3Overlap<VRegister>()),
"VWadd_wv");
}
TEST_F(AssemblerRISCV64Test, VWadd_wx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VWadd_wx,
"vwadd.wx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, XRegister>()),
"VWadd_wx");
}
TEST_F(AssemblerRISCV64Test, VWsubu_wv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VWsubu_wv,
"vwsubu.wv {reg1}, {reg2}, {reg3}{vm}",
VXVVmSkipV0VmAndNoR1R3Overlap<VRegister>()),
"VWsubu_wv");
}
TEST_F(AssemblerRISCV64Test, VWsubu_wx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VWsubu_wx,
"vwsubu.wx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, XRegister>()),
"VWsubu_wx");
}
TEST_F(AssemblerRISCV64Test, VWsub_wv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VWsub_wv,
"vwsub.wv {reg1}, {reg2}, {reg3}{vm}",
VXVVmSkipV0VmAndNoR1R3Overlap<VRegister>()),
"VWsub_wv");
}
TEST_F(AssemblerRISCV64Test, VWsub_wx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VWsub_wx,
"vwsub.wx {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, XRegister>()),
"VWsub_wx");
}
TEST_F(AssemblerRISCV64Test, VWmulu_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VWmulu_vv,
"vwmulu.vv {reg1}, {reg2}, {reg3}{vm}",
VXVVmSkipV0VmAndNoR1R2R3Overlap()),
"VWmulu_vv");
}
TEST_F(AssemblerRISCV64Test, VWmulu_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VWmulu_vx,
"vwmulu.vx {reg1}, {reg2}, {reg3}{vm}",
VXVVmSkipV0VmAndNoR1R2Overlap<XRegister>()),
"VWmulu_vx");
}
TEST_F(AssemblerRISCV64Test, VWmulsu_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VWmulsu_vv,
"vwmulsu.vv {reg1}, {reg2}, {reg3}{vm}",
VXVVmSkipV0VmAndNoR1R2R3Overlap()),
"VWmulsu_vv");
}
TEST_F(AssemblerRISCV64Test, VWmulsu_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VWmulsu_vx,
"vwmulsu.vx {reg1}, {reg2}, {reg3}{vm}",
VXVVmSkipV0VmAndNoR1R2Overlap<XRegister>()),
"VWmulsu_vx");
}
TEST_F(AssemblerRISCV64Test, VWmul_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VWmul_vv,
"vwmul.vv {reg1}, {reg2}, {reg3}{vm}",
VXVVmSkipV0VmAndNoR1R2R3Overlap()),
"VWmul_vv");
}
TEST_F(AssemblerRISCV64Test, VWmul_vx) {
DriverStr(RepeatVVRVmFiltered(&Riscv64Assembler::VWmul_vx,
"vwmul.vx {reg1}, {reg2}, {reg3}{vm}",
VXVVmSkipV0VmAndNoR1R2Overlap<XRegister>()),
"VWmul_vx");
}
TEST_F(AssemblerRISCV64Test, VWmaccu_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VWmaccu_vv,
"vwmaccu.vv {reg1}, {reg2}, {reg3}{vm}",
VXVVmSkipV0VmAndNoR1R2R3Overlap()),
"VWmaccu_vv");
}
TEST_F(AssemblerRISCV64Test, VWmaccu_vx) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VWmaccu_vx,
"vwmaccu.vx {reg1}, {reg2}, {reg3}{vm}",
VXVVmSkipV0VmAndNoR1R3Overlap<XRegister>()),
"VWmaccu_vx");
}
TEST_F(AssemblerRISCV64Test, VWmacc_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VWmacc_vv,
"vwmacc.vv {reg1}, {reg2}, {reg3}{vm}",
VXVVmSkipV0VmAndNoR1R2R3Overlap()),
"VWmacc_vv");
}
TEST_F(AssemblerRISCV64Test, VWmacc_vx) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VWmacc_vx,
"vwmacc.vx {reg1}, {reg2}, {reg3}{vm}",
VXVVmSkipV0VmAndNoR1R3Overlap<XRegister>()),
"VWmacc_vx");
}
TEST_F(AssemblerRISCV64Test, VWmaccus_vx) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VWmaccus_vx,
"vwmaccus.vx {reg1}, {reg2}, {reg3}{vm}",
VXVVmSkipV0VmAndNoR1R3Overlap<XRegister>()),
"VWmaccus_vx");
}
TEST_F(AssemblerRISCV64Test, VWmaccsu_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VWmaccsu_vv,
"vwmaccsu.vv {reg1}, {reg2}, {reg3}{vm}",
VXVVmSkipV0VmAndNoR1R2R3Overlap()),
"VWmaccsu_vv");
}
TEST_F(AssemblerRISCV64Test, VWmaccsu_vx) {
DriverStr(RepeatVRVVmFiltered(&Riscv64Assembler::VWmaccsu_vx,
"vwmaccsu.vx {reg1}, {reg2}, {reg3}{vm}",
VXVVmSkipV0VmAndNoR1R3Overlap<XRegister>()),
"VWmaccsu_vx");
}
TEST_F(AssemblerRISCV64Test, VFadd_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VFadd_vv,
"vfadd.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VFadd_vv");
}
TEST_F(AssemblerRISCV64Test, VFadd_vf) {
DriverStr(RepeatVVFVmFiltered(&Riscv64Assembler::VFadd_vf,
"vfadd.vf {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, FRegister>()),
"VFadd_vf");
}
TEST_F(AssemblerRISCV64Test, VFredusum_vs) {
DriverStr(RepeatVVVVm(&Riscv64Assembler::VFredusum_vs, "vfredusum.vs {reg1}, {reg2}, {reg3}{vm}"),
"VFredusum_vs");
}
TEST_F(AssemblerRISCV64Test, VFsub_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VFsub_vv,
"vfsub.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VFsub_vv");
}
TEST_F(AssemblerRISCV64Test, VFsub_vf) {
DriverStr(RepeatVVFVmFiltered(&Riscv64Assembler::VFsub_vf,
"vfsub.vf {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, FRegister>()),
"VFsub_vf");
}
TEST_F(AssemblerRISCV64Test, VFredosum_vs) {
DriverStr(RepeatVVVVm(&Riscv64Assembler::VFredosum_vs, "vfredosum.vs {reg1}, {reg2}, {reg3}{vm}"),
"VFredosum_vs");
}
TEST_F(AssemblerRISCV64Test, VFmin_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VFmin_vv,
"vfmin.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VFmin_vv");
}
TEST_F(AssemblerRISCV64Test, VFmin_vf) {
DriverStr(RepeatVVFVmFiltered(&Riscv64Assembler::VFmin_vf,
"vfmin.vf {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, FRegister>()),
"VFmin_vf");
}
TEST_F(AssemblerRISCV64Test, VFredmin_vs) {
DriverStr(RepeatVVVVm(&Riscv64Assembler::VFredmin_vs, "vfredmin.vs {reg1}, {reg2}, {reg3}{vm}"),
"VFredmin_vs");
}
TEST_F(AssemblerRISCV64Test, VFmax_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VFmax_vv,
"vfmax.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VFmax_vv");
}
TEST_F(AssemblerRISCV64Test, VFmax_vf) {
DriverStr(RepeatVVFVmFiltered(&Riscv64Assembler::VFmax_vf,
"vfmax.vf {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, FRegister>()),
"VFmax_vf");
}
TEST_F(AssemblerRISCV64Test, VFredmax_vs) {
DriverStr(RepeatVVVVm(&Riscv64Assembler::VFredmax_vs, "vfredmax.vs {reg1}, {reg2}, {reg3}{vm}"),
"VFredmax_vs");
}
TEST_F(AssemblerRISCV64Test, VFsgnj_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VFsgnj_vv,
"vfsgnj.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VFsgnj_vv");
}
TEST_F(AssemblerRISCV64Test, VFsgnj_vf) {
DriverStr(RepeatVVFVmFiltered(&Riscv64Assembler::VFsgnj_vf,
"vfsgnj.vf {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, FRegister>()),
"VFsgnj_vf");
}
TEST_F(AssemblerRISCV64Test, VFsgnjn_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VFsgnjn_vv,
"vfsgnjn.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VFsgnjn_vv");
}
TEST_F(AssemblerRISCV64Test, VFsgnjn_vf) {
DriverStr(RepeatVVFVmFiltered(&Riscv64Assembler::VFsgnjn_vf,
"vfsgnjn.vf {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, FRegister>()),
"VFsgnjn_vf");
}
TEST_F(AssemblerRISCV64Test, VFneg_v) {
DriverStr(RepeatVV(&Riscv64Assembler::VFneg_v, "vfneg.v {reg1}, {reg2}"), "VFneg_v");
}
TEST_F(AssemblerRISCV64Test, VFsgnjx_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VFsgnjx_vv,
"vfsgnjx.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VFsgnjx_vv");
}
TEST_F(AssemblerRISCV64Test, VFsgnjx_vf) {
DriverStr(RepeatVVFVmFiltered(&Riscv64Assembler::VFsgnjx_vf,
"vfsgnjx.vf {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, FRegister>()),
"VFsgnjx_vf");
}
TEST_F(AssemblerRISCV64Test, VFabs_v) {
DriverStr(RepeatVV(&Riscv64Assembler::VFabs_v, "vfabs.v {reg1}, {reg2}"), "VFabs_v");
}
TEST_F(AssemblerRISCV64Test, VFslide1up_vf) {
DriverStr(RepeatVVFVmFiltered(&Riscv64Assembler::VFslide1up_vf,
"vfslide1up.vf {reg1}, {reg2}, {reg3}{vm}",
VXVVmSkipV0VmAndNoR1R2Overlap<FRegister>()),
"VFslide1up_vf");
}
TEST_F(AssemblerRISCV64Test, VFslide1down_vf) {
DriverStr(RepeatVVFVmFiltered(&Riscv64Assembler::VFslide1down_vf,
"vfslide1down.vf {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, FRegister>()),
"VFslide1down_vf");
}
TEST_F(AssemblerRISCV64Test, VFmerge_vfm) {
DriverStr(RepeatVVFFiltered(&Riscv64Assembler::VFmerge_vfm,
"vfmerge.vfm {reg1}, {reg2}, {reg3}, v0",
SkipV0<VRegister, FRegister>()),
"VFmerge_vfm");
}
TEST_F(AssemblerRISCV64Test, VFmv_v_f) {
DriverStr(RepeatVF(&Riscv64Assembler::VFmv_v_f, "vfmv.v.f {reg1}, {reg2}"), "VFmv_v_f");
}
TEST_F(AssemblerRISCV64Test, VMfeq_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VMfeq_vv,
"vmfeq.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VMfeq_vv");
}
TEST_F(AssemblerRISCV64Test, VMfeq_vf) {
DriverStr(RepeatVVFVmFiltered(&Riscv64Assembler::VMfeq_vf,
"vmfeq.vf {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, FRegister>()),
"VMfeq_vf");
}
TEST_F(AssemblerRISCV64Test, VMfle_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VMfle_vv,
"vmfle.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VMfle_vv");
}
TEST_F(AssemblerRISCV64Test, VMfle_vf) {
DriverStr(RepeatVVFVmFiltered(&Riscv64Assembler::VMfle_vf,
"vmfle.vf {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, FRegister>()),
"VMfle_vf");
}
TEST_F(AssemblerRISCV64Test, VMfge_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VMfge_vv,
"vmfge.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VMfge_vv");
}
TEST_F(AssemblerRISCV64Test, VMflt_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VMflt_vv,
"vmflt.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VMflt_vv");
}
TEST_F(AssemblerRISCV64Test, VMflt_vf) {
DriverStr(RepeatVVFVmFiltered(&Riscv64Assembler::VMflt_vf,
"vmflt.vf {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, FRegister>()),
"VMflt_vf");
}
TEST_F(AssemblerRISCV64Test, VMfgt_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VMfgt_vv,
"vmfgt.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VMfgt_vv");
}
TEST_F(AssemblerRISCV64Test, VMfne_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VMfne_vv,
"vmfne.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VMfne_vv");
}
TEST_F(AssemblerRISCV64Test, VMfne_vf) {
DriverStr(RepeatVVFVmFiltered(&Riscv64Assembler::VMfne_vf,
"vmfne.vf {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, FRegister>()),
"VMfne_vf");
}
TEST_F(AssemblerRISCV64Test, VMfgt_vf) {
DriverStr(RepeatVVFVmFiltered(&Riscv64Assembler::VMfgt_vf,
"vmfgt.vf {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, FRegister>()),
"VMfgt_vf");
}
TEST_F(AssemblerRISCV64Test, VMfge_vf) {
DriverStr(RepeatVVFVmFiltered(&Riscv64Assembler::VMfge_vf,
"vmfge.vf {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, FRegister>()),
"VMfge_vf");
}
TEST_F(AssemblerRISCV64Test, VFdiv_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VFdiv_vv,
"vfdiv.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VFdiv_vv");
}
TEST_F(AssemblerRISCV64Test, VFdiv_vf) {
DriverStr(RepeatVVFVmFiltered(&Riscv64Assembler::VFdiv_vf,
"vfdiv.vf {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, FRegister>()),
"VFdiv_vf");
}
TEST_F(AssemblerRISCV64Test, VFrdiv_vf) {
DriverStr(RepeatVVFVmFiltered(&Riscv64Assembler::VFrdiv_vf,
"vfrdiv.vf {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, FRegister>()),
"VFrdiv_vf");
}
TEST_F(AssemblerRISCV64Test, VFmul_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VFmul_vv,
"vfmul.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VFmul_vv");
}
TEST_F(AssemblerRISCV64Test, VFmul_vf) {
DriverStr(RepeatVVFVmFiltered(&Riscv64Assembler::VFmul_vf,
"vfmul.vf {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, FRegister>()),
"VFmul_vf");
}
TEST_F(AssemblerRISCV64Test, VFrsub_vf) {
DriverStr(RepeatVVFVmFiltered(&Riscv64Assembler::VFrsub_vf,
"vfrsub.vf {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, FRegister>()),
"VFrsub_vf");
}
TEST_F(AssemblerRISCV64Test, VFmadd_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VFmadd_vv,
"vfmadd.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VFmadd_vv");
}
TEST_F(AssemblerRISCV64Test, VFmadd_vf) {
DriverStr(RepeatVFVVmFiltered(&Riscv64Assembler::VFmadd_vf,
"vfmadd.vf {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<FRegister, VRegister>()),
"VFmadd_vf");
}
TEST_F(AssemblerRISCV64Test, VFnmadd_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VFnmadd_vv,
"vfnmadd.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VFnmadd_vv");
}
TEST_F(AssemblerRISCV64Test, VFnmadd_vf) {
DriverStr(RepeatVFVVmFiltered(&Riscv64Assembler::VFnmadd_vf,
"vfnmadd.vf {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<FRegister, VRegister>()),
"VFnmadd_vf");
}
TEST_F(AssemblerRISCV64Test, VFmsub_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VFmsub_vv,
"vfmsub.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VFmsub_vv");
}
TEST_F(AssemblerRISCV64Test, VFmsub_vf) {
DriverStr(RepeatVFVVmFiltered(&Riscv64Assembler::VFmsub_vf,
"vfmsub.vf {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<FRegister, VRegister>()),
"VFmsub_vf");
}
TEST_F(AssemblerRISCV64Test, VFnmsub_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VFnmsub_vv,
"vfnmsub.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VFnmsub_vv");
}
TEST_F(AssemblerRISCV64Test, VFnmsub_vf) {
DriverStr(RepeatVFVVmFiltered(&Riscv64Assembler::VFnmsub_vf,
"vfnmsub.vf {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<FRegister, VRegister>()),
"VFnmsub_vf");
}
TEST_F(AssemblerRISCV64Test, VFmacc_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VFmacc_vv,
"vfmacc.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VFmacc_vv");
}
TEST_F(AssemblerRISCV64Test, VFmacc_vf) {
DriverStr(RepeatVFVVmFiltered(&Riscv64Assembler::VFmacc_vf,
"vfmacc.vf {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<FRegister, VRegister>()),
"VFmacc_vf");
}
TEST_F(AssemblerRISCV64Test, VFnmacc_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VFnmacc_vv,
"vfnmacc.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VFnmacc_vv");
}
TEST_F(AssemblerRISCV64Test, VFnmacc_vf) {
DriverStr(RepeatVFVVmFiltered(&Riscv64Assembler::VFnmacc_vf,
"vfnmacc.vf {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<FRegister, VRegister>()),
"VFnmacc_vf");
}
TEST_F(AssemblerRISCV64Test, VFmsac_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VFmsac_vv,
"vfmsac.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VFmsac_vv");
}
TEST_F(AssemblerRISCV64Test, VFmsac_vf) {
DriverStr(RepeatVFVVmFiltered(&Riscv64Assembler::VFmsac_vf,
"vfmsac.vf {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<FRegister, VRegister>()),
"VFmsac_vf");
}
TEST_F(AssemblerRISCV64Test, VFnmsac_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VFnmsac_vv,
"vfnmsac.vv {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VFnmsac_vv");
}
TEST_F(AssemblerRISCV64Test, VFnmsac_vf) {
DriverStr(RepeatVFVVmFiltered(&Riscv64Assembler::VFnmsac_vf,
"vfnmsac.vf {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<FRegister, VRegister>()),
"VFnmsac_vf");
}
TEST_F(AssemblerRISCV64Test, VFwadd_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VFwadd_vv,
"vfwadd.vv {reg1}, {reg2}, {reg3}{vm}",
VXVVmSkipV0VmAndNoR1R2R3Overlap()),
"VFwadd_vv");
}
TEST_F(AssemblerRISCV64Test, VFwadd_vf) {
DriverStr(RepeatVVFVmFiltered(&Riscv64Assembler::VFwadd_vf,
"vfwadd.vf {reg1}, {reg2}, {reg3}{vm}",
VXVVmSkipV0VmAndNoR1R2Overlap<FRegister>()),
"VFwadd_vf");
}
TEST_F(AssemblerRISCV64Test, VFwredusum_vs) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VFwredusum_vs,
"vfwredusum.vs {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, VRegister>()),
"VFwredusum_vs");
}
TEST_F(AssemblerRISCV64Test, VFwsub_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VFwsub_vv,
"vfwsub.vv {reg1}, {reg2}, {reg3}{vm}",
VXVVmSkipV0VmAndNoR1R2R3Overlap()),
"VFwsub_vv");
}
TEST_F(AssemblerRISCV64Test, VFwsub_vf) {
DriverStr(RepeatVVFVmFiltered(&Riscv64Assembler::VFwsub_vf,
"vfwsub.vf {reg1}, {reg2}, {reg3}{vm}",
VXVVmSkipV0VmAndNoR1R2Overlap<FRegister>()),
"VFwsub_vf");
}
TEST_F(AssemblerRISCV64Test, VFwredosum_vs) {
DriverStr(
RepeatVVVVm(&Riscv64Assembler::VFwredosum_vs, "vfwredosum.vs {reg1}, {reg2}, {reg3}{vm}"),
"VFwredosum_vs");
}
TEST_F(AssemblerRISCV64Test, VFwadd_wv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VFwadd_wv,
"vfwadd.wv {reg1}, {reg2}, {reg3}{vm}",
VXVVmSkipV0VmAndNoR1R3Overlap<VRegister>()),
"VFwadd_wv");
}
TEST_F(AssemblerRISCV64Test, VFwadd_wf) {
DriverStr(RepeatVVFVmFiltered(&Riscv64Assembler::VFwadd_wf,
"vfwadd.wf {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, FRegister>()),
"VFwadd_wf");
}
TEST_F(AssemblerRISCV64Test, VFwsub_wv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VFwsub_wv,
"vfwsub.wv {reg1}, {reg2}, {reg3}{vm}",
VXVVmSkipV0VmAndNoR1R3Overlap<VRegister>()),
"VFwsub_wv");
}
TEST_F(AssemblerRISCV64Test, VFwsub_wf) {
DriverStr(RepeatVVFVmFiltered(&Riscv64Assembler::VFwsub_wf,
"vfwsub.wf {reg1}, {reg2}, {reg3}{vm}",
SkipV0Vm<VRegister, FRegister>()),
"VFwsub_wf");
}
TEST_F(AssemblerRISCV64Test, VFwmul_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VFwmul_vv,
"vfwmul.vv {reg1}, {reg2}, {reg3}{vm}",
VXVVmSkipV0VmAndNoR1R2R3Overlap()),
"VFwmul_vv");
}
TEST_F(AssemblerRISCV64Test, VFwmul_vf) {
DriverStr(RepeatVVFVmFiltered(&Riscv64Assembler::VFwmul_vf,
"vfwmul.vf {reg1}, {reg2}, {reg3}{vm}",
VXVVmSkipV0VmAndNoR1R2Overlap<FRegister>()),
"VFwmul_vf");
}
TEST_F(AssemblerRISCV64Test, VFwmacc_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VFwmacc_vv,
"vfwmacc.vv {reg1}, {reg2}, {reg3}{vm}",
VXVVmSkipV0VmAndNoR1R2R3Overlap()),
"VFwmacc_vv");
}
TEST_F(AssemblerRISCV64Test, VFwmacc_vf) {
DriverStr(RepeatVFVVmFiltered(&Riscv64Assembler::VFwmacc_vf,
"vfwmacc.vf {reg1}, {reg2}, {reg3}{vm}",
VXVVmSkipV0VmAndNoR1R3Overlap<FRegister>()),
"VFwmacc_vf");
}
TEST_F(AssemblerRISCV64Test, VFwnmacc_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VFwnmacc_vv,
"vfwnmacc.vv {reg1}, {reg2}, {reg3}{vm}",
VXVVmSkipV0VmAndNoR1R2R3Overlap()),
"VFwnmacc_vv");
}
TEST_F(AssemblerRISCV64Test, VFwnmacc_vf) {
DriverStr(RepeatVFVVmFiltered(&Riscv64Assembler::VFwnmacc_vf,
"vfwnmacc.vf {reg1}, {reg2}, {reg3}{vm}",
VXVVmSkipV0VmAndNoR1R3Overlap<FRegister>()),
"VFwnmacc_vf");
}
TEST_F(AssemblerRISCV64Test, VFwmsac_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VFwmsac_vv,
"vfwmsac.vv {reg1}, {reg2}, {reg3}{vm}",
VXVVmSkipV0VmAndNoR1R2R3Overlap()),
"VFwmsac_vv");
}
TEST_F(AssemblerRISCV64Test, VFwmsac_vf) {
DriverStr(RepeatVFVVmFiltered(&Riscv64Assembler::VFwmsac_vf,
"vfwmsac.vf {reg1}, {reg2}, {reg3}{vm}",
VXVVmSkipV0VmAndNoR1R3Overlap<FRegister>()),
"VFwmsac_vf");
}
TEST_F(AssemblerRISCV64Test, VFwnmsac_vv) {
DriverStr(RepeatVVVVmFiltered(&Riscv64Assembler::VFwnmsac_vv,
"vfwnmsac.vv {reg1}, {reg2}, {reg3}{vm}",
VXVVmSkipV0VmAndNoR1R2R3Overlap()),
"VFwnmsac_vv");
}
TEST_F(AssemblerRISCV64Test, VFwnmsac_vf) {
DriverStr(RepeatVFVVmFiltered(&Riscv64Assembler::VFwnmsac_vf,
"vfwnmsac.vf {reg1}, {reg2}, {reg3}{vm}",
VXVVmSkipV0VmAndNoR1R3Overlap<FRegister>()),
"VFwnmsac_vf");
}
TEST_F(AssemblerRISCV64Test, VMv_s_x) {
DriverStr(RepeatVR(&Riscv64Assembler::VMv_s_x, "vmv.s.x {reg1}, {reg2}"), "VMv_s_x");
}
TEST_F(AssemblerRISCV64Test, VMv_x_s) {
DriverStr(RepeatRV(&Riscv64Assembler::VMv_x_s, "vmv.x.s {reg1}, {reg2}"), "VMv_x_s");
}
TEST_F(AssemblerRISCV64Test, VCpop_m) {
DriverStr(RepeatRVVm(&Riscv64Assembler::VCpop_m, "vcpop.m {reg1}, {reg2}{vm}"), "VCpop_m");
}
TEST_F(AssemblerRISCV64Test, VFirst_m) {
DriverStr(RepeatRVVm(&Riscv64Assembler::VFirst_m, "vfirst.m {reg1}, {reg2}{vm}"), "VFirst_m");
}
TEST_F(AssemblerRISCV64Test, VZext_vf8) {
DriverStr(
RepeatVVVmFiltered(
&Riscv64Assembler::VZext_vf8, "vzext.vf8 {reg1}, {reg2}{vm}", SkipV0Vm<VRegister>()),
"VZext_vf8");
}
TEST_F(AssemblerRISCV64Test, VSext_vf8) {
DriverStr(
RepeatVVVmFiltered(
&Riscv64Assembler::VSext_vf8, "vsext.vf8 {reg1}, {reg2}{vm}", SkipV0Vm<VRegister>()),
"VSext_vf8");
}
TEST_F(AssemblerRISCV64Test, VZext_vf4) {
DriverStr(
RepeatVVVmFiltered(
&Riscv64Assembler::VZext_vf4, "vzext.vf4 {reg1}, {reg2}{vm}", SkipV0Vm<VRegister>()),
"VZext_vf4");
}
TEST_F(AssemblerRISCV64Test, VSext_vf4) {
DriverStr(
RepeatVVVmFiltered(
&Riscv64Assembler::VSext_vf4, "vsext.vf4 {reg1}, {reg2}{vm}", SkipV0Vm<VRegister>()),
"VSext_vf4");
}
TEST_F(AssemblerRISCV64Test, VZext_vf2) {
DriverStr(
RepeatVVVmFiltered(
&Riscv64Assembler::VZext_vf2, "vzext.vf2 {reg1}, {reg2}{vm}", SkipV0Vm<VRegister>()),
"VZext_vf2");
}
TEST_F(AssemblerRISCV64Test, VSext_vf2) {
DriverStr(
RepeatVVVmFiltered(
&Riscv64Assembler::VSext_vf2, "vsext.vf2 {reg1}, {reg2}{vm}", SkipV0Vm<VRegister>()),
"VSext_vf2");
}
TEST_F(AssemblerRISCV64Test, VFmv_s_f) {
DriverStr(RepeatVF(&Riscv64Assembler::VFmv_s_f, "vfmv.s.f {reg1}, {reg2}"), "VFmv_s_f");
}
TEST_F(AssemblerRISCV64Test, VFmv_f_s) {
DriverStr(RepeatFV(&Riscv64Assembler::VFmv_f_s, "vfmv.f.s {reg1}, {reg2}"), "VFmv_f_s");
}
TEST_F(AssemblerRISCV64Test, VFcvt_xu_f_v) {
DriverStr(RepeatVVVmFiltered(&Riscv64Assembler::VFcvt_xu_f_v,
"vfcvt.xu.f.v {reg1}, {reg2}{vm}",
SkipV0Vm<VRegister>()),
"VFcvt_xu_f_v");
}
TEST_F(AssemblerRISCV64Test, VFcvt_x_f_v) {
DriverStr(
RepeatVVVmFiltered(
&Riscv64Assembler::VFcvt_x_f_v, "vfcvt.x.f.v {reg1}, {reg2}{vm}", SkipV0Vm<VRegister>()),
"VFcvt_x_f_v");
}
TEST_F(AssemblerRISCV64Test, VFcvt_f_xu_v) {
DriverStr(RepeatVVVmFiltered(&Riscv64Assembler::VFcvt_f_xu_v,
"vfcvt.f.xu.v {reg1}, {reg2}{vm}",
SkipV0Vm<VRegister>()),
"VFcvt_f_xu_v");
}
TEST_F(AssemblerRISCV64Test, VFcvt_f_x_v) {
DriverStr(
RepeatVVVmFiltered(
&Riscv64Assembler::VFcvt_f_x_v, "vfcvt.f.x.v {reg1}, {reg2}{vm}", SkipV0Vm<VRegister>()),
"VFcvt_f_x_v");
}
TEST_F(AssemblerRISCV64Test, VFcvt_rtz_xu_f_v) {
DriverStr(RepeatVVVmFiltered(&Riscv64Assembler::VFcvt_rtz_xu_f_v,
"vfcvt.rtz.xu.f.v {reg1}, {reg2}{vm}",
SkipV0Vm<VRegister>()),
"VFcvt_rtz_xu_f_v");
}
TEST_F(AssemblerRISCV64Test, VFcvt_rtz_x_f_v) {
DriverStr(RepeatVVVmFiltered(&Riscv64Assembler::VFcvt_rtz_x_f_v,
"vfcvt.rtz.x.f.v {reg1}, {reg2}{vm}",
SkipV0Vm<VRegister>()),
"VFcvt_rtz_x_f_v");
}
TEST_F(AssemblerRISCV64Test, VFwcvt_xu_f_v) {
DriverStr(RepeatVVVmFiltered(&Riscv64Assembler::VFwcvt_xu_f_v,
"vfwcvt.xu.f.v {reg1}, {reg2}{vm}",
VVVmSkipV0VmAndNoR1R2Overlap()),
"VFwcvt_xu_f_v");
}
TEST_F(AssemblerRISCV64Test, VFwcvt_x_f_v) {
DriverStr(RepeatVVVmFiltered(&Riscv64Assembler::VFwcvt_x_f_v,
"vfwcvt.x.f.v {reg1}, {reg2}{vm}",
VVVmSkipV0VmAndNoR1R2Overlap()),
"VFwcvt_x_f_v");
}
TEST_F(AssemblerRISCV64Test, VFwcvt_f_xu_v) {
DriverStr(RepeatVVVmFiltered(&Riscv64Assembler::VFwcvt_f_xu_v,
"vfwcvt.f.xu.v {reg1}, {reg2}{vm}",
VVVmSkipV0VmAndNoR1R2Overlap()),
"VFwcvt_f_xu_v");
}
TEST_F(AssemblerRISCV64Test, VFwcvt_f_x_v) {
DriverStr(RepeatVVVmFiltered(&Riscv64Assembler::VFwcvt_f_x_v,
"vfwcvt.f.x.v {reg1}, {reg2}{vm}",
VVVmSkipV0VmAndNoR1R2Overlap()),
"VFwcvt_f_x_v");
}
TEST_F(AssemblerRISCV64Test, VFwcvt_f_f_v) {
DriverStr(RepeatVVVmFiltered(&Riscv64Assembler::VFwcvt_f_f_v,
"vfwcvt.f.f.v {reg1}, {reg2}{vm}",
VVVmSkipV0VmAndNoR1R2Overlap()),
"VFwcvt_f_f_v");
}
TEST_F(AssemblerRISCV64Test, VFwcvt_rtz_xu_f_v) {
DriverStr(RepeatVVVmFiltered(&Riscv64Assembler::VFwcvt_rtz_xu_f_v,
"vfwcvt.rtz.xu.f.v {reg1}, {reg2}{vm}",
VVVmSkipV0VmAndNoR1R2Overlap()),
"VFwcvt_rtz_xu_f_v");
}
TEST_F(AssemblerRISCV64Test, VFwcvt_rtz_x_f_v) {
DriverStr(RepeatVVVmFiltered(&Riscv64Assembler::VFwcvt_rtz_x_f_v,
"vfwcvt.rtz.x.f.v {reg1}, {reg2}{vm}",
VVVmSkipV0VmAndNoR1R2Overlap()),
"VFwcvt_rtz_x_f_v");
}
TEST_F(AssemblerRISCV64Test, VFncvt_xu_f_w) {
DriverStr(RepeatVVVmFiltered(&Riscv64Assembler::VFncvt_xu_f_w,
"vfncvt.xu.f.w {reg1}, {reg2}{vm}",
SkipV0Vm<VRegister>()),
"VFncvt_xu_f_w");
}
TEST_F(AssemblerRISCV64Test, VFncvt_x_f_w) {
DriverStr(RepeatVVVmFiltered(&Riscv64Assembler::VFncvt_x_f_w,
"vfncvt.x.f.w {reg1}, {reg2}{vm}",
SkipV0Vm<VRegister>()),
"VFncvt_x_f_w");
}
TEST_F(AssemblerRISCV64Test, VFncvt_f_xu_w) {
DriverStr(RepeatVVVmFiltered(&Riscv64Assembler::VFncvt_f_xu_w,
"vfncvt.f.xu.w {reg1}, {reg2}{vm}",
SkipV0Vm<VRegister>()),
"VFncvt_f_xu_w");
}
TEST_F(AssemblerRISCV64Test, VFncvt_f_x_w) {
DriverStr(RepeatVVVmFiltered(&Riscv64Assembler::VFncvt_f_x_w,
"vfncvt.f.x.w {reg1}, {reg2}{vm}",
SkipV0Vm<VRegister>()),
"VFncvt_f_x_w");
}
TEST_F(AssemblerRISCV64Test, VFncvt_f_f_w) {
DriverStr(RepeatVVVmFiltered(&Riscv64Assembler::VFncvt_f_f_w,
"vfncvt.f.f.w {reg1}, {reg2}{vm}",
SkipV0Vm<VRegister>()),
"VFncvt_f_f_w");
}
TEST_F(AssemblerRISCV64Test, VFncvt_rod_f_f_w) {
DriverStr(RepeatVVVmFiltered(&Riscv64Assembler::VFncvt_rod_f_f_w,
"vfncvt.rod.f.f.w {reg1}, {reg2}{vm}",
SkipV0Vm<VRegister>()),
"VFncvt_rod_f_f_w");
}
TEST_F(AssemblerRISCV64Test, VFncvt_rtz_xu_f_w) {
DriverStr(RepeatVVVmFiltered(&Riscv64Assembler::VFncvt_rtz_xu_f_w,
"vfncvt.rtz.xu.f.w {reg1}, {reg2}{vm}",
SkipV0Vm<VRegister>()),
"VFncvt_rtz_xu_f_w");
}
TEST_F(AssemblerRISCV64Test, VFncvt_rtz_x_f_w) {
DriverStr(RepeatVVVmFiltered(&Riscv64Assembler::VFncvt_rtz_x_f_w,
"vfncvt.rtz.x.f.w {reg1}, {reg2}{vm}",
SkipV0Vm<VRegister>()),
"VFncvt_rtz_x_f_w");
}
TEST_F(AssemblerRISCV64Test, VFsqrt_v) {
DriverStr(RepeatVVVmFiltered(
&Riscv64Assembler::VFsqrt_v, "vfsqrt.v {reg1}, {reg2}{vm}", SkipV0Vm<VRegister>()),
"VFsqrt_v");
}
TEST_F(AssemblerRISCV64Test, VFrsqrt7_v) {
DriverStr(
RepeatVVVmFiltered(
&Riscv64Assembler::VFrsqrt7_v, "vfrsqrt7.v {reg1}, {reg2}{vm}", SkipV0Vm<VRegister>()),
"VFrsqrt7_v");
}
TEST_F(AssemblerRISCV64Test, VFrec7_v) {
DriverStr(RepeatVVVmFiltered(
&Riscv64Assembler::VFrec7_v, "vfrec7.v {reg1}, {reg2}{vm}", SkipV0Vm<VRegister>()),
"VFrec7_v");
}
TEST_F(AssemblerRISCV64Test, VFclass_v) {
DriverStr(
RepeatVVVmFiltered(
&Riscv64Assembler::VFclass_v, "vfclass.v {reg1}, {reg2}{vm}", SkipV0Vm<VRegister>()),
"VFclass_v");
}
TEST_F(AssemblerRISCV64Test, VMsbf_m) {
DriverStr(
RepeatVVVmFiltered(
&Riscv64Assembler::VMsbf_m, "vmsbf.m {reg1}, {reg2}{vm}", VVVmSkipV0VmAndNoR1R2Overlap()),
"VMsbf_m");
}
TEST_F(AssemblerRISCV64Test, VMsof_m) {
DriverStr(
RepeatVVVmFiltered(
&Riscv64Assembler::VMsof_m, "vmsof.m {reg1}, {reg2}{vm}", VVVmSkipV0VmAndNoR1R2Overlap()),
"VMsof_m");
}
TEST_F(AssemblerRISCV64Test, VMsif_m) {
DriverStr(
RepeatVVVmFiltered(
&Riscv64Assembler::VMsif_m, "vmsif.m {reg1}, {reg2}{vm}", VVVmSkipV0VmAndNoR1R2Overlap()),
"VMsif_m");
}
TEST_F(AssemblerRISCV64Test, VIota_m) {
DriverStr(
RepeatVVVmFiltered(
&Riscv64Assembler::VIota_m, "viota.m {reg1}, {reg2}{vm}", VVVmSkipV0VmAndNoR1R2Overlap()),
"VIota_m");
}
TEST_F(AssemblerRISCV64Test, VId_v) {
DriverStr(RepeatVVmFiltered(&Riscv64Assembler::VId_v, "vid.v {reg} {vm}", SkipV0Vm()), "VId_v");
}
// Pseudo instructions.
TEST_F(AssemblerRISCV64Test, Nop) {
ScopedCSuppression scs(this);
__ Nop();
DriverStr("addi zero,zero,0", "Nop");
}
TEST_F(AssemblerRISCV64Test, Li) {
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");
}
TEST_F(AssemblerRISCV64Test, Neg) {
DriverStr(RepeatRR(&Riscv64Assembler::Neg, "sub {reg1}, x0, {reg2}"), "Neg");
}
TEST_F(AssemblerRISCV64Test, NegW) {
DriverStr(RepeatRR(&Riscv64Assembler::NegW, "subw {reg1}, x0, {reg2}"), "Neg");
}
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"
"srai {reg1}, {reg1}, 56"),
"SextB");
}
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"
"srai {reg1}, {reg1}, 48"),
"SextH");
}
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"
"srli {reg1}, {reg1}, 48"),
"SextH");
}
TEST_F(AssemblerRISCV64Test, ZextW) {
ScopedCSuppression scs(this);
DriverStr(RepeatRR(&Riscv64Assembler::ZextW,
"slli {reg1}, {reg2}, 32\n"
"srli {reg1}, {reg1}, 32"),
"ZextW");
}
TEST_F(AssemblerRISCV64Test, Seqz) {
DriverStr(RepeatRR(&Riscv64Assembler::Seqz, "sltiu {reg1}, {reg2}, 1\n"), "Seqz");
}
TEST_F(AssemblerRISCV64Test, Snez) {
DriverStr(RepeatRR(&Riscv64Assembler::Snez, "sltu {reg1}, zero, {reg2}\n"), "Snez");
}
TEST_F(AssemblerRISCV64Test, Sltz) {
DriverStr(RepeatRR(&Riscv64Assembler::Sltz, "slt {reg1}, {reg2}, zero\n"), "Sltz");
}
TEST_F(AssemblerRISCV64Test, Sgtz) {
DriverStr(RepeatRR(&Riscv64Assembler::Sgtz, "slt {reg1}, zero, {reg2}\n"), "Sgtz");
}
TEST_F(AssemblerRISCV64Test, FMvS) {
DriverStr(RepeatFF(&Riscv64Assembler::FMvS, "fsgnj.s {reg1}, {reg2}, {reg2}\n"), "FMvS");
}
TEST_F(AssemblerRISCV64Test, FAbsS) {
DriverStr(RepeatFF(&Riscv64Assembler::FAbsS, "fsgnjx.s {reg1}, {reg2}, {reg2}\n"), "FAbsS");
}
TEST_F(AssemblerRISCV64Test, FNegS) {
DriverStr(RepeatFF(&Riscv64Assembler::FNegS, "fsgnjn.s {reg1}, {reg2}, {reg2}\n"), "FNegS");
}
TEST_F(AssemblerRISCV64Test, FMvD) {
DriverStr(RepeatFF(&Riscv64Assembler::FMvD, "fsgnj.d {reg1}, {reg2}, {reg2}\n"), "FMvD");
}
TEST_F(AssemblerRISCV64Test, FAbsD) {
DriverStr(RepeatFF(&Riscv64Assembler::FAbsD, "fsgnjx.d {reg1}, {reg2}, {reg2}\n"), "FAbsD");
}
TEST_F(AssemblerRISCV64Test, FNegD) {
DriverStr(RepeatFF(&Riscv64Assembler::FNegD, "fsgnjn.d {reg1}, {reg2}, {reg2}\n"), "FNegD");
}
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");
}
TEST_F(AssemblerRISCV64Test, Blez) {
// TODO(riscv64): Change "-11, 2" to "-12, 1" for "C" Standard Extension.
DriverStr(RepeatRIbS(&Riscv64Assembler::Blez, -11, 2, "bge zero, {reg}, {imm}\n"), "Blez");
}
TEST_F(AssemblerRISCV64Test, Bgez) {
// TODO(riscv64): Change "-11, 2" to "-12, 1" for "C" Standard Extension.
DriverStr(RepeatRIbS(&Riscv64Assembler::Bgez, -11, 2, "bge {reg}, zero, {imm}\n"), "Bgez");
}
TEST_F(AssemblerRISCV64Test, Bltz) {
// TODO(riscv64): Change "-11, 2" to "-12, 1" for "C" Standard Extension.
DriverStr(RepeatRIbS(&Riscv64Assembler::Bltz, -11, 2, "blt {reg}, zero, {imm}\n"), "Bltz");
}
TEST_F(AssemblerRISCV64Test, Bgtz) {
// TODO(riscv64): Change "-11, 2" to "-12, 1" for "C" Standard Extension.
DriverStr(RepeatRIbS(&Riscv64Assembler::Bgtz, -11, 2, "blt zero, {reg}, {imm}\n"), "Bgtz");
}
TEST_F(AssemblerRISCV64Test, Bgt) {
// TODO(riscv64): Change "-11, 2" to "-12, 1" for "C" Standard Extension.
DriverStr(RepeatRRIbS(&Riscv64Assembler::Bgt, -11, 2, "blt {reg2}, {reg1}, {imm}\n"), "Bgt");
}
TEST_F(AssemblerRISCV64Test, Ble) {
// TODO(riscv64): Change "-11, 2" to "-12, 1" for "C" Standard Extension.
DriverStr(RepeatRRIbS(&Riscv64Assembler::Ble, -11, 2, "bge {reg2}, {reg1}, {imm}\n"), "Bge");
}
TEST_F(AssemblerRISCV64Test, Bgtu) {
// TODO(riscv64): Change "-11, 2" to "-12, 1" for "C" Standard Extension.
DriverStr(RepeatRRIbS(&Riscv64Assembler::Bgtu, -11, 2, "bltu {reg2}, {reg1}, {imm}\n"), "Bgtu");
}
TEST_F(AssemblerRISCV64Test, Bleu) {
// TODO(riscv64): Change "-11, 2" to "-12, 1" for "C" Standard Extension.
DriverStr(RepeatRRIbS(&Riscv64Assembler::Bleu, -11, 2, "bgeu {reg2}, {reg1}, {imm}\n"), "Bgeu");
}
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");
}
TEST_F(AssemblerRISCV64Test, JalRA) {
// TODO(riscv64): Change "-19, 2" to "-20, 1" for "C" Standard Extension.
DriverStr(RepeatIbS<int32_t>(&Riscv64Assembler::Jal, -19, 2, "jal {imm}\n"), "JalRA");
}
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");
}
TEST_F(AssemblerRISCV64Test, RdCycle) {
DriverStr(RepeatR(&Riscv64Assembler::RdCycle, "rdcycle {reg}\n"), "RdCycle");
}
TEST_F(AssemblerRISCV64Test, RdTime) {
DriverStr(RepeatR(&Riscv64Assembler::RdTime, "rdtime {reg}\n"), "RdTime");
}
TEST_F(AssemblerRISCV64Test, RdInstret) {
DriverStr(RepeatR(&Riscv64Assembler::RdInstret, "rdinstret {reg}\n"), "RdInstret");
}
TEST_F(AssemblerRISCV64Test, Csrr) {
TestCsrrXMacro(
"Csrr", "csrr {reg}, {csr}", [&](uint32_t csr, XRegister rd) { __ Csrr(rd, csr); });
}
TEST_F(AssemblerRISCV64Test, Csrw) {
TestCsrrXMacro(
"Csrw", "csrw {csr}, {reg}", [&](uint32_t csr, XRegister rs) { __ Csrw(csr, rs); });
}
TEST_F(AssemblerRISCV64Test, Csrs) {
TestCsrrXMacro(
"Csrs", "csrs {csr}, {reg}", [&](uint32_t csr, XRegister rs) { __ Csrs(csr, rs); });
}
TEST_F(AssemblerRISCV64Test, Csrc) {
TestCsrrXMacro(
"Csrc", "csrc {csr}, {reg}", [&](uint32_t csr, XRegister rs) { __ Csrc(csr, rs); });
}
TEST_F(AssemblerRISCV64Test, Csrwi) {
TestCsrrXiMacro(
"Csrwi", "csrwi {csr}, {uimm}", [&](uint32_t csr, uint32_t uimm) { __ Csrwi(csr, uimm); });
}
TEST_F(AssemblerRISCV64Test, Csrsi) {
TestCsrrXiMacro(
"Csrsi", "csrsi {csr}, {uimm}", [&](uint32_t csr, uint32_t uimm) { __ Csrsi(csr, uimm); });
}
TEST_F(AssemblerRISCV64Test, Csrci) {
TestCsrrXiMacro(
"Csrci", "csrci {csr}, {uimm}", [&](uint32_t csr, uint32_t uimm) { __ Csrci(csr, uimm); });
}
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);
srs.ExcludeXRegister(TMP2);
DriverStr(RepeatRIb(&Riscv64Assembler::LoadConst32, -32, "li {reg}, {imm}"), "LoadConst32");
}
TEST_F(AssemblerRISCV64Test, LoadConst64) {
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));
};
TestAddConst("AddConst32", 32, /*suffix=*/ "w", emit_op);
}
TEST_F(AssemblerRISCV64Test, AddConst64) {
ScopedMarchOverride smo(this, "-march=rv64imafd");
auto emit_op = [&](XRegister rd, XRegister rs1, int64_t value) {
__ AddConst64(rd, rs1, value);
};
TestAddConst("AddConst64", 64, /*suffix=*/ "", emit_op);
}
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",
GetPrintBcond());
}
TEST_F(AssemblerRISCV64Test, BeqA0A1MaxOffset13ForwardBare) {
ScopedCSuppression scs(this);
TestBeqA0A1Forward("BeqA0A1MaxOffset13ForwardBare",
MaxOffset13ForwardDistance() - /*BEQ*/ 4u,
"1",
GetPrintBcond(),
/*is_bare=*/ true);
}
TEST_F(AssemblerRISCV64Test, BeqA0A1MaxOffset13Backward) {
ScopedCSuppression scs(this);
TestBeqA0A1Backward("BeqA0A1MaxOffset13Forward",
MaxOffset13BackwardDistance(),
"1",
GetPrintBcond());
}
TEST_F(AssemblerRISCV64Test, BeqA0A1MaxOffset13BackwardBare) {
ScopedCSuppression scs(this);
TestBeqA0A1Backward("BeqA0A1MaxOffset13ForwardBare",
MaxOffset13BackwardDistance(),
"1",
GetPrintBcond(),
/*is_bare=*/ true);
}
TEST_F(AssemblerRISCV64Test, BeqA0A1OverMaxOffset13Forward) {
ScopedCSuppression scs(this);
TestBeqA0A1Forward("BeqA0A1OverMaxOffset13Forward",
MaxOffset13ForwardDistance() - /*BEQ*/ 4u + /*Exceed max*/ 4u,
"1",
GetPrintBcondOppositeAndJ("2"));
}
TEST_F(AssemblerRISCV64Test, BeqA0A1OverMaxOffset13Backward) {
ScopedCSuppression scs(this);
TestBeqA0A1Backward("BeqA0A1OverMaxOffset13Forward",
MaxOffset13BackwardDistance() + /*Exceed max*/ 4u,
"1",
GetPrintBcondOppositeAndJ("2"));
}
TEST_F(AssemblerRISCV64Test, BeqA0A1MaxOffset21Forward) {
ScopedCSuppression scs(this);
TestBeqA0A1Forward("BeqA0A1MaxOffset21Forward",
MaxOffset21ForwardDistance() - /*J*/ 4u,
"1",
GetPrintBcondOppositeAndJ("2"));
}
TEST_F(AssemblerRISCV64Test, BeqA0A1MaxOffset21Backward) {
ScopedCSuppression scs(this);
TestBeqA0A1Backward("BeqA0A1MaxOffset21Backward",
MaxOffset21BackwardDistance() - /*BNE*/ 4u,
"1",
GetPrintBcondOppositeAndJ("2"));
}
TEST_F(AssemblerRISCV64Test, BeqA0A1OverMaxOffset21Forward) {
ScopedCSuppression scs(this);
TestBeqA0A1Forward("BeqA0A1OverMaxOffset21Forward",
MaxOffset21ForwardDistance() - /*J*/ 4u + /*Exceed max*/ 4u,
"1",
GetPrintBcondOppositeAndTail("2", "3"));
}
TEST_F(AssemblerRISCV64Test, BeqA0A1OverMaxOffset21Backward) {
ScopedCSuppression scs(this);
TestBeqA0A1Backward("BeqA0A1OverMaxOffset21Backward",
MaxOffset21BackwardDistance() - /*BNE*/ 4u + /*Exceed max*/ 4u,
"1",
GetPrintBcondOppositeAndTail("2", "3"));
}
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();
for (XRegister reg : GetRegisters()) {
__ Bne(reg, reg, &label);
__ Blt(reg, reg, &label);
__ Bgt(reg, reg, &label);
__ Bltu(reg, reg, &label);
__ Bgtu(reg, reg, &label);
}
DriverStr("nop\n", "BcondElimination");
}
TEST_F(AssemblerRISCV64Test, BcondUnconditional) {
ScopedCSuppression scs(this);
Riscv64Label label;
__ Bind(&label);
__ Nop();
for (XRegister reg : GetRegisters()) {
__ Beq(reg, reg, &label);
__ Bge(reg, reg, &label);
__ Ble(reg, reg, &label);
__ Bleu(reg, reg, &label);
__ Bgeu(reg, reg, &label);
}
std::string expected =
"1:\n"
"nop\n" +
RepeatInsn(5u * GetRegisters().size(), "j 1b\n", []() {});
DriverStr(expected, "BcondUnconditional");
}
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",
GetEmitJ(),
GetPrintJ());
}
TEST_F(AssemblerRISCV64Test, JMaxOffset21ForwardBare) {
ScopedCSuppression scs(this);
TestBuncondForward("JMaxOffset21Forward",
MaxOffset21ForwardDistance() - /*J*/ 4u,
"1",
GetEmitJ(/*is_bare=*/ true),
GetPrintJ());
}
TEST_F(AssemblerRISCV64Test, JMaxOffset21Backward) {
ScopedCSuppression scs(this);
TestBuncondBackward("JMaxOffset21Backward",
MaxOffset21BackwardDistance(),
"1",
GetEmitJ(),
GetPrintJ());
}
TEST_F(AssemblerRISCV64Test, JMaxOffset21BackwardBare) {
ScopedCSuppression scs(this);
TestBuncondBackward("JMaxOffset21Backward",
MaxOffset21BackwardDistance(),
"1",
GetEmitJ(/*is_bare=*/ true),
GetPrintJ());
}
TEST_F(AssemblerRISCV64Test, JOverMaxOffset21Forward) {
ScopedCSuppression scs(this);
TestBuncondForward("JOverMaxOffset21Forward",
MaxOffset21ForwardDistance() - /*J*/ 4u + /*Exceed max*/ 4u,
"1",
GetEmitJ(),
GetPrintTail("2"));
}
TEST_F(AssemblerRISCV64Test, JOverMaxOffset21Backward) {
ScopedCSuppression scs(this);
TestBuncondBackward("JMaxOffset21Backward",
MaxOffset21BackwardDistance() + /*Exceed max*/ 4u,
"1",
GetEmitJ(),
GetPrintTail("2"));
}
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",
GetEmitJal(),
GetPrintJal());
}
TEST_F(AssemblerRISCV64Test, CallMaxOffset21Backward) {
ScopedCSuppression scs(this);
TestBuncondBackward("CallMaxOffset21Backward",
MaxOffset21BackwardDistance(),
"1",
GetEmitJal(),
GetPrintJal());
}
TEST_F(AssemblerRISCV64Test, CallOverMaxOffset21Forward) {
ScopedCSuppression scs(this);
TestBuncondForward("CallOverMaxOffset21Forward",
MaxOffset21ForwardDistance() - /*J*/ 4u + /*Exceed max*/ 4u,
"1",
GetEmitJal(),
GetPrintCall("2"));
}
TEST_F(AssemblerRISCV64Test, CallOverMaxOffset21Backward) {
ScopedCSuppression scs(this);
TestBuncondBackward("CallMaxOffset21Backward",
MaxOffset21BackwardDistance() + /*Exceed max*/ 4u,
"1",
GetEmitJal(),
GetPrintCall("2"));
}
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");
}
TEST_F(AssemblerRISCV64Test, LoadLabelAddress) {
std::string expected;
constexpr size_t kNumLoadsForward = 4 * KB;
constexpr size_t kNumLoadsBackward = 4 * KB;
Riscv64Label label;
auto emit_batch = [&](size_t num_loads, const std::string& target_label) {
for (size_t i = 0; i != num_loads; ++i) {
// Cycle through non-Zero registers.
XRegister rd = enum_cast<XRegister>((i % (kNumberOfXRegisters - 1)) + 1);
DCHECK_NE(rd, Zero);
std::string rd_name = GetRegisterName(rd);
__ LoadLabelAddress(rd, &label);
expected += "1:\n";
expected += ART_FORMAT("auipc {}, %pcrel_hi({})\n", rd_name, target_label);
expected += ART_FORMAT("addi {}, {}, %pcrel_lo(1b)\n", rd_name, rd_name);
}
};
emit_batch(kNumLoadsForward, "2f");
__ Bind(&label);
expected += "2:\n";
emit_batch(kNumLoadsBackward, "2b");
DriverStr(expected, "LoadLabelAddress");
}
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];
uint32_t target_locations[4];
JumpTable* jump_table = __ CreateJumpTable(ArenaVector<Riscv64Label*>(
{&targets[0], &targets[1], &targets[2], &targets[3]}, __ GetAllocator()->Adapter()));
for (size_t i : {0, 1, 2, 3}) {
target_locations[i] = __ CodeSize();
__ Bind(&targets[i]);
expected += std::to_string(i) + ":\n";
expected += EmitNops(sizeof(uint32_t));
}
__ LoadLabelAddress(A0, jump_table->GetLabel());
expected += "4:\n"
"auipc a0, %pcrel_hi(5f)\n"
"addi a0, a0, %pcrel_lo(4b)\n";
expected += EmitNops(sizeof(uint32_t));
uint32_t label5_location = __ CodeSize();
auto target_offset = [&](size_t i) {
// Even with `-mno-relax`, clang assembler does not fully resolve `.4byte 0b - 5b`
// and emits a relocation, so we need to calculate target offsets ourselves.
return std::to_string(static_cast<int64_t>(target_locations[i] - label5_location));
};
expected += "5:\n"
".4byte " + target_offset(0) + "\n"
".4byte " + target_offset(1) + "\n"
".4byte " + target_offset(2) + "\n"
".4byte " + target_offset(3) + "\n";
DriverStr(expected, "JumpTable");
}
TEST_F(AssemblerRISCV64Test, ScratchRegisters) {
ScratchRegisterScope srs(GetAssembler());
ASSERT_EQ(2u, srs.AvailableXRegisters()); // Default: TMP(T6) and TMP2(T5).
ASSERT_EQ(1u, srs.AvailableFRegisters()); // Default: FTMP(FT11).
XRegister tmp = srs.AllocateXRegister();
EXPECT_EQ(TMP, tmp);
XRegister tmp2 = srs.AllocateXRegister();
EXPECT_EQ(TMP2, tmp2);
ASSERT_EQ(0u, srs.AvailableXRegisters());
FRegister ftmp = srs.AllocateFRegister();
EXPECT_EQ(FTMP, ftmp);
ASSERT_EQ(0u, srs.AvailableFRegisters());
// Test nesting.
srs.FreeXRegister(A0);
srs.FreeXRegister(A1);
srs.FreeFRegister(FA0);
srs.FreeFRegister(FA1);
ASSERT_EQ(2u, srs.AvailableXRegisters());
ASSERT_EQ(2u, srs.AvailableFRegisters());
{
ScratchRegisterScope srs2(GetAssembler());
ASSERT_EQ(2u, srs2.AvailableXRegisters());
ASSERT_EQ(2u, srs2.AvailableFRegisters());
XRegister a1 = srs2.AllocateXRegister();
EXPECT_EQ(A1, a1);
XRegister a0 = srs2.AllocateXRegister();
EXPECT_EQ(A0, a0);
ASSERT_EQ(0u, srs2.AvailableXRegisters());
FRegister fa1 = srs2.AllocateFRegister();
EXPECT_EQ(FA1, fa1);
FRegister fa0 = srs2.AllocateFRegister();
EXPECT_EQ(FA0, fa0);
ASSERT_EQ(0u, srs2.AvailableFRegisters());
}
ASSERT_EQ(2u, srs.AvailableXRegisters());
ASSERT_EQ(2u, srs.AvailableFRegisters());
srs.IncludeXRegister(A0); // No-op as the register was already available.
ASSERT_EQ(2u, srs.AvailableXRegisters());
srs.IncludeFRegister(FA0); // No-op as the register was already available.
ASSERT_EQ(2u, srs.AvailableFRegisters());
srs.IncludeXRegister(S0);
ASSERT_EQ(3u, srs.AvailableXRegisters());
srs.IncludeFRegister(FS0);
ASSERT_EQ(3u, srs.AvailableFRegisters());
srs.ExcludeXRegister(S1); // No-op as the register was not available.
ASSERT_EQ(3u, srs.AvailableXRegisters());
srs.ExcludeFRegister(FS1); // No-op as the register was not available.
ASSERT_EQ(3u, srs.AvailableFRegisters());
srs.ExcludeXRegister(A0);
ASSERT_EQ(2u, srs.AvailableXRegisters());
srs.ExcludeFRegister(FA0);
ASSERT_EQ(2u, srs.AvailableFRegisters());
}
#undef __
} // namespace riscv64
} // namespace art