diff options
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 4 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86RegisterInfo.cpp | 1 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86RegisterInfo.td | 4 | ||||
| -rw-r--r-- | llvm/test/CodeGen/X86/inline-asm-avx512f-x-constraint.ll | 10 | 
4 files changed, 18 insertions, 1 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 514df8ccc09..6464b8ee065 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -43730,7 +43730,9 @@ X86TargetLowering::getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,        case MVT::v16f32:        case MVT::v16i32:        case MVT::v8i64: -        return std::make_pair(0U, &X86::VR512RegClass); +        if (VConstraint) +          return std::make_pair(0U, &X86::VR512RegClass); +        return std::make_pair(0U, &X86::VR512_0_15RegClass);        }        break;      } diff --git a/llvm/lib/Target/X86/X86RegisterInfo.cpp b/llvm/lib/Target/X86/X86RegisterInfo.cpp index 9f5f22b5610..7dec87cdcb0 100644 --- a/llvm/lib/Target/X86/X86RegisterInfo.cpp +++ b/llvm/lib/Target/X86/X86RegisterInfo.cpp @@ -163,6 +163,7 @@ X86RegisterInfo::getLargestLegalSuperClass(const TargetRegisterClass *RC,      case X86::RFP32RegClassID:      case X86::RFP64RegClassID:      case X86::RFP80RegClassID: +    case X86::VR512_0_15RegClassID:      case X86::VR512RegClassID:        // Don't return a super-class that would shrink the spill size.        // That can happen with the vector and float classes. diff --git a/llvm/lib/Target/X86/X86RegisterInfo.td b/llvm/lib/Target/X86/X86RegisterInfo.td index e03f0492cd7..c0acff9c8c3 100644 --- a/llvm/lib/Target/X86/X86RegisterInfo.td +++ b/llvm/lib/Target/X86/X86RegisterInfo.td @@ -570,6 +570,10 @@ def DFCCR : RegisterClass<"X86", [i32], 32, (add DF)> {  def VR512 : RegisterClass<"X86", [v16f32, v8f64, v64i8, v32i16, v16i32, v8i64],                            512, (sequence "ZMM%u", 0, 31)>; +// Represents the lower 16 registers that have VEX/legacy encodable subregs. +def VR512_0_15 : RegisterClass<"X86", [v16f32, v8f64, v64i8, v32i16, v16i32, v8i64], +                               512, (sequence "ZMM%u", 0, 15)>; +  // Scalar AVX-512 floating point registers.  def FR32X : RegisterClass<"X86", [f32], 32, (sequence "XMM%u", 0, 31)>; diff --git a/llvm/test/CodeGen/X86/inline-asm-avx512f-x-constraint.ll b/llvm/test/CodeGen/X86/inline-asm-avx512f-x-constraint.ll new file mode 100644 index 00000000000..2f711a86bc2 --- /dev/null +++ b/llvm/test/CodeGen/X86/inline-asm-avx512f-x-constraint.ll @@ -0,0 +1,10 @@ +; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512f -stop-after=expand-isel-pseudos | FileCheck %s + +; CHECK: %[[REG1:.*]]:vr512_0_15 = COPY %1 +; CHECK: %[[REG2:.*]]:vr512_0_15 = COPY %2 +; CHECK: INLINEASM &"vpaddq\09$3, $2, $0 {$1}", 0, 7340042, def %{{.*}}, 1179657, %{{.*}}, 7340041, %[[REG1]], 7340041, %[[REG2]], 12, implicit-def early-clobber $df, 12, implicit-def early-clobber $fpsw, 12, implicit-def early-clobber $eflags +define <8 x i64> @mask_Yk_i8(i8 signext %msk, <8 x i64> %x, <8 x i64> %y) { +entry: +  %0 = tail call <8 x i64> asm "vpaddq\09$3, $2, $0 {$1}", "=x,^Yk,x,x,~{dirflag},~{fpsr},~{flags}"(i8 %msk, <8 x i64> %x, <8 x i64> %y) +  ret <8 x i64> %0 +}  | 

