diff --git a/clang/include/clang/Basic/BuiltinsX86.def b/clang/include/clang/Basic/BuiltinsX86.def --- a/clang/include/clang/Basic/BuiltinsX86.def +++ b/clang/include/clang/Basic/BuiltinsX86.def @@ -44,6 +44,12 @@ TARGET_BUILTIN(__builtin_ia32_readeflags_u32, "Ui", "n", "") TARGET_BUILTIN(__builtin_ia32_writeeflags_u32, "vUi", "n", "") +// FIXME: _mm_prefetch is a built-in because it takes a compile-time constant +// argument and our prior approach of using a #define to __builtin_prefetch +// doesn't work in the presence of re-declaration of _mm_prefetch in windows +// headers. +TARGET_BUILTIN(_mm_prefetch, "vcC*i", "nc", "") + // 3DNow! // TARGET_BUILTIN(__builtin_ia32_femms, "v", "n", "3dnow") @@ -74,118 +80,13 @@ TARGET_BUILTIN(__builtin_ia32_pswapdsf, "V2fV2f", "ncV:64:", "3dnowa") TARGET_BUILTIN(__builtin_ia32_pswapdsi, "V2iV2i", "ncV:64:", "3dnowa") -// MMX -// -// All MMX instructions will be generated via builtins. Any MMX vector -// types (<1 x i64>, <2 x i32>, etc.) that aren't used by these builtins will be -// expanded by the back-end. -// FIXME: _mm_prefetch must be a built-in because it takes a compile-time constant -// argument and our prior approach of using a #define to the current built-in -// doesn't work in the presence of re-declaration of _mm_prefetch for windows. -TARGET_BUILTIN(_mm_prefetch, "vcC*i", "nc", "mmx") +// MMX usage is no longer supported in Clang; all of the formerly "MMX" +// intrinsic functions are now expanded into SSE2 code in the headers. + TARGET_BUILTIN(__builtin_ia32_emms, "v", "n", "mmx") -TARGET_BUILTIN(__builtin_ia32_paddb, "V8cV8cV8c", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_paddw, "V4sV4sV4s", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_paddd, "V2iV2iV2i", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_paddsb, "V8cV8cV8c", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_paddsw, "V4sV4sV4s", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_paddusb, "V8cV8cV8c", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_paddusw, "V4sV4sV4s", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_psubb, "V8cV8cV8c", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_psubw, "V4sV4sV4s", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_psubd, "V2iV2iV2i", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_psubsb, "V8cV8cV8c", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_psubsw, "V4sV4sV4s", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_psubusb, "V8cV8cV8c", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_psubusw, "V4sV4sV4s", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_pmulhw, "V4sV4sV4s", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_pmullw, "V4sV4sV4s", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_pmaddwd, "V2iV4sV4s", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_pand, "V1OiV1OiV1Oi", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_pandn, "V1OiV1OiV1Oi", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_por, "V1OiV1OiV1Oi", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_pxor, "V1OiV1OiV1Oi", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_psllw, "V4sV4sV1Oi", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_pslld, "V2iV2iV1Oi", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_psllq, "V1OiV1OiV1Oi", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_psrlw, "V4sV4sV1Oi", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_psrld, "V2iV2iV1Oi", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_psrlq, "V1OiV1OiV1Oi", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_psraw, "V4sV4sV1Oi", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_psrad, "V2iV2iV1Oi", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_psllwi, "V4sV4si", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_pslldi, "V2iV2ii", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_psllqi, "V1OiV1Oii", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_psrlwi, "V4sV4si", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_psrldi, "V2iV2ii", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_psrlqi, "V1OiV1Oii", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_psrawi, "V4sV4si", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_psradi, "V2iV2ii", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_packsswb, "V8cV4sV4s", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_packssdw, "V4sV2iV2i", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_packuswb, "V8cV4sV4s", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_punpckhbw, "V8cV8cV8c", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_punpckhwd, "V4sV4sV4s", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_punpckhdq, "V2iV2iV2i", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_punpcklbw, "V8cV8cV8c", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_punpcklwd, "V4sV4sV4s", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_punpckldq, "V2iV2iV2i", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_pcmpeqb, "V8cV8cV8c", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_pcmpeqw, "V4sV4sV4s", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_pcmpeqd, "V2iV2iV2i", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_pcmpgtb, "V8cV8cV8c", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_pcmpgtw, "V4sV4sV4s", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_pcmpgtd, "V2iV2iV2i", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_maskmovq, "vV8cV8cc*", "nV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_movntq, "vV1Oi*V1Oi", "nV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_vec_init_v2si, "V2iii", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_vec_init_v4hi, "V4sssss", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_vec_init_v8qi, "V8ccccccccc", "ncV:64:", "mmx") -TARGET_BUILTIN(__builtin_ia32_vec_ext_v2si, "iV2ii", "ncV:64:", "mmx") - -// MMX2 (MMX+SSE) intrinsics -TARGET_BUILTIN(__builtin_ia32_cvtpi2ps, "V4fV4fV2i", "ncV:64:", "mmx,sse") -TARGET_BUILTIN(__builtin_ia32_cvtps2pi, "V2iV4f", "ncV:64:", "mmx,sse") -TARGET_BUILTIN(__builtin_ia32_cvttps2pi, "V2iV4f", "ncV:64:", "mmx,sse") -TARGET_BUILTIN(__builtin_ia32_pavgb, "V8cV8cV8c", "ncV:64:", "mmx,sse") -TARGET_BUILTIN(__builtin_ia32_pavgw, "V4sV4sV4s", "ncV:64:", "mmx,sse") -TARGET_BUILTIN(__builtin_ia32_pmaxsw, "V4sV4sV4s", "ncV:64:", "mmx,sse") -TARGET_BUILTIN(__builtin_ia32_pmaxub, "V8cV8cV8c", "ncV:64:", "mmx,sse") -TARGET_BUILTIN(__builtin_ia32_pminsw, "V4sV4sV4s", "ncV:64:", "mmx,sse") -TARGET_BUILTIN(__builtin_ia32_pminub, "V8cV8cV8c", "ncV:64:", "mmx,sse") -TARGET_BUILTIN(__builtin_ia32_pmovmskb, "iV8c", "ncV:64:", "mmx,sse") -TARGET_BUILTIN(__builtin_ia32_pmulhuw, "V4sV4sV4s", "ncV:64:", "mmx,sse") -TARGET_BUILTIN(__builtin_ia32_psadbw, "V4sV8cV8c", "ncV:64:", "mmx,sse") -TARGET_BUILTIN(__builtin_ia32_pshufw, "V4sV4sIc", "ncV:64:", "mmx,sse") TARGET_BUILTIN(__builtin_ia32_vec_ext_v4hi, "sV4sIi", "ncV:64:", "sse") TARGET_BUILTIN(__builtin_ia32_vec_set_v4hi, "V4sV4ssIi", "ncV:64:", "sse") -// MMX+SSE2 -TARGET_BUILTIN(__builtin_ia32_cvtpd2pi, "V2iV2d", "ncV:64:", "mmx,sse2") -TARGET_BUILTIN(__builtin_ia32_cvtpi2pd, "V2dV2i", "ncV:64:", "mmx,sse2") -TARGET_BUILTIN(__builtin_ia32_cvttpd2pi, "V2iV2d", "ncV:64:", "mmx,sse2") -TARGET_BUILTIN(__builtin_ia32_paddq, "V1OiV1OiV1Oi", "ncV:64:", "mmx,sse2") -TARGET_BUILTIN(__builtin_ia32_pmuludq, "V1OiV2iV2i", "ncV:64:", "mmx,sse2") -TARGET_BUILTIN(__builtin_ia32_psubq, "V1OiV1OiV1Oi", "ncV:64:", "mmx,sse2") - -// MMX+SSSE3 -TARGET_BUILTIN(__builtin_ia32_pabsb, "V8cV8c", "ncV:64:", "mmx,ssse3") -TARGET_BUILTIN(__builtin_ia32_pabsd, "V2iV2i", "ncV:64:", "mmx,ssse3") -TARGET_BUILTIN(__builtin_ia32_pabsw, "V4sV4s", "ncV:64:", "mmx,ssse3") -TARGET_BUILTIN(__builtin_ia32_palignr, "V8cV8cV8cIc", "ncV:64:", "mmx,ssse3") -TARGET_BUILTIN(__builtin_ia32_phaddd, "V2iV2iV2i", "ncV:64:", "mmx,ssse3") -TARGET_BUILTIN(__builtin_ia32_phaddsw, "V4sV4sV4s", "ncV:64:", "mmx,ssse3") -TARGET_BUILTIN(__builtin_ia32_phaddw, "V4sV4sV4s", "ncV:64:", "mmx,ssse3") -TARGET_BUILTIN(__builtin_ia32_phsubd, "V2iV2iV2i", "ncV:64:", "mmx,ssse3") -TARGET_BUILTIN(__builtin_ia32_phsubsw, "V4sV4sV4s", "ncV:64:", "mmx,ssse3") -TARGET_BUILTIN(__builtin_ia32_phsubw, "V4sV4sV4s", "ncV:64:", "mmx,ssse3") -TARGET_BUILTIN(__builtin_ia32_pmaddubsw, "V8cV8cV8c", "ncV:64:", "mmx,ssse3") -TARGET_BUILTIN(__builtin_ia32_pmulhrsw, "V4sV4sV4s", "ncV:64:", "mmx,ssse3") -TARGET_BUILTIN(__builtin_ia32_pshufb, "V8cV8cV8c", "ncV:64:", "mmx,ssse3") -TARGET_BUILTIN(__builtin_ia32_psignw, "V4sV4sV4s", "ncV:64:", "mmx,ssse3") -TARGET_BUILTIN(__builtin_ia32_psignb, "V8cV8cV8c", "ncV:64:", "mmx,ssse3") -TARGET_BUILTIN(__builtin_ia32_psignd, "V2iV2iV2i", "ncV:64:", "mmx,ssse3") - // SSE intrinsics. TARGET_BUILTIN(__builtin_ia32_comieq, "iV4fV4f", "ncV:128:", "sse") TARGET_BUILTIN(__builtin_ia32_comilt, "iV4fV4f", "ncV:128:", "sse") diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -12092,13 +12092,7 @@ // TODO: If we had a "freeze" IR instruction to generate a fixed undef // value, we should use that here instead of a zero. return llvm::Constant::getNullValue(ConvertType(E->getType())); - case X86::BI__builtin_ia32_vec_init_v8qi: - case X86::BI__builtin_ia32_vec_init_v4hi: - case X86::BI__builtin_ia32_vec_init_v2si: - return Builder.CreateBitCast(BuildVector(Ops), - llvm::Type::getX86_MMXTy(getLLVMContext())); case X86::BI__builtin_ia32_vec_ext_v4hi: - case X86::BI__builtin_ia32_vec_ext_v2si: case X86::BI__builtin_ia32_vec_ext_v16qi: case X86::BI__builtin_ia32_vec_ext_v8hi: case X86::BI__builtin_ia32_vec_ext_v4si: diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -3896,7 +3896,6 @@ switch (BuiltinID) { default: return false; - case X86::BI__builtin_ia32_vec_ext_v2si: case X86::BI__builtin_ia32_vec_ext_v2di: case X86::BI__builtin_ia32_vextractf128_pd256: case X86::BI__builtin_ia32_vextractf128_ps256: diff --git a/clang/test/CodeGen/builtins-x86.c b/clang/test/CodeGen/builtins-x86.c --- a/clang/test/CodeGen/builtins-x86.c +++ b/clang/test/CodeGen/builtins-x86.c @@ -172,26 +172,6 @@ tmp_V4f = __builtin_ia32_minss(tmp_V4f, tmp_V4f); tmp_V4f = __builtin_ia32_maxss(tmp_V4f, tmp_V4f); - tmp_V8c = __builtin_ia32_paddsb(tmp_V8c, tmp_V8c); - tmp_V4s = __builtin_ia32_paddsw(tmp_V4s, tmp_V4s); - tmp_V8c = __builtin_ia32_psubsb(tmp_V8c, tmp_V8c); - tmp_V4s = __builtin_ia32_psubsw(tmp_V4s, tmp_V4s); - tmp_V8c = __builtin_ia32_paddusb(tmp_V8c, tmp_V8c); - tmp_V4s = __builtin_ia32_paddusw(tmp_V4s, tmp_V4s); - tmp_V8c = __builtin_ia32_psubusb(tmp_V8c, tmp_V8c); - tmp_V4s = __builtin_ia32_psubusw(tmp_V4s, tmp_V4s); - tmp_V4s = __builtin_ia32_pmulhw(tmp_V4s, tmp_V4s); - tmp_V4s = __builtin_ia32_pmulhuw(tmp_V4s, tmp_V4s); - tmp_V8c = __builtin_ia32_pcmpeqb(tmp_V8c, tmp_V8c); - tmp_V4s = __builtin_ia32_pcmpeqw(tmp_V4s, tmp_V4s); - tmp_V2i = __builtin_ia32_pcmpeqd(tmp_V2i, tmp_V2i); - tmp_V8c = __builtin_ia32_pcmpgtb(tmp_V8c, tmp_V8c); - tmp_V4s = __builtin_ia32_pcmpgtw(tmp_V4s, tmp_V4s); - tmp_V2i = __builtin_ia32_pcmpgtd(tmp_V2i, tmp_V2i); - tmp_V8c = __builtin_ia32_pmaxub(tmp_V8c, tmp_V8c); - tmp_V4s = __builtin_ia32_pmaxsw(tmp_V4s, tmp_V4s); - tmp_V8c = __builtin_ia32_pminub(tmp_V8c, tmp_V8c); - tmp_V4s = __builtin_ia32_pminsw(tmp_V4s, tmp_V4s); tmp_V2d = __builtin_ia32_cmppd(tmp_V2d, tmp_V2d, 0); tmp_V2d = __builtin_ia32_cmppd(tmp_V2d, tmp_V2d, 1); tmp_V2d = __builtin_ia32_cmppd(tmp_V2d, tmp_V2d, 2); @@ -236,48 +216,20 @@ tmp_V4f = __builtin_ia32_hsubps(tmp_V4f, tmp_V4f); tmp_V2d = __builtin_ia32_hsubpd(tmp_V2d, tmp_V2d); tmp_V8s = __builtin_ia32_phaddw128(tmp_V8s, tmp_V8s); - tmp_V4s = __builtin_ia32_phaddw(tmp_V4s, tmp_V4s); tmp_V4i = __builtin_ia32_phaddd128(tmp_V4i, tmp_V4i); - tmp_V2i = __builtin_ia32_phaddd(tmp_V2i, tmp_V2i); tmp_V8s = __builtin_ia32_phaddsw128(tmp_V8s, tmp_V8s); - tmp_V4s = __builtin_ia32_phaddsw(tmp_V4s, tmp_V4s); tmp_V8s = __builtin_ia32_phsubw128(tmp_V8s, tmp_V8s); - tmp_V4s = __builtin_ia32_phsubw(tmp_V4s, tmp_V4s); tmp_V4i = __builtin_ia32_phsubd128(tmp_V4i, tmp_V4i); - tmp_V2i = __builtin_ia32_phsubd(tmp_V2i, tmp_V2i); tmp_V8s = __builtin_ia32_phsubsw128(tmp_V8s, tmp_V8s); - tmp_V4s = __builtin_ia32_phsubsw(tmp_V4s, tmp_V4s); tmp_V8s = __builtin_ia32_pmaddubsw128(tmp_V16c, tmp_V16c); - tmp_V8c = __builtin_ia32_pmaddubsw(tmp_V8c, tmp_V8c); tmp_V8s = __builtin_ia32_pmulhrsw128(tmp_V8s, tmp_V8s); - tmp_V4s = __builtin_ia32_pmulhrsw(tmp_V4s, tmp_V4s); tmp_V16c = __builtin_ia32_pshufb128(tmp_V16c, tmp_V16c); - tmp_V8c = __builtin_ia32_pshufb(tmp_V8c, tmp_V8c); tmp_V16c = __builtin_ia32_psignb128(tmp_V16c, tmp_V16c); - tmp_V8c = __builtin_ia32_psignb(tmp_V8c, tmp_V8c); tmp_V8s = __builtin_ia32_psignw128(tmp_V8s, tmp_V8s); - tmp_V4s = __builtin_ia32_psignw(tmp_V4s, tmp_V4s); tmp_V4i = __builtin_ia32_psignd128(tmp_V4i, tmp_V4i); - tmp_V2i = __builtin_ia32_psignd(tmp_V2i, tmp_V2i); tmp_V16c = __builtin_ia32_pabsb128(tmp_V16c); - tmp_V8c = __builtin_ia32_pabsb(tmp_V8c); tmp_V8s = __builtin_ia32_pabsw128(tmp_V8s); - tmp_V4s = __builtin_ia32_pabsw(tmp_V4s); tmp_V4i = __builtin_ia32_pabsd128(tmp_V4i); - tmp_V2i = __builtin_ia32_pabsd(tmp_V2i); - tmp_V4s = __builtin_ia32_psllw(tmp_V4s, tmp_V1LLi); - tmp_V2i = __builtin_ia32_pslld(tmp_V2i, tmp_V1LLi); - tmp_V1LLi = __builtin_ia32_psllq(tmp_V1LLi, tmp_V1LLi); - tmp_V4s = __builtin_ia32_psrlw(tmp_V4s, tmp_V1LLi); - tmp_V2i = __builtin_ia32_psrld(tmp_V2i, tmp_V1LLi); - tmp_V1LLi = __builtin_ia32_psrlq(tmp_V1LLi, tmp_V1LLi); - tmp_V4s = __builtin_ia32_psraw(tmp_V4s, tmp_V1LLi); - tmp_V2i = __builtin_ia32_psrad(tmp_V2i, tmp_V1LLi); - tmp_V2i = __builtin_ia32_pmaddwd(tmp_V4s, tmp_V4s); - tmp_V8c = __builtin_ia32_packsswb(tmp_V4s, tmp_V4s); - tmp_V4s = __builtin_ia32_packssdw(tmp_V2i, tmp_V2i); - tmp_V8c = __builtin_ia32_packuswb(tmp_V4s, tmp_V4s); - tmp_i = __builtin_ia32_vec_ext_v2si(tmp_V2i, 0); __builtin_ia32_incsspd(tmp_Ui); __builtin_ia32_incsspq(tmp_ULLi); @@ -325,8 +277,6 @@ (void) __builtin_ia32_clzero(tmp_vp); (void) __builtin_ia32_cldemote(tmp_vp); - tmp_V4f = __builtin_ia32_cvtpi2ps(tmp_V4f, tmp_V2i); - tmp_V2i = __builtin_ia32_cvtps2pi(tmp_V4f); tmp_i = __builtin_ia32_cvtss2si(tmp_V4f); tmp_i = __builtin_ia32_cvttss2si(tmp_V4f); @@ -339,17 +289,12 @@ tmp_LLi = __builtin_ia32_cvtss2si64(tmp_V4f); tmp_LLi = __builtin_ia32_cvttss2si64(tmp_V4f); #endif - tmp_V2i = __builtin_ia32_cvttps2pi(tmp_V4f); - (void) __builtin_ia32_maskmovq(tmp_V8c, tmp_V8c, tmp_cp); tmp_i = __builtin_ia32_movmskps(tmp_V4f); - tmp_i = __builtin_ia32_pmovmskb(tmp_V8c); - (void) __builtin_ia32_movntq(tmp_V1LLip, tmp_V1LLi); (void) __builtin_ia32_sfence(); #ifndef OPENCL (void) _mm_sfence(); #endif - tmp_V4s = __builtin_ia32_psadbw(tmp_V8c, tmp_V8c); tmp_V4f = __builtin_ia32_rcpps(tmp_V4f); tmp_V4f = __builtin_ia32_rcpss(tmp_V4f); tmp_V4f = __builtin_ia32_rsqrtps(tmp_V4f); @@ -367,11 +312,8 @@ tmp_V2d = __builtin_ia32_sqrtpd(tmp_V2d); tmp_V2d = __builtin_ia32_sqrtsd(tmp_V2d); tmp_V2LLi = __builtin_ia32_cvtpd2dq(tmp_V2d); - tmp_V2i = __builtin_ia32_cvtpd2pi(tmp_V2d); tmp_V4f = __builtin_ia32_cvtpd2ps(tmp_V2d); tmp_V4i = __builtin_ia32_cvttpd2dq(tmp_V2d); - tmp_V2i = __builtin_ia32_cvttpd2pi(tmp_V2d); - tmp_V2d = __builtin_ia32_cvtpi2pd(tmp_V2i); tmp_i = __builtin_ia32_cvtsd2si(tmp_V2d); tmp_i = __builtin_ia32_cvttsd2si(tmp_V2d); tmp_V4f = __builtin_ia32_cvtsd2ss(tmp_V4f, tmp_V2d); @@ -398,26 +340,9 @@ (void) _mm_pause(); #endif - tmp_V4s = __builtin_ia32_psllwi(tmp_V4s, imm_i_0_8); - tmp_V2i = __builtin_ia32_pslldi(tmp_V2i, imm_i_0_8); - tmp_V1LLi = __builtin_ia32_psllqi(tmp_V1LLi, imm_i_0_8); - tmp_V4s = __builtin_ia32_psrawi(tmp_V4s, imm_i_0_8); - tmp_V2i = __builtin_ia32_psradi(tmp_V2i, imm_i_0_8); - tmp_V4s = __builtin_ia32_psrlwi(tmp_V4s, imm_i_0_8); - tmp_V2i = __builtin_ia32_psrldi(tmp_V2i, imm_i_0_8); - tmp_V1LLi = __builtin_ia32_psrlqi(tmp_V1LLi, imm_i_0_8); // Using non-immediate argument supported for gcc compatibility - tmp_V4s = __builtin_ia32_psllwi(tmp_V4s, tmp_i); - tmp_V2i = __builtin_ia32_pslldi(tmp_V2i, tmp_i); - tmp_V1LLi = __builtin_ia32_psllqi(tmp_V1LLi, tmp_i); - tmp_V4s = __builtin_ia32_psrawi(tmp_V4s, tmp_i); - tmp_V2i = __builtin_ia32_psradi(tmp_V2i, tmp_i); - tmp_V4s = __builtin_ia32_psrlwi(tmp_V4s, tmp_i); - tmp_V2i = __builtin_ia32_psrldi(tmp_V2i, tmp_i); - tmp_V1LLi = __builtin_ia32_psrlqi(tmp_V1LLi, tmp_i); - - tmp_V1LLi = __builtin_ia32_pmuludq(tmp_V2i, tmp_V2i); + tmp_V2LLi = __builtin_ia32_pmuludq128(tmp_V4i, tmp_V4i); tmp_V8s = __builtin_ia32_psraw128(tmp_V8s, tmp_V8s); tmp_V4i = __builtin_ia32_psrad128(tmp_V4i, tmp_V4i); @@ -452,7 +377,6 @@ (void) __builtin_ia32_mwait(tmp_Ui, tmp_Ui); tmp_V16c = __builtin_ia32_lddqu(tmp_cCp); tmp_V16c = __builtin_ia32_palignr128(tmp_V16c, tmp_V16c, imm_i); - tmp_V8c = __builtin_ia32_palignr(tmp_V8c, tmp_V8c, imm_i); #ifdef USE_SSE4 tmp_V16c = __builtin_ia32_pblendvb128(tmp_V16c, tmp_V16c, tmp_V16c); tmp_V2d = __builtin_ia32_blendvpd(tmp_V2d, tmp_V2d, tmp_V2d); diff --git a/clang/test/CodeGen/palignr.c b/clang/test/CodeGen/palignr.c --- a/clang/test/CodeGen/palignr.c +++ b/clang/test/CodeGen/palignr.c @@ -14,18 +14,3 @@ int4 align3(int4 a, int4 b) { return _mm_alignr_epi8(a, b, 17); } // CHECK: xor int4 align4(int4 a, int4 b) { return _mm_alignr_epi8(a, b, 32); } - -#define _mm_alignr_pi8(a, b, n) (__builtin_ia32_palignr((a), (b), (n))) -typedef __attribute__((vector_size(8))) int int2; - -// CHECK: palignr -int2 align5(int2 a, int2 b) { return _mm_alignr_pi8(a, b, 8); } - -// CHECK: palignr -int2 align6(int2 a, int2 b) { return _mm_alignr_pi8(a, b, 9); } - -// CHECK: palignr -int2 align7(int2 a, int2 b) { return _mm_alignr_pi8(a, b, 16); } - -// CHECK: palignr -int2 align8(int2 a, int2 b) { return _mm_alignr_pi8(a, b, 7); } diff --git a/clang/test/CodeGen/pr26099.c b/clang/test/CodeGen/pr26099.c deleted file mode 100644 --- a/clang/test/CodeGen/pr26099.c +++ /dev/null @@ -1,12 +0,0 @@ -// RUN: %clang_cc1 -ffreestanding %s -triple=i686-apple-darwin -target-feature +mmx -emit-llvm -o - -Wall -Werror -// RUN: %clang_cc1 -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +mmx -emit-llvm -o - -Wall -Werror -// REQUIRES: asserts - -#include - -int __attribute__ ((__vector_size__ (8))) b; - -void bar(int a) -{ - b = __builtin_ia32_vec_init_v2si (0, a); -} \ No newline at end of file diff --git a/clang/www/builtins.py b/clang/www/builtins.py --- a/clang/www/builtins.py +++ b/clang/www/builtins.py @@ -4,8 +4,9 @@ err=0 -# Giant associative set of builtin->intrinsic mappings where clang doesn't -# implement the builtin since the vector operation works by default. +# Giant associative set of builtin->intrinsic mappings where clang +# doesn't implement the builtin. (Either because the vector operation +# works without a builtin, or for other reasons.) repl_map = { '__builtin_ia32_addps': '_mm_add_ps', @@ -133,7 +134,100 @@ '__builtin_ia32_vec_ext_v4si': '_mm_extract_epi32', '__builtin_ia32_vec_ext_v2di': '_mm_extract_epi64', '__builtin_ia32_vec_ext_v4hi': '_mm_extract_pi16', -'__builtin_ia32_vec_ext_v4sf': '_mm_extract_ps' +'__builtin_ia32_vec_ext_v4sf': '_mm_extract_ps', +# Removed MMX builtins +'__builtin_ia32_paddb': '_mm_add_pi8', +'__builtin_ia32_paddw': '_mm_add_pi16', +'__builtin_ia32_paddd': '_mm_add_pi32', +'__builtin_ia32_paddsb': '_mm_adds_pi8', +'__builtin_ia32_paddsw': '_mm_adds_pi16', +'__builtin_ia32_paddusb': '_mm_adds_pu8', +'__builtin_ia32_paddusw': '_mm_adds_pu16', +'__builtin_ia32_psubb': '_mm_sub_pi8', +'__builtin_ia32_psubw': '_mm_sub_pi16', +'__builtin_ia32_psubd': '_mm_sub_pi32', +'__builtin_ia32_psubsb': '_mm_subs_pi8', +'__builtin_ia32_psubsw': '_mm_subs_pi16', +'__builtin_ia32_psubusb': '_mm_subs_pu8', +'__builtin_ia32_psubusw': '_mm_subs_pu16', +'__builtin_ia32_pmulhw': '_mm_mulhi_pi16', +'__builtin_ia32_pmullw': '_mm_mullo_pi16', +'__builtin_ia32_pmaddwd': '_mm_madd_pi16', +'__builtin_ia32_pand': '_mm_and_si64', +'__builtin_ia32_pandn': '_mm_andnot_si64', +'__builtin_ia32_por': '_mm_or_si64', +'__builtin_ia32_pxor': '_mm_xor_si64', +'__builtin_ia32_psllw': '_mm_sll_pi16', +'__builtin_ia32_pslld': '_mm_sll_pi32', +'__builtin_ia32_psllq': '_mm_sll_si64', +'__builtin_ia32_psrlw': '_mm_srl_pi16', +'__builtin_ia32_psrld': '_mm_srl_pi32', +'__builtin_ia32_psrlq': '_mm_srl_si64', +'__builtin_ia32_psraw': '_mm_sra_pi16', +'__builtin_ia32_psrad': '_mm_sra_pi32', +'__builtin_ia32_psllwi': '_mm_slli_pi16', +'__builtin_ia32_pslldi': '_mm_slli_pi32', +'__builtin_ia32_psllqi': '_mm_slli_si64', +'__builtin_ia32_psrlwi': '_mm_srli_pi16', +'__builtin_ia32_psrldi': '_mm_srli_pi32', +'__builtin_ia32_psrlqi': '_mm_srli_si64', +'__builtin_ia32_psrawi': '_mm_srai_pi16', +'__builtin_ia32_psradi': '_mm_srai_pi32', +'__builtin_ia32_packsswb': '_mm_packs_pi16', +'__builtin_ia32_packssdw': '_mm_packs_pi32', +'__builtin_ia32_packuswb': '_mm_packs_pu16', +'__builtin_ia32_punpckhbw': '_mm_unpackhi_pi8', +'__builtin_ia32_punpckhwd': '_mm_unpackhi_pi16', +'__builtin_ia32_punpckhdq': '_mm_unpackhi_pi32', +'__builtin_ia32_punpcklbw': '_mm_unpacklo_pi8', +'__builtin_ia32_punpcklwd': '_mm_unpacklo_pi16', +'__builtin_ia32_punpckldq': '_mm_unpacklo_pi32', +'__builtin_ia32_pcmpeqb': '_mm_cmpeq_pi8', +'__builtin_ia32_pcmpeqw': '_mm_cmpeq_pi16', +'__builtin_ia32_pcmpeqd': '_mm_cmpeq_pi32', +'__builtin_ia32_pcmpgtb': '_mm_cmpgt_pi8', +'__builtin_ia32_pcmpgtw': '_mm_cmpgt_pi16', +'__builtin_ia32_pcmpgtd': '_mm_cmpgt_pi32', +'__builtin_ia32_maskmovq': '_mm_maskmove_si64', +'__builtin_ia32_movntq': '_mm_stream_pi', +'__builtin_ia32_vec_init_v2si': '_mm_setr_pi32', +'__builtin_ia32_vec_init_v4hi': '_mm_setr_pi16', +'__builtin_ia32_vec_init_v8qi': '_mm_setr_pi8', +'__builtin_ia32_cvtpi2ps': '_mm_cvtpi32_ps', +'__builtin_ia32_cvtps2pi': '_mm_cvtps_pi32', +'__builtin_ia32_cvttps2pi': '_mm_cvttps_pi32', +'__builtin_ia32_pavgb': '_mm_avg_pu8', +'__builtin_ia32_pavgw': '_mm_avg_pu16', +'__builtin_ia32_pmaxsw': '_mm_max_pi16', +'__builtin_ia32_pmaxub': '_mm_max_pu8', +'__builtin_ia32_pminsw': '_mm_min_pi16', +'__builtin_ia32_pminub': '_mm_min_pu8', +'__builtin_ia32_pmovmskb': '_mm_movemask_pi8', +'__builtin_ia32_pmulhuw': '_mm_mulhi_pu16', +'__builtin_ia32_psadbw': '_mm_sad_pu8', +'__builtin_ia32_pshufw': '_mm_shuffle_pi16', +'__builtin_ia32_cvtpd2pi': '_mm_cvtpd_pi32', +'__builtin_ia32_cvtpi2pd': '_mm_cvtpi32_pd', +'__builtin_ia32_cvttpd2pi': '_mm_cvttpd_pi32', +'__builtin_ia32_paddq': '_mm_add_si64', +'__builtin_ia32_pmuludq': '_mm_mul_su32', +'__builtin_ia32_psubq': '_mm_sub_si64', +'__builtin_ia32_pabsb': '_mm_abs_pi8', +'__builtin_ia32_pabsd': '_mm_abs_pi32', +'__builtin_ia32_pabsw': '_mm_abs_pi16', +'__builtin_ia32_palignr': '_mm_alignr_pi8', +'__builtin_ia32_phaddd': '_mm_hadd_pi32', +'__builtin_ia32_phaddsw': '_mm_hadds_pi16', +'__builtin_ia32_phaddw': '_mm_hadd_pi16', +'__builtin_ia32_phsubd': '_mm_hsub_pi32', +'__builtin_ia32_phsubsw': '_mm_hsubs_pi16', +'__builtin_ia32_phsubw': '_mm_hsub_pi16', +'__builtin_ia32_pmaddubsw': '_mm_maddubs_pi16', +'__builtin_ia32_pmulhrsw': '_mm_mulhrs_pi16', +'__builtin_ia32_pshufb': '_mm_shuffle_pi8', +'__builtin_ia32_psignw': '_mm_sign_pi16', +'__builtin_ia32_psignb': '_mm_sign_pi8', +'__builtin_ia32_psignd': '_mm_sign_pi32', } # Special unhandled cases: diff --git a/llvm/include/llvm/IR/IntrinsicsX86.td b/llvm/include/llvm/IR/IntrinsicsX86.td --- a/llvm/include/llvm/IR/IntrinsicsX86.td +++ b/llvm/include/llvm/IR/IntrinsicsX86.td @@ -259,11 +259,11 @@ def int_x86_sse_cvttss2si64 : GCCBuiltin<"__builtin_ia32_cvttss2si64">, Intrinsic<[llvm_i64_ty], [llvm_v4f32_ty], [IntrNoMem]>; - def int_x86_sse_cvtps2pi : GCCBuiltin<"__builtin_ia32_cvtps2pi">, + def int_x86_sse_cvtps2pi : Intrinsic<[llvm_x86mmx_ty], [llvm_v4f32_ty], [IntrNoMem]>; - def int_x86_sse_cvttps2pi: GCCBuiltin<"__builtin_ia32_cvttps2pi">, + def int_x86_sse_cvttps2pi: Intrinsic<[llvm_x86mmx_ty], [llvm_v4f32_ty], [IntrNoMem]>; - def int_x86_sse_cvtpi2ps : GCCBuiltin<"__builtin_ia32_cvtpi2ps">, + def int_x86_sse_cvtpi2ps : Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, llvm_x86mmx_ty], [IntrNoMem]>; } @@ -461,11 +461,11 @@ def int_x86_sse2_cvtsd2ss : GCCBuiltin<"__builtin_ia32_cvtsd2ss">, Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v2f64_ty], [IntrNoMem]>; - def int_x86_sse_cvtpd2pi : GCCBuiltin<"__builtin_ia32_cvtpd2pi">, + def int_x86_sse_cvtpd2pi : Intrinsic<[llvm_x86mmx_ty], [llvm_v2f64_ty], [IntrNoMem]>; - def int_x86_sse_cvttpd2pi: GCCBuiltin<"__builtin_ia32_cvttpd2pi">, + def int_x86_sse_cvttpd2pi: Intrinsic<[llvm_x86mmx_ty], [llvm_v2f64_ty], [IntrNoMem]>; - def int_x86_sse_cvtpi2pd : GCCBuiltin<"__builtin_ia32_cvtpi2pd">, + def int_x86_sse_cvtpi2pd : Intrinsic<[llvm_v2f64_ty], [llvm_x86mmx_ty], [IntrNoMem]>; } @@ -547,49 +547,49 @@ // Horizontal arithmetic ops let TargetPrefix = "x86" in { // All intrinsics start with "llvm.x86.". - def int_x86_ssse3_phadd_w : GCCBuiltin<"__builtin_ia32_phaddw">, + def int_x86_ssse3_phadd_w : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem]>; def int_x86_ssse3_phadd_w_128 : GCCBuiltin<"__builtin_ia32_phaddw128">, Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty], [IntrNoMem]>; - def int_x86_ssse3_phadd_d : GCCBuiltin<"__builtin_ia32_phaddd">, + def int_x86_ssse3_phadd_d : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem]>; def int_x86_ssse3_phadd_d_128 : GCCBuiltin<"__builtin_ia32_phaddd128">, Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty], [IntrNoMem]>; - def int_x86_ssse3_phadd_sw : GCCBuiltin<"__builtin_ia32_phaddsw">, + def int_x86_ssse3_phadd_sw : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem]>; def int_x86_ssse3_phadd_sw_128 : GCCBuiltin<"__builtin_ia32_phaddsw128">, Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty], [IntrNoMem]>; - def int_x86_ssse3_phsub_w : GCCBuiltin<"__builtin_ia32_phsubw">, + def int_x86_ssse3_phsub_w : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem]>; def int_x86_ssse3_phsub_w_128 : GCCBuiltin<"__builtin_ia32_phsubw128">, Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty], [IntrNoMem]>; - def int_x86_ssse3_phsub_d : GCCBuiltin<"__builtin_ia32_phsubd">, + def int_x86_ssse3_phsub_d : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem]>; def int_x86_ssse3_phsub_d_128 : GCCBuiltin<"__builtin_ia32_phsubd128">, Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty], [IntrNoMem]>; - def int_x86_ssse3_phsub_sw : GCCBuiltin<"__builtin_ia32_phsubsw">, + def int_x86_ssse3_phsub_sw : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem]>; def int_x86_ssse3_phsub_sw_128 : GCCBuiltin<"__builtin_ia32_phsubsw128">, Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty], [IntrNoMem]>; - def int_x86_ssse3_pmadd_ub_sw : GCCBuiltin<"__builtin_ia32_pmaddubsw">, + def int_x86_ssse3_pmadd_ub_sw : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem]>; def int_x86_ssse3_pmadd_ub_sw_128 : GCCBuiltin<"__builtin_ia32_pmaddubsw128">, @@ -599,7 +599,7 @@ // Packed multiply high with round and scale let TargetPrefix = "x86" in { // All intrinsics start with "llvm.x86.". - def int_x86_ssse3_pmul_hr_sw : GCCBuiltin<"__builtin_ia32_pmulhrsw">, + def int_x86_ssse3_pmul_hr_sw : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem, Commutative]>; def int_x86_ssse3_pmul_hr_sw_128 : GCCBuiltin<"__builtin_ia32_pmulhrsw128">, @@ -609,34 +609,34 @@ // Shuffle ops let TargetPrefix = "x86" in { // All intrinsics start with "llvm.x86.". - def int_x86_ssse3_pshuf_b : GCCBuiltin<"__builtin_ia32_pshufb">, + def int_x86_ssse3_pshuf_b : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem]>; def int_x86_ssse3_pshuf_b_128 : GCCBuiltin<"__builtin_ia32_pshufb128">, Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty], [IntrNoMem]>; - def int_x86_sse_pshuf_w : GCCBuiltin<"__builtin_ia32_pshufw">, + def int_x86_sse_pshuf_w : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_i8_ty], [IntrNoMem, ImmArg>]>; } // Sign ops let TargetPrefix = "x86" in { // All intrinsics start with "llvm.x86.". - def int_x86_ssse3_psign_b : GCCBuiltin<"__builtin_ia32_psignb">, + def int_x86_ssse3_psign_b : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem]>; def int_x86_ssse3_psign_b_128 : GCCBuiltin<"__builtin_ia32_psignb128">, Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty], [IntrNoMem]>; - def int_x86_ssse3_psign_w : GCCBuiltin<"__builtin_ia32_psignw">, + def int_x86_ssse3_psign_w : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem]>; def int_x86_ssse3_psign_w_128 : GCCBuiltin<"__builtin_ia32_psignw128">, Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty], [IntrNoMem]>; - def int_x86_ssse3_psign_d : GCCBuiltin<"__builtin_ia32_psignd">, + def int_x86_ssse3_psign_d : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem]>; def int_x86_ssse3_psign_d_128 : GCCBuiltin<"__builtin_ia32_psignd128">, @@ -646,13 +646,13 @@ // Absolute value ops let TargetPrefix = "x86" in { // All intrinsics start with "llvm.x86.". - def int_x86_ssse3_pabs_b : GCCBuiltin<"__builtin_ia32_pabsb">, + def int_x86_ssse3_pabs_b : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty], [IntrNoMem]>; - def int_x86_ssse3_pabs_w : GCCBuiltin<"__builtin_ia32_pabsw">, + def int_x86_ssse3_pabs_w : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty], [IntrNoMem]>; - def int_x86_ssse3_pabs_d : GCCBuiltin<"__builtin_ia32_pabsd">, + def int_x86_ssse3_pabs_d : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty], [IntrNoMem]>; } @@ -2138,118 +2138,118 @@ // Integer arithmetic ops. let TargetPrefix = "x86" in { // All intrinsics start with "llvm.x86.". // Addition - def int_x86_mmx_padd_b : GCCBuiltin<"__builtin_ia32_paddb">, + def int_x86_mmx_padd_b : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem, Commutative]>; - def int_x86_mmx_padd_w : GCCBuiltin<"__builtin_ia32_paddw">, + def int_x86_mmx_padd_w : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem, Commutative]>; - def int_x86_mmx_padd_d : GCCBuiltin<"__builtin_ia32_paddd">, + def int_x86_mmx_padd_d : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem, Commutative]>; - def int_x86_mmx_padd_q : GCCBuiltin<"__builtin_ia32_paddq">, + def int_x86_mmx_padd_q : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem, Commutative]>; - def int_x86_mmx_padds_b : GCCBuiltin<"__builtin_ia32_paddsb">, + def int_x86_mmx_padds_b : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem, Commutative]>; - def int_x86_mmx_padds_w : GCCBuiltin<"__builtin_ia32_paddsw">, + def int_x86_mmx_padds_w : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem, Commutative]>; - def int_x86_mmx_paddus_b : GCCBuiltin<"__builtin_ia32_paddusb">, + def int_x86_mmx_paddus_b : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem, Commutative]>; - def int_x86_mmx_paddus_w : GCCBuiltin<"__builtin_ia32_paddusw">, + def int_x86_mmx_paddus_w : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem, Commutative]>; // Subtraction - def int_x86_mmx_psub_b : GCCBuiltin<"__builtin_ia32_psubb">, + def int_x86_mmx_psub_b : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem]>; - def int_x86_mmx_psub_w : GCCBuiltin<"__builtin_ia32_psubw">, + def int_x86_mmx_psub_w : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem]>; - def int_x86_mmx_psub_d : GCCBuiltin<"__builtin_ia32_psubd">, + def int_x86_mmx_psub_d : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem]>; - def int_x86_mmx_psub_q : GCCBuiltin<"__builtin_ia32_psubq">, + def int_x86_mmx_psub_q : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem]>; - def int_x86_mmx_psubs_b : GCCBuiltin<"__builtin_ia32_psubsb">, + def int_x86_mmx_psubs_b : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem]>; - def int_x86_mmx_psubs_w : GCCBuiltin<"__builtin_ia32_psubsw">, + def int_x86_mmx_psubs_w : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem]>; - def int_x86_mmx_psubus_b : GCCBuiltin<"__builtin_ia32_psubusb">, + def int_x86_mmx_psubus_b : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem]>; - def int_x86_mmx_psubus_w : GCCBuiltin<"__builtin_ia32_psubusw">, + def int_x86_mmx_psubus_w : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem]>; // Multiplication - def int_x86_mmx_pmulh_w : GCCBuiltin<"__builtin_ia32_pmulhw">, + def int_x86_mmx_pmulh_w : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem, Commutative]>; - def int_x86_mmx_pmull_w : GCCBuiltin<"__builtin_ia32_pmullw">, + def int_x86_mmx_pmull_w : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem, Commutative]>; - def int_x86_mmx_pmulhu_w : GCCBuiltin<"__builtin_ia32_pmulhuw">, + def int_x86_mmx_pmulhu_w : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem, Commutative]>; - def int_x86_mmx_pmulu_dq : GCCBuiltin<"__builtin_ia32_pmuludq">, + def int_x86_mmx_pmulu_dq : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem, Commutative]>; - def int_x86_mmx_pmadd_wd : GCCBuiltin<"__builtin_ia32_pmaddwd">, + def int_x86_mmx_pmadd_wd : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem, Commutative]>; // Bitwise operations - def int_x86_mmx_pand : GCCBuiltin<"__builtin_ia32_pand">, + def int_x86_mmx_pand : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem, Commutative]>; - def int_x86_mmx_pandn : GCCBuiltin<"__builtin_ia32_pandn">, + def int_x86_mmx_pandn : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem]>; - def int_x86_mmx_por : GCCBuiltin<"__builtin_ia32_por">, + def int_x86_mmx_por : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem, Commutative]>; - def int_x86_mmx_pxor : GCCBuiltin<"__builtin_ia32_pxor">, + def int_x86_mmx_pxor : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem, Commutative]>; // Averages - def int_x86_mmx_pavg_b : GCCBuiltin<"__builtin_ia32_pavgb">, + def int_x86_mmx_pavg_b : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem, Commutative]>; - def int_x86_mmx_pavg_w : GCCBuiltin<"__builtin_ia32_pavgw">, + def int_x86_mmx_pavg_w : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem, Commutative]>; // Maximum - def int_x86_mmx_pmaxu_b : GCCBuiltin<"__builtin_ia32_pmaxub">, + def int_x86_mmx_pmaxu_b : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem, Commutative]>; - def int_x86_mmx_pmaxs_w : GCCBuiltin<"__builtin_ia32_pmaxsw">, + def int_x86_mmx_pmaxs_w : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem, Commutative]>; // Minimum - def int_x86_mmx_pminu_b : GCCBuiltin<"__builtin_ia32_pminub">, + def int_x86_mmx_pminu_b : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem, Commutative]>; - def int_x86_mmx_pmins_w : GCCBuiltin<"__builtin_ia32_pminsw">, + def int_x86_mmx_pmins_w : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem, Commutative]>; // Packed sum of absolute differences - def int_x86_mmx_psad_bw : GCCBuiltin<"__builtin_ia32_psadbw">, + def int_x86_mmx_psad_bw : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem, Commutative]>; } @@ -2257,58 +2257,58 @@ // Integer shift ops. let TargetPrefix = "x86" in { // All intrinsics start with "llvm.x86.". // Shift left logical - def int_x86_mmx_psll_w : GCCBuiltin<"__builtin_ia32_psllw">, + def int_x86_mmx_psll_w : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem]>; - def int_x86_mmx_psll_d : GCCBuiltin<"__builtin_ia32_pslld">, + def int_x86_mmx_psll_d : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem]>; - def int_x86_mmx_psll_q : GCCBuiltin<"__builtin_ia32_psllq">, + def int_x86_mmx_psll_q : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem]>; - def int_x86_mmx_psrl_w : GCCBuiltin<"__builtin_ia32_psrlw">, + def int_x86_mmx_psrl_w : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem]>; - def int_x86_mmx_psrl_d : GCCBuiltin<"__builtin_ia32_psrld">, + def int_x86_mmx_psrl_d : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem]>; - def int_x86_mmx_psrl_q : GCCBuiltin<"__builtin_ia32_psrlq">, + def int_x86_mmx_psrl_q : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem]>; - def int_x86_mmx_psra_w : GCCBuiltin<"__builtin_ia32_psraw">, + def int_x86_mmx_psra_w : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem]>; - def int_x86_mmx_psra_d : GCCBuiltin<"__builtin_ia32_psrad">, + def int_x86_mmx_psra_d : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem]>; // Oddly these don't require an immediate due to a gcc compatibility issue. - def int_x86_mmx_pslli_w : GCCBuiltin<"__builtin_ia32_psllwi">, + def int_x86_mmx_pslli_w : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_i32_ty], [IntrNoMem]>; - def int_x86_mmx_pslli_d : GCCBuiltin<"__builtin_ia32_pslldi">, + def int_x86_mmx_pslli_d : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_i32_ty], [IntrNoMem]>; - def int_x86_mmx_pslli_q : GCCBuiltin<"__builtin_ia32_psllqi">, + def int_x86_mmx_pslli_q : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_i32_ty], [IntrNoMem]>; - def int_x86_mmx_psrli_w : GCCBuiltin<"__builtin_ia32_psrlwi">, + def int_x86_mmx_psrli_w : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_i32_ty], [IntrNoMem]>; - def int_x86_mmx_psrli_d : GCCBuiltin<"__builtin_ia32_psrldi">, + def int_x86_mmx_psrli_d : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_i32_ty], [IntrNoMem]>; - def int_x86_mmx_psrli_q : GCCBuiltin<"__builtin_ia32_psrlqi">, + def int_x86_mmx_psrli_q : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_i32_ty], [IntrNoMem]>; - def int_x86_mmx_psrai_w : GCCBuiltin<"__builtin_ia32_psrawi">, + def int_x86_mmx_psrai_w : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_i32_ty], [IntrNoMem]>; - def int_x86_mmx_psrai_d : GCCBuiltin<"__builtin_ia32_psradi">, + def int_x86_mmx_psrai_d : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_i32_ty], [IntrNoMem]>; } @@ -2353,74 +2353,74 @@ } // Pack ops. let TargetPrefix = "x86" in { // All intrinsics start with "llvm.x86.". - def int_x86_mmx_packsswb : GCCBuiltin<"__builtin_ia32_packsswb">, + def int_x86_mmx_packsswb : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem]>; - def int_x86_mmx_packssdw : GCCBuiltin<"__builtin_ia32_packssdw">, + def int_x86_mmx_packssdw : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem]>; - def int_x86_mmx_packuswb : GCCBuiltin<"__builtin_ia32_packuswb">, + def int_x86_mmx_packuswb : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem]>; } // Unpacking ops. let TargetPrefix = "x86" in { // All intrinsics start with "llvm.x86.". - def int_x86_mmx_punpckhbw : GCCBuiltin<"__builtin_ia32_punpckhbw">, + def int_x86_mmx_punpckhbw : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem]>; - def int_x86_mmx_punpckhwd : GCCBuiltin<"__builtin_ia32_punpckhwd">, + def int_x86_mmx_punpckhwd : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem]>; - def int_x86_mmx_punpckhdq : GCCBuiltin<"__builtin_ia32_punpckhdq">, + def int_x86_mmx_punpckhdq : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem]>; - def int_x86_mmx_punpcklbw : GCCBuiltin<"__builtin_ia32_punpcklbw">, + def int_x86_mmx_punpcklbw : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem]>; - def int_x86_mmx_punpcklwd : GCCBuiltin<"__builtin_ia32_punpcklwd">, + def int_x86_mmx_punpcklwd : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem]>; - def int_x86_mmx_punpckldq : GCCBuiltin<"__builtin_ia32_punpckldq">, + def int_x86_mmx_punpckldq : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem]>; } // Integer comparison ops let TargetPrefix = "x86" in { // All intrinsics start with "llvm.x86.". - def int_x86_mmx_pcmpeq_b : GCCBuiltin<"__builtin_ia32_pcmpeqb">, + def int_x86_mmx_pcmpeq_b : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem, Commutative]>; - def int_x86_mmx_pcmpeq_w : GCCBuiltin<"__builtin_ia32_pcmpeqw">, + def int_x86_mmx_pcmpeq_w : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem, Commutative]>; - def int_x86_mmx_pcmpeq_d : GCCBuiltin<"__builtin_ia32_pcmpeqd">, + def int_x86_mmx_pcmpeq_d : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem, Commutative]>; - def int_x86_mmx_pcmpgt_b : GCCBuiltin<"__builtin_ia32_pcmpgtb">, + def int_x86_mmx_pcmpgt_b : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem]>; - def int_x86_mmx_pcmpgt_w : GCCBuiltin<"__builtin_ia32_pcmpgtw">, + def int_x86_mmx_pcmpgt_w : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem]>; - def int_x86_mmx_pcmpgt_d : GCCBuiltin<"__builtin_ia32_pcmpgtd">, + def int_x86_mmx_pcmpgt_d : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty], [IntrNoMem]>; } // Misc. let TargetPrefix = "x86" in { // All intrinsics start with "llvm.x86.". - def int_x86_mmx_maskmovq : GCCBuiltin<"__builtin_ia32_maskmovq">, + def int_x86_mmx_maskmovq : Intrinsic<[], [llvm_x86mmx_ty, llvm_x86mmx_ty, llvm_ptr_ty], []>; - def int_x86_mmx_pmovmskb : GCCBuiltin<"__builtin_ia32_pmovmskb">, + def int_x86_mmx_pmovmskb : Intrinsic<[llvm_i32_ty], [llvm_x86mmx_ty], [IntrNoMem]>; - def int_x86_mmx_movnt_dq : GCCBuiltin<"__builtin_ia32_movntq">, + def int_x86_mmx_movnt_dq : Intrinsic<[], [llvm_ptrx86mmx_ty, llvm_x86mmx_ty], []>; - def int_x86_mmx_palignr_b : GCCBuiltin<"__builtin_ia32_palignr">, + def int_x86_mmx_palignr_b : Intrinsic<[llvm_x86mmx_ty], [llvm_x86mmx_ty, llvm_x86mmx_ty, llvm_i8_ty], [IntrNoMem, ImmArg>]>;