mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-28 14:10:41 +00:00
[PowerPC] Don't return unsupported register classes for asm constraints
As a follow-up to r251566, do the same for the other optionally-supported register classes (mostly for vector registers). Don't return an unavailable register class (which would cause an assert later), but fail cleanly when provided an unsupported inline asm constraint. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@251575 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
332db19551
commit
75c3afbe05
@ -10923,18 +10923,19 @@ PPCTargetLowering::getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
|
|||||||
return std::make_pair(0U, &PPC::QFRCRegClass);
|
return std::make_pair(0U, &PPC::QFRCRegClass);
|
||||||
if (VT == MVT::v4f32 && Subtarget.hasQPX())
|
if (VT == MVT::v4f32 && Subtarget.hasQPX())
|
||||||
return std::make_pair(0U, &PPC::QSRCRegClass);
|
return std::make_pair(0U, &PPC::QSRCRegClass);
|
||||||
return std::make_pair(0U, &PPC::VRRCRegClass);
|
if (Subtarget.hasAltivec())
|
||||||
|
return std::make_pair(0U, &PPC::VRRCRegClass);
|
||||||
case 'y': // crrc
|
case 'y': // crrc
|
||||||
return std::make_pair(0U, &PPC::CRRCRegClass);
|
return std::make_pair(0U, &PPC::CRRCRegClass);
|
||||||
}
|
}
|
||||||
} else if (Constraint == "wc" && Subtarget.useCRBits()) {
|
} else if (Constraint == "wc" && Subtarget.useCRBits()) {
|
||||||
// An individual CR bit.
|
// An individual CR bit.
|
||||||
return std::make_pair(0U, &PPC::CRBITRCRegClass);
|
return std::make_pair(0U, &PPC::CRBITRCRegClass);
|
||||||
} else if (Constraint == "wa" || Constraint == "wd" ||
|
} else if ((Constraint == "wa" || Constraint == "wd" ||
|
||||||
Constraint == "wf") {
|
Constraint == "wf") && Subtarget.hasVSX()) {
|
||||||
return std::make_pair(0U, &PPC::VSRCRegClass);
|
return std::make_pair(0U, &PPC::VSRCRegClass);
|
||||||
} else if (Constraint == "ws") {
|
} else if (Constraint == "ws" && Subtarget.hasVSX()) {
|
||||||
if (VT == MVT::f32)
|
if (VT == MVT::f32 && Subtarget.hasP8Vector())
|
||||||
return std::make_pair(0U, &PPC::VSSRCRegClass);
|
return std::make_pair(0U, &PPC::VSSRCRegClass);
|
||||||
else
|
else
|
||||||
return std::make_pair(0U, &PPC::VSFRCRegClass);
|
return std::make_pair(0U, &PPC::VSFRCRegClass);
|
||||||
|
14
test/CodeGen/PowerPC/vec-asm-disabled.ll
Normal file
14
test/CodeGen/PowerPC/vec-asm-disabled.ll
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
; RUN: not llc -mcpu=pwr7 -o /dev/null %s 2>&1 | FileCheck %s
|
||||||
|
target datalayout = "E-m:e-i64:64-n32:64"
|
||||||
|
target triple = "powerpc64-unknown-linux-gnu"
|
||||||
|
|
||||||
|
define <4 x i32> @testi1(<4 x i32> %b1, <4 x i32> %b2) #0 {
|
||||||
|
entry:
|
||||||
|
%0 = call <4 x i32> asm "xxland $0, $1, $2", "=^wd,^wd,^wd"(<4 x i32> %b1, <4 x i32> %b2) #0
|
||||||
|
ret <4 x i32> %0
|
||||||
|
|
||||||
|
; CHECK: error: couldn't allocate output register for constraint 'wd'
|
||||||
|
}
|
||||||
|
|
||||||
|
attributes #0 = { nounwind "target-features"="-vsx" }
|
||||||
|
|
Loading…
Reference in New Issue
Block a user