[llvm] b8d37cb - [AArch64] Add an OPERAND_IMM_UINT8 operand type. (#209050)
via llvm-commits
llvm-commits at lists.llvm.org
Sun Jul 12 12:57:37 PDT 2026
Author: David Green
Date: 2026-07-12T20:57:32+01:00
New Revision: b8d37cbc139a5adcd56611c21850e02600e560f2
URL: https://github.com/llvm/llvm-project/commit/b8d37cbc139a5adcd56611c21850e02600e560f2
DIFF: https://github.com/llvm/llvm-project/commit/b8d37cbc139a5adcd56611c21850e02600e560f2.diff
LOG: [AArch64] Add an OPERAND_IMM_UINT8 operand type. (#209050)
This helps verify that certain operands are in the correct range, in
this case
0-255.
Added:
Modified:
llvm/lib/Target/AArch64/AArch64InstrFormats.td
llvm/lib/Target/AArch64/AArch64InstrInfo.cpp
llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCTargetDesc.h
llvm/test/CodeGen/AArch64/verify-imm.mir
llvm/tools/llvm-exegesis/lib/AArch64/Target.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Target/AArch64/AArch64InstrFormats.td b/llvm/lib/Target/AArch64/AArch64InstrFormats.td
index cc599a5c9dc6f..30d7c291ca4d4 100644
--- a/llvm/lib/Target/AArch64/AArch64InstrFormats.td
+++ b/llvm/lib/Target/AArch64/AArch64InstrFormats.td
@@ -1531,6 +1531,8 @@ def fpimm16 : Operand<f16>,
}], fpimm16XForm> {
let ParserMatchClass = FPImmOperand;
let PrintMethod = "printFPImmOperand";
+ let OperandType = "OPERAND_IMM_UINT8";
+ let OperandNamespace = "AArch64";
}
def fpimmbf16 : Operand<bf16>,
@@ -1544,6 +1546,8 @@ def fpimm32 : Operand<f32>,
}], fpimm32XForm> {
let ParserMatchClass = FPImmOperand;
let PrintMethod = "printFPImmOperand";
+ let OperandType = "OPERAND_IMM_UINT8";
+ let OperandNamespace = "AArch64";
}
def fpimm32SIMDModImmType4 : FPImmLeaf<f32, [{
@@ -1558,12 +1562,15 @@ def fpimm64 : Operand<f64>,
}], fpimm64XForm> {
let ParserMatchClass = FPImmOperand;
let PrintMethod = "printFPImmOperand";
+ let OperandType = "OPERAND_IMM_UINT8";
+ let OperandNamespace = "AArch64";
}
def fpimm8 : Operand<i32> {
let ParserMatchClass = FPImmOperand;
let PrintMethod = "printFPImmOperand";
- let OperandType = "OPERAND_IMMEDIATE";
+ let OperandType = "OPERAND_IMM_UINT8";
+ let OperandNamespace = "AArch64";
}
def fpimm0 : FPImmLeaf<fAny, [{
diff --git a/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp b/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp
index e8c8fa0a2f643..0a07af216b852 100644
--- a/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp
+++ b/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp
@@ -12141,6 +12141,12 @@ bool AArch64InstrInfo::verifyInstruction(const MachineInstr &MI,
return false;
}
break;
+ case AArch64::OPERAND_IMM_UINT8:
+ if (!MO.isImm() || !isUInt<8>(MO.getImm())) {
+ ErrInfo = "OPERAND_IMM_UINT8 should be in the range 0 to 255";
+ return false;
+ }
+ break;
default:
break;
}
diff --git a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCTargetDesc.h b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCTargetDesc.h
index f6d9855e78612..4e5544e9ba64f 100644
--- a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCTargetDesc.h
+++ b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCTargetDesc.h
@@ -73,6 +73,7 @@ enum OperandType {
OPERAND_SHIFT_MSL,
OPERAND_SHIFTED_REGISTER,
OPERAND_SHIFTED_IMMEDIATE,
+ OPERAND_IMM_UINT8,
};
} // namespace AArch64
diff --git a/llvm/test/CodeGen/AArch64/verify-imm.mir b/llvm/test/CodeGen/AArch64/verify-imm.mir
index ab7c4fb950d50..5306155ceb3b0 100644
--- a/llvm/test/CodeGen/AArch64/verify-imm.mir
+++ b/llvm/test/CodeGen/AArch64/verify-imm.mir
@@ -6,6 +6,14 @@
# CHECK: - instruction: $q0 = MOVIv4s_msl 55, 8
# CHECK: *** Bad machine code: OPERAND_IMPLICIT_IMM_0 should be 0 ***
# CHECK: - instruction: $zad0 = MOVA_MXI2Z_V_D $zad0(tied-def 0), $w12, 1, $z0_z1
+# CHECK: *** Bad machine code: OPERAND_IMM_UINT8 should be in the range 0 to 255 ***
+# CHECK: - instruction: $h0 = FMOVHi 256
+# CHECK: *** Bad machine code: OPERAND_IMM_UINT8 should be in the range 0 to 255 ***
+# CHECK: - instruction: $s0 = FMOVSi -1
+# CHECK: *** Bad machine code: OPERAND_IMM_UINT8 should be in the range 0 to 255 ***
+# CHECK: - instruction: $d0 = FMOVDi 256
+# CHECK: *** Bad machine code: OPERAND_IMM_UINT8 should be in the range 0 to 255 ***
+# CHECK: - instruction: $q0 = FMOVv2f64_ns 256
---
name: verifyImm
@@ -18,5 +26,9 @@ body: |
$d0 = MOVIv2s_msl 55, 262
$q0 = MOVIv4s_msl 55, 8
$zad0 = MOVA_MXI2Z_V_D $zad0, $w12, 1, $z0_z1
+ $h0 = FMOVHi 256
+ $s0 = FMOVSi -1
+ $d0 = FMOVDi 256
+ $q0 = FMOVv2f64_ns 256
RET undef $lr, implicit $x0
...
diff --git a/llvm/tools/llvm-exegesis/lib/AArch64/Target.cpp b/llvm/tools/llvm-exegesis/lib/AArch64/Target.cpp
index 3b2487d1fe2f8..a6a92e5674f41 100644
--- a/llvm/tools/llvm-exegesis/lib/AArch64/Target.cpp
+++ b/llvm/tools/llvm-exegesis/lib/AArch64/Target.cpp
@@ -351,6 +351,9 @@ Error ExegesisAArch64Target::randomizeTargetMCOperand(
case llvm::AArch64::OPERAND_SHIFTED_IMMEDIATE:
AssignedValue = MCOperand::createImm(0);
return Error::success();
+ case llvm::AArch64::OPERAND_IMM_UINT8:
+ AssignedValue = MCOperand::createImm(1);
+ return Error::success();
case MCOI::OperandType::OPERAND_PCREL:
AssignedValue = MCOperand::createImm(8);
return Error::success();
More information about the llvm-commits
mailing list