[llvm-dev] Suggestions on code generation for SIMD
serge guelton via llvm-dev
llvm-dev at lists.llvm.org
Tue Jan 9 22:47:48 PST 2018
On Tue, Jan 09, 2018 at 08:59:17PM -0800, Linchuan Chen wrote:
> Thanks Serge! This means for every new intrinsic set, a systematic change
> should be made to LLVM to support the new intrinsic set, right? The change
> should include frontend change, IR instruction set change, as well as low level
> code generation changes?
It really depends. In most cases, the intrinsic is implemented in terms
of generic vector instruction, directly represented at the LLVM level:
static __inline __m256d __DEFAULT_FN_ATTRS
_mm256_sub_pd(__m256d __a, __m256d __b)
{
return (__m256d)((__v4df)__a-(__v4df)__b);
}
But some intrinsics cn not be modeled that way:
static __inline __m256d __DEFAULT_FN_ATTRS
_mm256_hadd_pd(__m256d __a, __m256d __b)
{
return (__m256d)__builtin_ia32_haddpd256((__v4df)__a, (__v4df)__b);
}
In that case, the builtin is relatively opaque to the Middle End, nd
lowered in the backend (see include/llvm/IR/IntrinsicsX86.td)
More information about the llvm-dev
mailing list