dtemirbulatov updated this revision to Diff 100089. dtemirbulatov added a comment.
add _mm256_cmp_pd double version add comments in lib/CodeGen/CGBuiltin.cpp replaced 0xf to _CMP_TRUE_UQ in avx-builtins.c https://reviews.llvm.org/D33406 Files: lib/CodeGen/CGBuiltin.cpp test/CodeGen/avx-builtins.c Index: test/CodeGen/avx-builtins.c =================================================================== --- test/CodeGen/avx-builtins.c +++ test/CodeGen/avx-builtins.c @@ -1427,3 +1427,15 @@ // CHECK: extractelement <8 x float> %{{.*}}, i32 0 return _mm256_cvtss_f32(__a); } + +__m256 test_mm256_cmp_ps_true(__m256 a, __m256 b) { + // CHECK-LABEL: @test_mm256_cmp_ps_true + // CHECK: store <8 x float> <float 0xFFFFFFFFE0000000, + return _mm256_cmp_ps(a, b, _CMP_TRUE_UQ); +} + +__m256 test_mm256_cmp_pd_true(__m256 a, __m256 b) { + // CHECK-LABEL: @test_mm256_cmp_pd_true + // CHECK: store <4 x double> <double 0xFFFFFFFFFFFFFFFF, + return _mm256_cmp_pd(a, b, _CMP_TRUE_UQ); +} Index: lib/CodeGen/CGBuiltin.cpp =================================================================== --- lib/CodeGen/CGBuiltin.cpp +++ lib/CodeGen/CGBuiltin.cpp @@ -7919,12 +7919,24 @@ ID = Intrinsic::x86_sse_cmp_ps; break; case X86::BI__builtin_ia32_cmpps256: + // _CMP_TRUE_UQ would produce -1,-1... vector on any input + if (CC == 0xf) { + Value *Vec = Builder.CreateVectorSplat(Ops[0]->getType()->getVectorNumElements(), + llvm::Constant::getAllOnesValue(Builder.getInt32Ty())); + return Builder.CreateBitCast(Vec, Ops[0]->getType()); + } ID = Intrinsic::x86_avx_cmp_ps_256; break; case X86::BI__builtin_ia32_cmppd: ID = Intrinsic::x86_sse2_cmp_pd; break; case X86::BI__builtin_ia32_cmppd256: + // _CMP_TRUE_UQ would produce -1,-1... vector on any input + if (CC == 0xf) { + Value *Vec = Builder.CreateVectorSplat(Ops[0]->getType()->getVectorNumElements(), + llvm::Constant::getAllOnesValue(Builder.getInt64Ty())); + return Builder.CreateBitCast(Vec, Ops[0]->getType()); + } ID = Intrinsic::x86_avx_cmp_pd_256; break; }
Index: test/CodeGen/avx-builtins.c =================================================================== --- test/CodeGen/avx-builtins.c +++ test/CodeGen/avx-builtins.c @@ -1427,3 +1427,15 @@ // CHECK: extractelement <8 x float> %{{.*}}, i32 0 return _mm256_cvtss_f32(__a); } + +__m256 test_mm256_cmp_ps_true(__m256 a, __m256 b) { + // CHECK-LABEL: @test_mm256_cmp_ps_true + // CHECK: store <8 x float> <float 0xFFFFFFFFE0000000, + return _mm256_cmp_ps(a, b, _CMP_TRUE_UQ); +} + +__m256 test_mm256_cmp_pd_true(__m256 a, __m256 b) { + // CHECK-LABEL: @test_mm256_cmp_pd_true + // CHECK: store <4 x double> <double 0xFFFFFFFFFFFFFFFF, + return _mm256_cmp_pd(a, b, _CMP_TRUE_UQ); +} Index: lib/CodeGen/CGBuiltin.cpp =================================================================== --- lib/CodeGen/CGBuiltin.cpp +++ lib/CodeGen/CGBuiltin.cpp @@ -7919,12 +7919,24 @@ ID = Intrinsic::x86_sse_cmp_ps; break; case X86::BI__builtin_ia32_cmpps256: + // _CMP_TRUE_UQ would produce -1,-1... vector on any input + if (CC == 0xf) { + Value *Vec = Builder.CreateVectorSplat(Ops[0]->getType()->getVectorNumElements(), + llvm::Constant::getAllOnesValue(Builder.getInt32Ty())); + return Builder.CreateBitCast(Vec, Ops[0]->getType()); + } ID = Intrinsic::x86_avx_cmp_ps_256; break; case X86::BI__builtin_ia32_cmppd: ID = Intrinsic::x86_sse2_cmp_pd; break; case X86::BI__builtin_ia32_cmppd256: + // _CMP_TRUE_UQ would produce -1,-1... vector on any input + if (CC == 0xf) { + Value *Vec = Builder.CreateVectorSplat(Ops[0]->getType()->getVectorNumElements(), + llvm::Constant::getAllOnesValue(Builder.getInt64Ty())); + return Builder.CreateBitCast(Vec, Ops[0]->getType()); + } ID = Intrinsic::x86_avx_cmp_pd_256; break; }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits