summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJack Carter <jcarter@mips.com>2012-06-21 21:37:54 +0000
committerJack Carter <jcarter@mips.com>2012-06-21 21:37:54 +0000
commit4db98becf798a013ee00b82691af154e261d648e (patch)
tree9fd7866078a3928defba8b05882d0b39566a1e63
parent2b3e9580536dfb5666b9d91e99baebf6d45bfa5f (diff)
downloadllvm-4db98becf798a013ee00b82691af154e261d648e.tar.gz
llvm-4db98becf798a013ee00b82691af154e261d648e.tar.bz2
llvm-4db98becf798a013ee00b82691af154e261d648e.tar.xz
The inline asm operand modifier 'n' is suppose
to be generic across architectures. It has the following description in the gnu sources: Negate the immediate constant Several Architectures such as x86 have local implementations of operand modifier 'n' which go beyond the above description slightly. This won't affect them. Affected files: lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp Added 'n' to the switch cases. test/CodeGen/Generic/asm-large-immediate.ll Generic compiled test (x86 for me) test/CodeGen/Mips/asm-large-immediate.ll Mips compiled version of the generic one Contributer: Jack Carter git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@158939 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp7
-rw-r--r--test/CodeGen/Generic/asm-large-immediate.ll5
-rw-r--r--test/CodeGen/Mips/asm-large-immediate.ll4
3 files changed, 12 insertions, 4 deletions
diff --git a/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp b/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp
index 58716b725b..db43b06c70 100644
--- a/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp
+++ b/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp
@@ -420,10 +420,15 @@ bool AsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
default:
return true; // Unknown modifier.
case 'c': // Substitute immediate value without immediate syntax
- if ((MO.getType()) != MachineOperand::MO_Immediate)
+ if (MO.getType() != MachineOperand::MO_Immediate)
return true;
O << MO.getImm();
return false;
+ case 'n': // Negate the immediate constant.
+ if (MO.getType() != MachineOperand::MO_Immediate)
+ return true;
+ O << -MO.getImm();
+ return false;
}
}
return true;
diff --git a/test/CodeGen/Generic/asm-large-immediate.ll b/test/CodeGen/Generic/asm-large-immediate.ll
index 605665bef6..d5d5eb6981 100644
--- a/test/CodeGen/Generic/asm-large-immediate.ll
+++ b/test/CodeGen/Generic/asm-large-immediate.ll
@@ -1,8 +1,11 @@
-; RUN: llc < %s | grep 68719476738
+; RUN: llc < %s | FileCheck %s
define void @test() {
entry:
+; CHECK: /* result: 68719476738 */
tail call void asm sideeffect "/* result: ${0:c} */", "i,~{dirflag},~{fpsr},~{flags}"( i64 68719476738 )
+; CHECK: /* result: -68719476738 */
+ tail call void asm sideeffect "/* result: ${0:n} */", "i,~{dirflag},~{fpsr},~{flags}"( i64 68719476738 )
ret void
}
diff --git a/test/CodeGen/Mips/asm-large-immediate.ll b/test/CodeGen/Mips/asm-large-immediate.ll
index d9bb0cab82..246fff615e 100644
--- a/test/CodeGen/Mips/asm-large-immediate.ll
+++ b/test/CodeGen/Mips/asm-large-immediate.ll
@@ -1,10 +1,10 @@
-; RUNx: llc -march=mipsel < %s | grep 68719476738
-
; RUN: llc -march=mipsel < %s | FileCheck %s
define void @test() {
entry:
; CHECK: /* result: 68719476738 */
tail call void asm sideeffect "/* result: ${0:c} */", "i,~{dirflag},~{fpsr},~{flags}"( i64 68719476738 )
+; CHECK: /* result: -68719476738 */
+ tail call void asm sideeffect "/* result: ${0:n} */", "i,~{dirflag},~{fpsr},~{flags}"( i64 68719476738 )
ret void
}