Author: rksimon Date: Fri Jun 17 09:28:16 2016 New Revision: 273003 URL: http://llvm.org/viewvc/llvm-project?rev=273003&view=rev Log: [X86][SSE4A] Use native IR for mask movntsd/movntss intrinsics.
Depends on llvm side commit r273002. Modified: cfe/trunk/lib/CodeGen/CGBuiltin.cpp cfe/trunk/test/CodeGen/sse4a-builtins.c Modified: cfe/trunk/lib/CodeGen/CGBuiltin.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGBuiltin.cpp?rev=273003&r1=273002&r2=273003&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CGBuiltin.cpp (original) +++ cfe/trunk/lib/CodeGen/CGBuiltin.cpp Fri Jun 17 09:28:16 2016 @@ -6848,6 +6848,26 @@ Value *CodeGenFunction::EmitX86BuiltinEx SI->setAlignment(1); return SI; } + case X86::BI__builtin_ia32_movntsd: + case X86::BI__builtin_ia32_movntss: { + llvm::MDNode *Node = llvm::MDNode::get( + getLLVMContext(), llvm::ConstantAsMetadata::get(Builder.getInt32(1))); + + // Extract the 0'th element of the source vector. + Value *Scl = Builder.CreateExtractElement(Ops[1], (uint64_t)0, "extract"); + + // Convert the type of the pointer to a pointer to the stored type. + Value *BC = Builder.CreateBitCast(Ops[0], + llvm::PointerType::getUnqual(Scl->getType()), + "cast"); + + // Unaligned nontemporal store of the scalar value. + StoreInst *SI = Builder.CreateDefaultAlignedStore(Scl, BC); + SI->setMetadata(CGM.getModule().getMDKindID("nontemporal"), Node); + SI->setAlignment(1); + return SI; + } + case X86::BI__builtin_ia32_selectb_128: case X86::BI__builtin_ia32_selectb_256: case X86::BI__builtin_ia32_selectb_512: Modified: cfe/trunk/test/CodeGen/sse4a-builtins.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/sse4a-builtins.c?rev=273003&r1=273002&r2=273003&view=diff ============================================================================== --- cfe/trunk/test/CodeGen/sse4a-builtins.c (original) +++ cfe/trunk/test/CodeGen/sse4a-builtins.c Fri Jun 17 09:28:16 2016 @@ -33,12 +33,14 @@ __m128i test_mm_insert_si64(__m128i x, _ void test_mm_stream_sd(double *p, __m128d a) { // CHECK-LABEL: test_mm_stream_sd - // CHECK: call void @llvm.x86.sse4a.movnt.sd(i8* %{{[^,]+}}, <2 x double> %{{[^,]+}}) - _mm_stream_sd(p, a); + // CHECK: extractelement <2 x double> %{{.*}}, i64 0 + // CHECK: store double %{{.*}}, double* %{{.*}}, align 1, !nontemporal + _mm_stream_sd(p, a); } void test_mm_stream_ss(float *p, __m128 a) { // CHECK-LABEL: test_mm_stream_ss - // CHECK: call void @llvm.x86.sse4a.movnt.ss(i8* %{{[^,]+}}, <4 x float> %{{[^,]+}}) + // CHECK: extractelement <4 x float> %{{.*}}, i64 0 + // CHECK: store float %{{.*}}, float* %{{.*}}, align 1, !nontemporal _mm_stream_ss(p, a); } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits