mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 17:32:36 +00:00
Allow an integer to be converted into an MMX type when it's used in an inline
asm. <rdar://problem/10106006> llvm-svn: 151303
This commit is contained in:
parent
af1ee4da6c
commit
1a35321235
@ -352,10 +352,13 @@ static void getCopyToParts(SelectionDAG &DAG, DebugLoc DL,
|
||||
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 @@ static void getCopyToParts(SelectionDAG &DAG, DebugLoc DL,
|
||||
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.
|
||||
|
12
test/CodeGen/X86/2012-02-23-mmx-inlineasm.ll
Normal file
12
test/CodeGen/X86/2012-02-23-mmx-inlineasm.ll
Normal file
@ -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
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user