rust/src/intrinsic/llvm.rs

139 lines
8.7 KiB
Rust
Raw Normal View History

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
}