[PATCH] D81767: [PPCAsmPrinter] support 'L' output template for memory operands
Nick Desaulniers via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 12 14:49:52 PDT 2020
nickdesaulniers created this revision.
nickdesaulniers added reviewers: echristo, hfinkel.
Herald added subscribers: llvm-commits, steven.zhang, kbarton, hiraditya, nemanjai.
Herald added a project: LLVM.
This is required for build 32b PowerPC Linux kernels after upstream
commit 334710b1496a ("powerpc/uaccess: Implement unsafe_put_user() using 'asm goto'")
Thanks for the report from @nathanchance, and reference to GCC's
implementation from @segher.
Fixes: pr/46186
Fixes: https://github.com/ClangBuiltLinux/linux/issues/1044
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D81767
Files:
llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp
llvm/test/CodeGen/PowerPC/inlineasm-output-template.ll
Index: llvm/test/CodeGen/PowerPC/inlineasm-output-template.ll
===================================================================
--- llvm/test/CodeGen/PowerPC/inlineasm-output-template.ll
+++ llvm/test/CodeGen/PowerPC/inlineasm-output-template.ll
@@ -24,3 +24,12 @@
tail call void asm sideeffect "#TEST ${0:n}", "i"(i32 42)
ret i32 42
}
+
+; Test that the machine specific %L works with memory operands.
+; CHECK-LABEL: test_inlineasm_L_output_template
+; CHECK: stw 3, 0(5)
+; CHECK-NEXT: stw 4, 4(5)
+define dso_local void @test_inlineasm_L_output_template(i64 %0, i64* %1) local_unnamed_addr #0 {
+ tail call void asm sideeffect "stw${1:X} $0, $1\0A\09stw${1:X} ${0:L}, ${1:L}", "r,*m"(i64 %0, i64* %1)
+ ret void
+}
Index: llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp
===================================================================
--- llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp
+++ llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp
@@ -282,14 +282,17 @@
switch (ExtraCode[0]) {
default: return true; // Unknown modifier.
- case 'y': { // A memory reference for an X-form instruction
+ case 'L':
+ O << getDataLayout().getPointerSize() << "(";
+ printOperand(MI, OpNo, O);
+ O << ")";
+ return false;
+ case 'y': // A memory reference for an X-form instruction
O << "0, ";
printOperand(MI, OpNo, O);
return false;
- }
case 'U': // Print 'u' for update form.
case 'X': // Print 'x' for indexed form.
- {
// FIXME: Currently for PowerPC memory operands are always loaded
// into a register, so we never get an update or indexed form.
// This is bad even for offset forms, since even if we know we
@@ -299,7 +302,6 @@
assert(MI->getOperand(OpNo).isReg());
return false;
}
- }
}
assert(MI->getOperand(OpNo).isReg());
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D81767.270520.patch
Type: text/x-patch
Size: 1860 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200612/d905eb09/attachment.bin>
More information about the llvm-commits
mailing list