Files
TheRock/compiler/amd-llvm/llvm/unittests/Target/AArch64/Immediates.cpp
T
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

107 lines
2.8 KiB
C++

#include "AArch64Subtarget.h"
#include "AArch64TargetMachine.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/MC/TargetRegistry.h"
#include "llvm/Support/TargetSelect.h"
#include "gtest/gtest.h"
#include <initializer_list>
#include <memory>
using namespace llvm;
namespace {
struct TestCase {
int64_t Imm;
bool Result;
};
const std::initializer_list<TestCase> Tests = {
// ScalableImm, Result
// No change, easily 'supported'
{0, true},
// addvl increments by whole registers, range [-32,31]
// +(16 * vscale), one register's worth
{16, true},
// -(32 * 16 * vscale)
{-512, true},
// -(33 * 16 * vscale)
{-528, false},
// +(31 * 16 * vscale)
{496, true},
// +(32 * 16 * vscale)
{512, false},
// inc[h|w|d] increments by the number of 16/32/64bit elements in a
// register. mult_imm is in the range [1,16]
// +(mult_imm * num_elts * vscale)
// +(1 * 8 * vscale), 16 bit
{8, true},
// +(15 * 8 * vscale), 16 bit
{120, true},
// +(1 * 4 * vscale), 32 bit
{4, true},
// +(7 * 4 * vscale), 32 bit
{28, true},
// +(1 * 2 * vscale), 64 bit
{2, true},
// +(13 * 2 * vscale), 64 bit
{26, true},
// +(17 * 8 * vscale), 16 bit, out of range.
{136, false},
// +(19 * 2 * vscale), 64 bit, out of range.
{38, false},
// +(21 * 4 * vscale), 32 bit, out of range.
{84, false},
// dec[h|w|d] -- Same as above, but negative.
// -(mult_imm * num_elts * vscale)
// -(1 * 8 * vscale), 16 bit
{-8, true},
// -(15 * 8 * vscale), 16 bit
{-120, true},
// -(1 * 4 * vscale), 32 bit
{-4, true},
// -(7 * 4 * vscale), 32 bit
{-28, true},
// -(1 * 2 * vscale), 64 bit
{-2, true},
// -(13 * 2 * vscale), 64 bit
{-26, true},
// -(17 * 8 * vscale), 16 bit, out of range.
{-136, false},
// -(19 * 2 * vscale), 64 bit, out of range.
{-38, false},
// -(21 * 4 * vscale), 32 bit, out of range.
{-84, false},
// Invalid; not divisible by the above powers of 2.
{5, false},
};
} // namespace
TEST(Immediates, Immediates) {
LLVMInitializeAArch64TargetInfo();
LLVMInitializeAArch64Target();
LLVMInitializeAArch64TargetMC();
std::string Error;
Triple TT("aarch64");
const Target *T = TargetRegistry::lookupTarget(TT, Error);
std::unique_ptr<TargetMachine> TM(T->createTargetMachine(
TT, "generic", "+sve2", TargetOptions(), std::nullopt, std::nullopt,
CodeGenOptLevel::Default));
AArch64Subtarget ST(TM->getTargetTriple(), TM->getTargetCPU(),
TM->getTargetCPU(), TM->getTargetFeatureString(), *TM,
true);
auto *TLI = ST.getTargetLowering();
for (const auto &Test : Tests) {
ASSERT_EQ(TLI->isLegalAddScalableImmediate(Test.Imm), Test.Result);
}
}