[X86] Lower scalar llvm.clmul intrinsics to PCLMULQDQ (#175189) (#175216) Add support for lowering scalar llvm.clmul intrinsics (i8/i16/i32/i64) to the PCLMULQDQ hardware instruction on X86 targets with the PCLMUL feature, instead of using the default software expansion. The lowering: - Extends smaller types to the target's native width (i64 on x86-64, i32 on i686) - Uses SCALAR_TO_VECTOR to create vectors (v2i64 on x86-64, v4i32 with bitcast to v2i64 on i686) - Performs X86ISD::PCLMULQDQ with immediate 0x00 - Extracts the result and truncates back to the original type i8/i16/i32 CLMUL is enabled on both 32-bit and 64-bit targets. i64 CLMUL/CLMULH is only enabled on 64-bit targets. Also adds ISD::CLMULH i64 support by extracting the upper element from the v2i64 result. Fixes #175189
Welcome to the LLVM project!
This repository contains the source code for LLVM, a toolkit for the construction of highly optimized compilers, optimizers, and run-time environments.
The LLVM project has multiple components. The core of the project is itself called “LLVM”. This contains all of the tools, libraries, and header files needed to process intermediate representations and convert them into object files. Tools include an assembler, disassembler, bitcode analyzer, and bitcode optimizer.
C-like languages use the Clang frontend. This component compiles C, C++, Objective-C, and Objective-C++ code into LLVM bitcode -- and from there into object files, using LLVM.
Other components include: the libc++ C++ standard library, the LLD linker, and more.
Consult the Getting Started with LLVM page for information on building and running LLVM.
For information on how to contribute to the LLVM project, please take a look at the Contributing to LLVM guide.
Join the LLVM Discourse forums, Discord chat, LLVM Office Hours or Regular sync-ups.
The LLVM project has adopted a code of conduct for participants to all modes of communication within the project.