diff options
| author | Craig Topper <craig.topper@intel.com> | 2018-08-28 06:28:25 +0000 |
|---|---|---|
| committer | Craig Topper <craig.topper@intel.com> | 2018-08-28 06:28:25 +0000 |
| commit | cb5fd56c7f29e3785e851fd7cbc8c361a7fd5368 (patch) | |
| tree | 6e8183f2bd8fada32d9201afa03aa97e853890a4 /clang/lib/CodeGen | |
| parent | c7506b28c11b4a382bd499c21ef5e6aac8c3c29f (diff) | |
| download | bcm5719-llvm-cb5fd56c7f29e3785e851fd7cbc8c361a7fd5368.tar.gz bcm5719-llvm-cb5fd56c7f29e3785e851fd7cbc8c361a7fd5368.zip | |
[X86] Add kortest intrinsics for 8, 32, and 64 bit masks. Add new intrinsic names for 16 bit masks.
This matches gcc and icc despite not being documented in the Intel Intrinsics Guide.
llvm-svn: 340798
Diffstat (limited to 'clang/lib/CodeGen')
| -rw-r--r-- | clang/lib/CodeGen/CGBuiltin.cpp | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 46c073e2053..116863af678 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -10012,14 +10012,21 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID, return EmitX86MaskedCompare(*this, CC, false, Ops); } + case X86::BI__builtin_ia32_kortestcqi: case X86::BI__builtin_ia32_kortestchi: - case X86::BI__builtin_ia32_kortestzhi: { + case X86::BI__builtin_ia32_kortestcsi: + case X86::BI__builtin_ia32_kortestcdi: { Value *Or = EmitX86MaskLogic(*this, Instruction::Or, Ops); - Value *C; - if (BuiltinID == X86::BI__builtin_ia32_kortestchi) - C = llvm::Constant::getAllOnesValue(Builder.getInt16Ty()); - else - C = llvm::Constant::getNullValue(Builder.getInt16Ty()); + Value *C = llvm::Constant::getAllOnesValue(Ops[0]->getType()); + Value *Cmp = Builder.CreateICmpEQ(Or, C); + return Builder.CreateZExt(Cmp, ConvertType(E->getType())); + } + case X86::BI__builtin_ia32_kortestzqi: + case X86::BI__builtin_ia32_kortestzhi: + case X86::BI__builtin_ia32_kortestzsi: + case X86::BI__builtin_ia32_kortestzdi: { + Value *Or = EmitX86MaskLogic(*this, Instruction::Or, Ops); + Value *C = llvm::Constant::getNullValue(Ops[0]->getType()); Value *Cmp = Builder.CreateICmpEQ(Or, C); return Builder.CreateZExt(Cmp, ConvertType(E->getType())); } |

