diff options
author | Igor Breger <igor.breger@intel.com> | 2017-03-03 08:06:46 +0000 |
---|---|---|
committer | Igor Breger <igor.breger@intel.com> | 2017-03-03 08:06:46 +0000 |
commit | 321cf3c65091c64f50d55ffb50817882cd908865 (patch) | |
tree | 379feec4d56b2793537c4c4d67b2c6c2a3e486e8 /llvm/lib/Target/X86/X86LegalizerInfo.cpp | |
parent | 6007b5f71370a43caf950068ab07db9abb78a840 (diff) | |
download | bcm5719-llvm-321cf3c65091c64f50d55ffb50817882cd908865.tar.gz bcm5719-llvm-321cf3c65091c64f50d55ffb50817882cd908865.zip |
[GlobalISel][X86] Support float/double and vector types.
Summary: [GlobalISel][X86] Add support for f32/f64 and vector types in RegisterBank and InstructionSelector.
Reviewers: delena, zvi
Reviewed By: zvi
Subscribers: dberris, rovka, llvm-commits, kristof.beyls
Differential Revision: https://reviews.llvm.org/D30533
llvm-svn: 296856
Diffstat (limited to 'llvm/lib/Target/X86/X86LegalizerInfo.cpp')
-rw-r--r-- | llvm/lib/Target/X86/X86LegalizerInfo.cpp | 41 |
1 files changed, 37 insertions, 4 deletions
diff --git a/llvm/lib/Target/X86/X86LegalizerInfo.cpp b/llvm/lib/Target/X86/X86LegalizerInfo.cpp index 5f63f8d4e98..06c11c84e35 100644 --- a/llvm/lib/Target/X86/X86LegalizerInfo.cpp +++ b/llvm/lib/Target/X86/X86LegalizerInfo.cpp @@ -19,6 +19,7 @@ #include "llvm/Target/TargetOpcodes.h" using namespace llvm; +using namespace TargetOpcode; #ifndef LLVM_BUILD_GLOBAL_ISEL #error "You shouldn't build this" @@ -28,6 +29,8 @@ X86LegalizerInfo::X86LegalizerInfo(const X86Subtarget &STI) : Subtarget(STI) { setLegalizerInfo32bit(); setLegalizerInfo64bit(); + setLegalizerInfoSSE1(); + setLegalizerInfoSSE2(); computeTables(); } @@ -39,8 +42,8 @@ void X86LegalizerInfo::setLegalizerInfo32bit() { const LLT s32 = LLT::scalar(32); for (auto Ty : {s8, s16, s32}) { - setAction({TargetOpcode::G_ADD, Ty}, Legal); - setAction({TargetOpcode::G_SUB, Ty}, Legal); + setAction({G_ADD, Ty}, Legal); + setAction({G_SUB, Ty}, Legal); } } @@ -51,6 +54,36 @@ void X86LegalizerInfo::setLegalizerInfo64bit() { const LLT s64 = LLT::scalar(64); - setAction({TargetOpcode::G_ADD, s64}, Legal); - setAction({TargetOpcode::G_SUB, s64}, Legal); + setAction({G_ADD, s64}, Legal); + setAction({G_SUB, s64}, Legal); +} + +void X86LegalizerInfo::setLegalizerInfoSSE1() { + if (!Subtarget.hasSSE1()) + return; + + const LLT s32 = LLT::scalar(32); + const LLT v4s32 = LLT::vector(4, 32); + + for (unsigned BinOp : {G_FADD, G_FSUB, G_FMUL, G_FDIV}) + for (auto Ty : {s32, v4s32}) + setAction({BinOp, Ty}, Legal); +} + +void X86LegalizerInfo::setLegalizerInfoSSE2() { + if (!Subtarget.hasSSE2()) + return; + + const LLT s64 = LLT::scalar(64); + const LLT v4s32 = LLT::vector(4, 32); + const LLT v2s64 = LLT::vector(2, 64); + + for (unsigned BinOp : {G_FADD, G_FSUB, G_FMUL, G_FDIV}) + for (auto Ty : {s64, v2s64}) + setAction({BinOp, Ty}, Legal); + + for (unsigned BinOp : {G_ADD, G_SUB}) + for (auto Ty : {v4s32}) + setAction({BinOp, Ty}, Legal); + } |