blob: c62828b66364fb09d529b33bbe010b49ece384e2 [file] [log] [blame]
// Copyright 2023 The Fuchsia Authors
//
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT
#include <lib/arch/riscv64/feature.h>
#include <string_view>
#include <gtest/gtest.h>
namespace {
TEST(RiscvFeatureTests, GetAndSet) {
arch::RiscvFeatures features;
EXPECT_FALSE(features[arch::RiscvFeature::kVector]);
features.Set(arch::RiscvFeature::kVector);
EXPECT_TRUE(features[arch::RiscvFeature::kVector]);
features.Set(arch::RiscvFeature::kVector, false);
EXPECT_FALSE(features[arch::RiscvFeature::kVector]);
}
TEST(RiscvFeatureTests, And) {
arch::RiscvFeatures a, b;
a.Set(arch::RiscvFeature::kVector, false);
b.Set(arch::RiscvFeature::kVector, false);
a.Set(arch::RiscvFeature::kSvpbmt, false);
b.Set(arch::RiscvFeature::kSvpbmt, true);
a.Set(arch::RiscvFeature::kZicbom, true);
b.Set(arch::RiscvFeature::kZicbom, false);
a.Set(arch::RiscvFeature::kZicboz, true);
b.Set(arch::RiscvFeature::kZicboz, true);
a &= b;
EXPECT_FALSE(a[arch::RiscvFeature::kVector]); // 0 & 0
EXPECT_FALSE(a[arch::RiscvFeature::kSvpbmt]); // 0 & 1
EXPECT_FALSE(a[arch::RiscvFeature::kZicbom]); // 1 & 0
EXPECT_TRUE(a[arch::RiscvFeature::kZicboz]); // 1 & 1
}
TEST(RiscvFeatureTests, SetMany) {
constexpr std::string_view kIsaString1 = "rv64imafdch_zicsr_zifencei_zihintpause_zba_zbb_zbc_zbs";
constexpr std::string_view kIsaString2 =
"rv64imafdcvh_zicbom_zicboz_zicsr_zifencei_zihintpause_zawrs_zba_zbb_zbc_zbs_zve32f_zve64f_zve64d_sstc_svadu_svpbmt";
arch::RiscvFeatures features;
features.SetMany(kIsaString1);
EXPECT_FALSE(features[arch::RiscvFeature::kSstc]);
EXPECT_FALSE(features[arch::RiscvFeature::kVector]);
EXPECT_FALSE(features[arch::RiscvFeature::kSvpbmt]);
EXPECT_FALSE(features[arch::RiscvFeature::kZicbom]);
EXPECT_FALSE(features[arch::RiscvFeature::kZicboz]);
features.SetMany(kIsaString2);
EXPECT_TRUE(features[arch::RiscvFeature::kSstc]);
EXPECT_TRUE(features[arch::RiscvFeature::kVector]);
EXPECT_TRUE(features[arch::RiscvFeature::kSvpbmt]);
EXPECT_TRUE(features[arch::RiscvFeature::kZicbom]);
EXPECT_TRUE(features[arch::RiscvFeature::kZicboz]);
}
} // namespace