2020-05-10 14:54:30 +00:00
|
|
|
use gccjit::Function;
|
|
|
|
|
|
|
|
use crate::context::CodegenCx;
|
|
|
|
|
|
|
|
pub fn intrinsic<'gcc, 'tcx>(name: &str, cx: &CodegenCx<'gcc, 'tcx>) -> Function<'gcc> {
|
2022-02-06 22:04:24 +00:00
|
|
|
let gcc_name =
|
2020-05-10 14:54:30 +00:00
|
|
|
match name {
|
2022-02-06 22:04:24 +00:00
|
|
|
"llvm.x86.xgetbv" => "__builtin_ia32_xgetbv",
|
2021-08-15 12:28:46 +00:00
|
|
|
// NOTE: this doc specifies the equivalent GCC builtins: http://huonw.github.io/llvmint/llvmint/x86/index.html
|
2022-02-06 22:04:24 +00:00
|
|
|
"llvm.x86.sse2.pmovmskb.128" => "__builtin_ia32_pmovmskb128",
|
|
|
|
"llvm.x86.avx2.pmovmskb" => "__builtin_ia32_pmovmskb256",
|
2020-05-10 14:54:30 +00:00
|
|
|
"llvm.x86.sse2.cmp.pd" => "__builtin_ia32_cmppd",
|
|
|
|
"llvm.x86.sse2.movmsk.pd" => "__builtin_ia32_movmskpd",
|
2022-02-06 22:04:24 +00:00
|
|
|
"llvm.x86.ssse3.pshuf.b.128" => "__builtin_ia32_pshufb128",
|
|
|
|
"llvm.x86.sse2.pause" => "__builtin_ia32_pause",
|
|
|
|
"llvm.x86.avx2.pshuf.b" => "__builtin_ia32_pshufb256",
|
|
|
|
"llvm.x86.avx2.pslli.d" => "__builtin_ia32_pslldi256",
|
|
|
|
"llvm.x86.avx2.psrli.d" => "__builtin_ia32_psrldi256",
|
2022-03-27 16:05:23 +00:00
|
|
|
"llvm.x86.sse2.pslli.q" => "__builtin_ia32_psllqi128",
|
2022-02-06 22:04:24 +00:00
|
|
|
"llvm.x86.avx.vzeroupper" => "__builtin_ia32_vzeroupper",
|
|
|
|
"llvm.x86.avx2.vperm2i128" => "__builtin_ia32_permti256",
|
|
|
|
"llvm.x86.avx2.psrli.w" => "__builtin_ia32_psrlwi256",
|
|
|
|
"llvm.x86.sse2.storeu.dq" => "__builtin_ia32_storedqu",
|
|
|
|
"llvm.x86.sse2.psrli.w" => "__builtin_ia32_psrlwi128",
|
|
|
|
"llvm.x86.avx2.pabs.d" => "__builtin_ia32_pabsd256",
|
|
|
|
"llvm.x86.sse2.psrli.q" => "__builtin_ia32_psrlqi128",
|
|
|
|
"llvm.x86.avx2.pabs.w" => "__builtin_ia32_pabsw256",
|
|
|
|
"llvm.x86.avx2.pblendvb" => "__builtin_ia32_pblendvb256",
|
|
|
|
"llvm.x86.avx2.pabs.b" => "__builtin_ia32_pabsb256",
|
|
|
|
"llvm.x86.avx2.psrli.q" => "__builtin_ia32_psrlqi256",
|
|
|
|
"llvm.x86.sse41.pblendvb" => "__builtin_ia32_pblendvb128",
|
2022-03-27 16:05:23 +00:00
|
|
|
"llvm.x86.sse41.pblendw" => "__builtin_ia32_pblendw128",
|
|
|
|
"llvm.x86.sse42.crc32.32.8" => "__builtin_ia32_crc32qi",
|
|
|
|
"llvm.x86.sse42.crc32.32.16" => "__builtin_ia32_crc32hi",
|
|
|
|
"llvm.x86.sse42.crc32.32.32" => "__builtin_ia32_crc32si",
|
|
|
|
"llvm.x86.sse42.crc32.64.64" => "__builtin_ia32_crc32di",
|
2022-02-06 22:04:24 +00:00
|
|
|
"llvm.x86.avx2.pavg.w" => "__builtin_ia32_pavgw256",
|
|
|
|
"llvm.x86.avx2.pavg.b" => "__builtin_ia32_pavgb256",
|
|
|
|
"llvm.x86.avx2.phadd.w" => "__builtin_ia32_phaddw256",
|
|
|
|
"llvm.x86.avx2.phadd.d" => "__builtin_ia32_phaddd256",
|
|
|
|
"llvm.x86.avx2.phadd.sw" => "__builtin_ia32_phaddsw256",
|
|
|
|
"llvm.x86.avx2.phsub.w" => "__builtin_ia32_phsubw256",
|
|
|
|
"llvm.x86.avx2.phsub.d" => "__builtin_ia32_phsubd256",
|
|
|
|
"llvm.x86.avx2.phsub.sw" => "__builtin_ia32_phsubsw256",
|
|
|
|
"llvm.x86.avx2.gather.d.d" => "__builtin_ia32_gatherd_d",
|
|
|
|
"llvm.x86.avx2.gather.d.d.256" => "__builtin_ia32_gatherd_d256",
|
|
|
|
"llvm.x86.avx2.gather.d.ps" => "__builtin_ia32_gatherd_ps",
|
|
|
|
"llvm.x86.avx2.gather.d.ps.256" => "__builtin_ia32_gatherd_ps256",
|
|
|
|
"llvm.x86.avx2.gather.d.q" => "__builtin_ia32_gatherd_q",
|
|
|
|
"llvm.x86.avx2.gather.d.q.256" => "__builtin_ia32_gatherd_q256",
|
|
|
|
"llvm.x86.avx2.gather.d.pd" => "__builtin_ia32_gatherd_pd",
|
|
|
|
"llvm.x86.avx2.gather.d.pd.256" => "__builtin_ia32_gatherd_pd256",
|
|
|
|
"llvm.x86.avx2.gather.q.d" => "__builtin_ia32_gatherq_d",
|
|
|
|
"llvm.x86.avx2.gather.q.d.256" => "__builtin_ia32_gatherq_d256",
|
|
|
|
"llvm.x86.avx2.gather.q.ps" => "__builtin_ia32_gatherq_ps",
|
|
|
|
"llvm.x86.avx2.gather.q.ps.256" => "__builtin_ia32_gatherq_ps256",
|
|
|
|
"llvm.x86.avx2.gather.q.q" => "__builtin_ia32_gatherq_q",
|
|
|
|
"llvm.x86.avx2.gather.q.q.256" => "__builtin_ia32_gatherq_q256",
|
|
|
|
"llvm.x86.avx2.gather.q.pd" => "__builtin_ia32_gatherq_pd",
|
|
|
|
"llvm.x86.avx2.gather.q.pd.256" => "__builtin_ia32_gatherq_pd256",
|
|
|
|
"llvm.x86.avx2.pmadd.wd" => "__builtin_ia32_pmaddwd256",
|
|
|
|
"llvm.x86.avx2.pmadd.ub.sw" => "__builtin_ia32_pmaddubsw256",
|
|
|
|
"llvm.x86.avx2.maskload.d" => "__builtin_ia32_maskloadd",
|
|
|
|
"llvm.x86.avx2.maskload.d.256" => "__builtin_ia32_maskloadd256",
|
|
|
|
"llvm.x86.avx2.maskload.q" => "__builtin_ia32_maskloadq",
|
|
|
|
"llvm.x86.avx2.maskload.q.256" => "__builtin_ia32_maskloadq256",
|
|
|
|
"llvm.x86.avx2.maskstore.d" => "__builtin_ia32_maskstored",
|
|
|
|
"llvm.x86.avx2.maskstore.d.256" => "__builtin_ia32_maskstored256",
|
|
|
|
"llvm.x86.avx2.maskstore.q" => "__builtin_ia32_maskstoreq",
|
|
|
|
"llvm.x86.avx2.maskstore.q.256" => "__builtin_ia32_maskstoreq256",
|
|
|
|
"llvm.x86.avx2.pmaxs.w" => "__builtin_ia32_pmaxsw256",
|
|
|
|
"llvm.x86.avx2.pmaxs.d" => "__builtin_ia32_pmaxsd256",
|
|
|
|
"llvm.x86.avx2.pmaxs.b" => "__builtin_ia32_pmaxsb256",
|
|
|
|
"llvm.x86.avx2.pmaxu.w" => "__builtin_ia32_pmaxuw256",
|
|
|
|
"llvm.x86.avx2.pmaxu.d" => "__builtin_ia32_pmaxud256",
|
|
|
|
"llvm.x86.avx2.pmaxu.b" => "__builtin_ia32_pmaxub256",
|
|
|
|
"llvm.x86.avx2.pmins.w" => "__builtin_ia32_pminsw256",
|
|
|
|
"llvm.x86.avx2.pmins.d" => "__builtin_ia32_pminsd256",
|
|
|
|
"llvm.x86.avx2.pmins.b" => "__builtin_ia32_pminsb256",
|
|
|
|
"llvm.x86.avx2.pminu.w" => "__builtin_ia32_pminuw256",
|
|
|
|
"llvm.x86.avx2.pminu.d" => "__builtin_ia32_pminud256",
|
|
|
|
"llvm.x86.avx2.pminu.b" => "__builtin_ia32_pminub256",
|
|
|
|
"llvm.x86.avx2.mpsadbw" => "__builtin_ia32_mpsadbw256",
|
|
|
|
"llvm.x86.avx2.pmul.dq" => "__builtin_ia32_pmuldq256",
|
|
|
|
"llvm.x86.avx2.pmulu.dq" => "__builtin_ia32_pmuludq256",
|
|
|
|
"llvm.x86.avx2.pmulh.w" => "__builtin_ia32_pmulhw256",
|
|
|
|
"llvm.x86.avx2.pmulhu.w" => "__builtin_ia32_pmulhuw256",
|
|
|
|
"llvm.x86.avx2.pmul.hr.sw" => "__builtin_ia32_pmulhrsw256",
|
|
|
|
"llvm.x86.avx2.packsswb" => "__builtin_ia32_packsswb256",
|
|
|
|
"llvm.x86.avx2.packssdw" => "__builtin_ia32_packssdw256",
|
|
|
|
"llvm.x86.avx2.packuswb" => "__builtin_ia32_packuswb256",
|
|
|
|
"llvm.x86.avx2.packusdw" => "__builtin_ia32_packusdw256",
|
|
|
|
"llvm.x86.avx2.permd" => "__builtin_ia32_permvarsi256",
|
|
|
|
"llvm.x86.avx2.permps" => "__builtin_ia32_permvarsf256",
|
|
|
|
"llvm.x86.avx2.psad.bw" => "__builtin_ia32_psadbw256",
|
|
|
|
"llvm.x86.avx2.psign.w" => "__builtin_ia32_psignw256",
|
|
|
|
"llvm.x86.avx2.psign.d" => "__builtin_ia32_psignd256",
|
|
|
|
"llvm.x86.avx2.psign.b" => "__builtin_ia32_psignb256",
|
|
|
|
"llvm.x86.avx2.psll.w" => "__builtin_ia32_psllw256",
|
|
|
|
"llvm.x86.avx2.psll.d" => "__builtin_ia32_pslld256",
|
|
|
|
"llvm.x86.avx2.psll.q" => "__builtin_ia32_psllq256",
|
|
|
|
"llvm.x86.avx2.pslli.w" => "__builtin_ia32_psllwi256",
|
|
|
|
"llvm.x86.avx2.pslli.q" => "__builtin_ia32_psllqi256",
|
|
|
|
"llvm.x86.avx2.psllv.d" => "__builtin_ia32_psllv4si",
|
|
|
|
"llvm.x86.avx2.psllv.d.256" => "__builtin_ia32_psllv8si",
|
|
|
|
"llvm.x86.avx2.psllv.q" => "__builtin_ia32_psllv2di",
|
|
|
|
"llvm.x86.avx2.psllv.q.256" => "__builtin_ia32_psllv4di",
|
|
|
|
"llvm.x86.avx2.psra.w" => "__builtin_ia32_psraw256",
|
|
|
|
"llvm.x86.avx2.psra.d" => "__builtin_ia32_psrad256",
|
|
|
|
"llvm.x86.avx2.psrai.w" => "__builtin_ia32_psrawi256",
|
|
|
|
"llvm.x86.avx2.psrai.d" => "__builtin_ia32_psradi256",
|
|
|
|
"llvm.x86.avx2.psrav.d" => "__builtin_ia32_psrav4si",
|
|
|
|
"llvm.x86.avx2.psrav.d.256" => "__builtin_ia32_psrav8si",
|
|
|
|
"llvm.x86.avx2.psrl.w" => "__builtin_ia32_psrlw256",
|
|
|
|
"llvm.x86.avx2.psrl.d" => "__builtin_ia32_psrld256",
|
|
|
|
"llvm.x86.avx2.psrl.q" => "__builtin_ia32_psrlq256",
|
|
|
|
"llvm.x86.avx2.psrlv.d" => "__builtin_ia32_psrlv4si",
|
|
|
|
"llvm.x86.avx2.psrlv.d.256" => "__builtin_ia32_psrlv8si",
|
|
|
|
"llvm.x86.avx2.psrlv.q" => "__builtin_ia32_psrlv2di",
|
|
|
|
"llvm.x86.avx2.psrlv.q.256" => "__builtin_ia32_psrlv4di",
|
|
|
|
"llvm.x86.sse.sqrt.ss" => "__builtin_ia32_sqrtss",
|
2022-03-27 16:05:23 +00:00
|
|
|
"llvm.x86.pclmulqdq" => "__builtin_ia32_pclmulqdq128",
|
|
|
|
"llvm.x86.sha1msg1" => "__builtin_ia32_sha1msg1",
|
|
|
|
"llvm.x86.sha1msg2" => "__builtin_ia32_sha1msg2",
|
|
|
|
"llvm.x86.sha1nexte" => "__builtin_ia32_sha1nexte",
|
|
|
|
"llvm.x86.sha1rnds4" => "__builtin_ia32_sha1rnds4",
|
|
|
|
"llvm.x86.sha256msg1" => "__builtin_ia32_sha256msg1",
|
|
|
|
"llvm.x86.sha256msg2" => "__builtin_ia32_sha256msg2",
|
|
|
|
"llvm.x86.sha256rnds2" => "__builtin_ia32_sha256rnds2",
|
2022-02-06 22:04:24 +00:00
|
|
|
|
|
|
|
"llvm.sqrt.v2f64" => "__builtin_ia32_sqrtpd",
|
|
|
|
_ => unimplemented!("***** unsupported LLVM intrinsic {}", name),
|
2020-05-10 14:54:30 +00:00
|
|
|
};
|
|
|
|
|
2022-02-06 22:04:24 +00:00
|
|
|
let func = cx.context.get_target_builtin_function(gcc_name);
|
|
|
|
cx.functions.borrow_mut().insert(gcc_name.to_string(), func);
|
|
|
|
func
|
2020-05-10 14:54:30 +00:00
|
|
|
}
|