From 8048f0070d628d65eda7aedc953d200028e3b5aa Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Thu, 4 Jul 2019 04:44:42 +0000 Subject: [PATCH] [PowerPC] Support constraint code "ww" Summary: "ww" and "ws" are both constraint codes for VSX vector registers that hold scalar double data. "ww" is preferred for float while "ws" is preferred for double. Reviewed By: jsji Differential Revision: https://reviews.llvm.org/D64119 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@365106 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/PowerPC/PPCISelLowering.cpp | 10 ++++++---- test/CodeGen/PowerPC/inlineasm-vsx-reg.ll | 9 +++++++++ test/CodeGen/PowerPC/vec-asm-disabled.ll | 12 ++++++++++++ 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/lib/Target/PowerPC/PPCISelLowering.cpp b/lib/Target/PowerPC/PPCISelLowering.cpp index aad7ef6ef68..6252faf4be6 100644 --- a/lib/Target/PowerPC/PPCISelLowering.cpp +++ b/lib/Target/PowerPC/PPCISelLowering.cpp @@ -13962,7 +13962,7 @@ PPCTargetLowering::getConstraintType(StringRef Constraint) const { return C_RegisterClass; } else if (Constraint == "wa" || Constraint == "wd" || Constraint == "wf" || Constraint == "ws" || - Constraint == "wi") { + Constraint == "wi" || Constraint == "ww") { return C_RegisterClass; // VSX registers. } return TargetLowering::getConstraintType(Constraint); @@ -13990,10 +13990,12 @@ PPCTargetLowering::getSingleConstraintMatchWeight( StringRef(constraint) == "wf") && type->isVectorTy()) return CW_Register; - else if (StringRef(constraint) == "ws" && type->isDoubleTy()) - return CW_Register; else if (StringRef(constraint) == "wi" && type->isIntegerTy(64)) return CW_Register; // just hold 64-bit integers data. + else if (StringRef(constraint) == "ws" && type->isDoubleTy()) + return CW_Register; + else if (StringRef(constraint) == "ww" && type->isFloatTy()) + return CW_Register; switch (*constraint) { default: @@ -14079,7 +14081,7 @@ PPCTargetLowering::getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI, Constraint == "wf" || Constraint == "wi") && Subtarget.hasVSX()) { return std::make_pair(0U, &PPC::VSRCRegClass); - } else if (Constraint == "ws" && Subtarget.hasVSX()) { + } else if ((Constraint == "ws" || Constraint == "ww") && Subtarget.hasVSX()) { if (VT == MVT::f32 && Subtarget.hasP8Vector()) return std::make_pair(0U, &PPC::VSSRCRegClass); else diff --git a/test/CodeGen/PowerPC/inlineasm-vsx-reg.ll b/test/CodeGen/PowerPC/inlineasm-vsx-reg.ll index b3cbefa2dbd..088dda575c5 100644 --- a/test/CodeGen/PowerPC/inlineasm-vsx-reg.ll +++ b/test/CodeGen/PowerPC/inlineasm-vsx-reg.ll @@ -38,3 +38,12 @@ define double @test() { ; CHECK: mtvsrd v2, r1 ; CHECK: #NO_APP } + +define float @test_ww(float %x, float %y) { + %1 = tail call float asm "xsmaxdp ${0:x}, ${1:x}, ${2:x}", "=^ww,^ww,^ww"(float %x, float %y) + ret float %1 +; CHECK-LABEL: test_ww: +; CHECK: #APP +; CHECK: xsmaxdp f1, f1, f2 +; CHECK: #NO_APP +} diff --git a/test/CodeGen/PowerPC/vec-asm-disabled.ll b/test/CodeGen/PowerPC/vec-asm-disabled.ll index 614f3e3f03a..573abab9dcf 100644 --- a/test/CodeGen/PowerPC/vec-asm-disabled.ll +++ b/test/CodeGen/PowerPC/vec-asm-disabled.ll @@ -19,5 +19,17 @@ entry: ; CHECK: error: couldn't allocate output register for constraint 'wi' } +define float @test_ww(float %x, float %y) #0 { + %1 = tail call float asm "xsmaxdp ${0:x},${1:x},${2:x}", "=^ww,^ww,^ww"(float %x, float %y) #0 + ret float %1 +; CHECK: error: couldn't allocate output register for constraint 'ww' +} + +define double @test_ws(double %x, double %y) #0 { + %1 = tail call double asm "xsmaxdp ${0:x},${1:x},${2:x}", "=^ws,^ws,^ws"(double %x, double %y) #0 + ret double %1 +; CHECK: error: couldn't allocate output register for constraint 'ws' +} + attributes #0 = { nounwind "target-features"="-vsx" } -- 2.11.0