[llvm-commits] [llvm] r151303 - in /llvm/trunk: lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp test/CodeGen/X86/2012-02-23-mmx-inlineasm.ll
Bill Wendling
isanbard at gmail.com
Thu Feb 23 15:25:25 PST 2012
Author: void
Date: Thu Feb 23 17:25:25 2012
New Revision: 151303
URL: http://llvm.org/viewvc/llvm-project?rev=151303&view=rev
Log:
Allow an integer to be converted into an MMX type when it's used in an inline
asm.
<rdar://problem/10106006>
Added:
llvm/trunk/test/CodeGen/X86/2012-02-23-mmx-inlineasm.ll
Modified:
llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp?rev=151303&r1=151302&r2=151303&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp Thu Feb 23 17:25:25 2012
@@ -352,10 +352,13 @@
assert(NumParts == 1 && "Do not know what to promote to!");
Val = DAG.getNode(ISD::FP_EXTEND, DL, PartVT, Val);
} else {
- assert(PartVT.isInteger() && ValueVT.isInteger() &&
+ assert((PartVT.isInteger() || PartVT == MVT::x86mmx) &&
+ ValueVT.isInteger() &&
"Unknown mismatch!");
ValueVT = EVT::getIntegerVT(*DAG.getContext(), NumParts * PartBits);
Val = DAG.getNode(ExtendKind, DL, ValueVT, Val);
+ if (PartVT == MVT::x86mmx)
+ Val = DAG.getNode(ISD::BITCAST, DL, PartVT, Val);
}
} else if (PartBits == ValueVT.getSizeInBits()) {
// Different types of the same size.
@@ -363,10 +366,13 @@
Val = DAG.getNode(ISD::BITCAST, DL, PartVT, Val);
} else if (NumParts * PartBits < ValueVT.getSizeInBits()) {
// If the parts cover less bits than value has, truncate the value.
- assert(PartVT.isInteger() && ValueVT.isInteger() &&
+ assert((PartVT.isInteger() || PartVT == MVT::x86mmx) &&
+ ValueVT.isInteger() &&
"Unknown mismatch!");
ValueVT = EVT::getIntegerVT(*DAG.getContext(), NumParts * PartBits);
Val = DAG.getNode(ISD::TRUNCATE, DL, ValueVT, Val);
+ if (PartVT == MVT::x86mmx)
+ Val = DAG.getNode(ISD::BITCAST, DL, PartVT, Val);
}
// The value may have changed - recompute ValueVT.
Added: llvm/trunk/test/CodeGen/X86/2012-02-23-mmx-inlineasm.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/2012-02-23-mmx-inlineasm.ll?rev=151303&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/X86/2012-02-23-mmx-inlineasm.ll (added)
+++ llvm/trunk/test/CodeGen/X86/2012-02-23-mmx-inlineasm.ll Thu Feb 23 17:25:25 2012
@@ -0,0 +1,12 @@
+; RUN: llc -mcpu=i686 -mattr=+mmx < %s | FileCheck %s
+; <rdar://problem/10106006>
+
+define void @func() nounwind ssp {
+; CHECK: psrlw %mm0, %mm1
+entry:
+ call void asm sideeffect "psrlw $0, %mm1", "y,~{dirflag},~{fpsr},~{flags}"(i32 8) nounwind
+ unreachable
+
+bb367: ; preds = %entry
+ ret void
+}
More information about the llvm-commits
mailing list