[llvm] [ARM] Improve comment on the 'J' inline asm modifier. (PR #160712)
Simon Tatham via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 25 07:20:04 PDT 2025
https://github.com/statham-arm created https://github.com/llvm/llvm-project/pull/160712
An inline asm constraint "Jr", in AArch32, means that if the input value is a compile-time constant in the range -4095 to +4095, then it can be inserted into the assembly language as an immediate operand, and otherwise it will be placed in a register.
The comment in the Arm backend said "It is not clear what this constraint is intended for". I believe the answer is that that range of immediate values are the ones you can use in a LDR or STR instruction. So it's suitable for cases like this:
asm("str %0,[%1,%2]" : : "r"(data), "r"(base), "Jr"(offset) : "memory");
in the same way that the "Ir" constraint is suitable for the immediate in a data-processing instruction such as ADD or EOR.
>From 25d7c8c35e155cbf5256ffeba9211b539c92ba60 Mon Sep 17 00:00:00 2001
From: Simon Tatham <simon.tatham at arm.com>
Date: Thu, 25 Sep 2025 15:07:21 +0100
Subject: [PATCH] [ARM] Improve comment on the 'J' inline asm modifier.
An inline asm constraint "Jr", in AArch32, means that if the input
value is a compile-time constant in the range -4095 to +4095, then it
can be inserted into the assembly language as an immediate operand,
and otherwise it will be placed in a register.
The comment in the Arm backend said "It is not clear what this
constraint is intended for". I believe the answer is that that range
of immediate values are the ones you can use in a LDR or STR
instruction. So it's suitable for cases like this:
asm("str %0,[%1,%2]" : : "r"(data), "r"(base), "Jr"(offset) : "memory");
in the same way that the "Ir" constraint is suitable for the immediate
in a data-processing instruction such as ADD or EOR.
---
llvm/lib/Target/ARM/ARMISelLowering.cpp | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp
index 9a247bb5a83d9..c283b0c77872e 100644
--- a/llvm/lib/Target/ARM/ARMISelLowering.cpp
+++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp
@@ -20428,9 +20428,9 @@ void ARMTargetLowering::LowerAsmOperandForConstraint(SDValue Op,
if (CVal >= -255 && CVal <= -1)
break;
} else {
- // This must be a constant between -4095 and 4095. It is not clear
- // what this constraint is intended for. Implemented for
- // compatibility with GCC.
+ // This must be a constant between -4095 and 4095. This is suitable
+ // for use as the immediate offset field in LDR and STR instructions
+ // such as LDR r0,[r1,#offset].
if (CVal >= -4095 && CVal <= 4095)
break;
}
More information about the llvm-commits
mailing list