[llvm] [SPARC] Implement L and H inline asm argument modifiers (PR #87259)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Apr 1 16:38:04 PDT 2024
================
@@ -434,6 +434,48 @@ bool SparcAsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
default:
// See if this is a generic print operand
return AsmPrinter::PrintAsmOperand(MI, OpNo, ExtraCode, O);
+ case 'L': // Low order register of a twin word register operand
+ case 'H': // High order register of a twin word register operand
+ {
+ if (OpNo == 0)
+ return true;
+
+ const SparcSubtarget &Subtarget = MF->getSubtarget<SparcSubtarget>();
+ const MachineOperand &MO = MI->getOperand(OpNo);
+ const Register MOReg = MO.getReg();
+
+ Register HiReg, LoReg;
+ if (SP::IntPairRegClass.contains(MOReg)) {
+ // If we're given a register pair, decompose it
+ // to its constituents and use them as-is.
+ const SparcRegisterInfo *RegisterInfo = Subtarget.getRegisterInfo();
+ HiReg = RegisterInfo->getSubReg(MOReg, SP::sub_even);
+ LoReg = RegisterInfo->getSubReg(MOReg, SP::sub_odd);
+ } else {
+ // Otherwise we should be given an even-numbered register,
+ // which will become the Hi part of the pair.
+ HiReg = MOReg;
+ LoReg = MOReg + 1;
+
+ // FIXME this really should not be an assert check, but
----------------
koachan wrote:
This works (in the sense that I have a message output) but I can't find any suitable SMLoc to use so it can't pinpoint the error location properly. Would this be okay?
https://github.com/llvm/llvm-project/pull/87259
More information about the llvm-commits
mailing list