diff options
author | Craig Topper <craig.topper@intel.com> | 2018-07-13 21:03:43 +0000 |
---|---|---|
committer | Craig Topper <craig.topper@intel.com> | 2018-07-13 21:03:43 +0000 |
commit | f0831eef0b35e5296a1741078f1bebc255a7ff25 (patch) | |
tree | 24dbc02f67ea5c067b1bf3cc13e50b63694942ff /llvm/lib/Target/X86/X86FastISel.cpp | |
parent | ddf998b608a4af753338adecb84e62d1e0207a1e (diff) | |
download | bcm5719-llvm-f0831eef0b35e5296a1741078f1bebc255a7ff25.tar.gz bcm5719-llvm-f0831eef0b35e5296a1741078f1bebc255a7ff25.zip |
[X86][FastISel] Add EVEX support to sitofp handling.
llvm-svn: 337045
Diffstat (limited to 'llvm/lib/Target/X86/X86FastISel.cpp')
-rw-r--r-- | llvm/lib/Target/X86/X86FastISel.cpp | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/llvm/lib/Target/X86/X86FastISel.cpp b/llvm/lib/Target/X86/X86FastISel.cpp index d65d81b17f4..acbf01b3318 100644 --- a/llvm/lib/Target/X86/X86FastISel.cpp +++ b/llvm/lib/Target/X86/X86FastISel.cpp @@ -2417,8 +2417,9 @@ bool X86FastISel::X86SelectSIToFP(const Instruction *I) { if (!Subtarget->hasAVX()) return false; - Type *InTy = I->getOperand(0)->getType(); - if (!InTy->isIntegerTy(32) && !InTy->isIntegerTy(64)) + // TODO: We could sign extend narrower types. + MVT SrcVT = TLI.getSimpleValueType(DL, I->getOperand(0)->getType()); + if (SrcVT != MVT::i32 && SrcVT != MVT::i64) return false; // Select integer to float/double conversion. @@ -2426,20 +2427,28 @@ bool X86FastISel::X86SelectSIToFP(const Instruction *I) { if (OpReg == 0) return false; - const TargetRegisterClass *RC = nullptr; unsigned Opcode; + static const uint16_t CvtOpc[2][2][2] = { + { { X86::VCVTSI2SSrr, X86::VCVTSI642SSrr }, + { X86::VCVTSI2SDrr, X86::VCVTSI642SDrr } }, + { { X86::VCVTSI2SSZrr, X86::VCVTSI642SSZrr }, + { X86::VCVTSI2SDZrr, X86::VCVTSI642SDZrr } }, + }; + bool HasAVX512 = Subtarget->hasAVX512(); + bool Is64Bit = SrcVT == MVT::i64; + if (I->getType()->isDoubleTy()) { // sitofp int -> double - Opcode = InTy->isIntegerTy(64) ? X86::VCVTSI642SDrr : X86::VCVTSI2SDrr; - RC = &X86::FR64RegClass; + Opcode = CvtOpc[HasAVX512][1][Is64Bit]; } else if (I->getType()->isFloatTy()) { // sitofp int -> float - Opcode = InTy->isIntegerTy(64) ? X86::VCVTSI642SSrr : X86::VCVTSI2SSrr; - RC = &X86::FR32RegClass; + Opcode = CvtOpc[HasAVX512][0][Is64Bit]; } else return false; + MVT DstVT = TLI.getValueType(DL, I->getType()).getSimpleVT(); + const TargetRegisterClass *RC = TLI.getRegClassFor(DstVT); unsigned ImplicitDefReg = createResultReg(RC); BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, TII.get(TargetOpcode::IMPLICIT_DEF), ImplicitDefReg); |