Question

Hello,

Could someone please answer the following question:

Does LLVM support code generation for Intel Processors? Which Intel processors are supported? I am interested especially in Intel Xeon Processor, but you can give me information about the others as well.

Thank you,
Iulia

Hi Lulia,

Does LLVM support code generation for Intel Processors? Which Intel
processors are supported? I am interested especially in Intel Xeon
Processor, but you can give me information about the others as well.

Yes, x86 output is supported. "Xeon" is just a brand name for Intel's
server chips though, and covers lots of very different CPUs going back
many years.

LLVM distinguishes them by which instructions the CPU supports, which
is mostly determined by which generation the chip is. You may have
heard names like "Haswell", "Skylake", "Canonlake" mentioned; and
those are what LLVM uses to choose what you're compiling for. For
example if you know your Xeon is a Skylake one you'd specify
"-mcpu=skylake" (or an equivalent via the C++ API if you're writing
your own compiler).

LLVM is capable of generating code for all of them, though some may
have had more tuning work for performance.

Cheers.

Tim.

Hello,

  1. Can you please tell me how can I find the type of my Intel Xeon?
    I see in LLVM code that Intel Xeon processors can be of type “core2”, “penryn”, “westmere”, “skylake”.

  2. I also see that “skylake” can be a type and a subtype as well.
    How can I find out the subtype of my architecture?

Looking forward for you answer. Thank you.
Iulia

Hi Lulia,

Does LLVM support code generation for Intel Processors? Which Intel
processors are supported? I am interested especially in Intel Xeon
Processor, but you can give me information about the others as well.

Yes, x86 output is supported. “Xeon” is just a brand name for Intel’s
server chips though, and covers lots of very different CPUs going back
many years.

LLVM distinguishes them by which instructions the CPU supports, which
is mostly determined by which generation the chip is. You may have
heard names like “Haswell”, “Skylake”, “Canonlake” mentioned; and
those are what LLVM uses to choose what you’re compiling for. For
example if you know your Xeon is a Skylake one you’d specify
“-mcpu=skylake” (or an equivalent via the C++ API if you’re writing
your own compiler).

LLVM is capable of generating code for all of them, though some may
have had more tuning work for performance.

Cheers.

Tim.

grep name /proc/cpuinfo

Then look up the model number in

https://en.wikipedia.org/wiki/List_of_Intel_Xeon_microprocessors

Can you also please tell me how can I find out the ABI (application binary interface)?

Thanks,
Iulia

grep name /proc/cpuinfo

Then look up the model number in

https://en.wikipedia.org/wiki/List_of_Intel_Xeon_microprocessors

Could you send your messages with a smaller font, or better still in
plain text? It's very distracting and quite difficult to read
(particularly your message about the errors MSVC was giving).

Anyway, your ABI will be determined by which OS you're compiling for
in almost all cases. And if you're building Clang on the same platform
you're running the binaries on that should be correctly detected when
you run CMake.

Otherwise you'll have to set the LLVM_DEFAULT_TARGET_TRIPLE CMake
variable. Typical values are "x86_64-linux-gnu",
"x86_64-apple-macosx10.12" or "x86_64-windows-msvc". That will also
set the corresponding ABI.

Cheers.

Tim.

Thank you. So the ABI in llvm will be “gnu” for all Linux distributions?

Can you also please tell me how can I find out the ABI (application binary
interface)?

Could you send your messages with a smaller font, or better still in
plain text? It’s very distracting and quite difficult to read
(particularly your message about the errors MSVC was giving).

Anyway, your ABI will be determined by which OS you’re compiling for
in almost all cases. And if you’re building Clang on the same platform
you’re running the binaries on that should be correctly detected when
you run CMake.

Otherwise you’ll have to set the LLVM_DEFAULT_TARGET_TRIPLE CMake
variable. Typical values are “x86_64-linux-gnu”,
“x86_64-apple-macosx10.12” or “x86_64-windows-msvc”. That will also
set the corresponding ABI.

Cheers.

Tim.

The last part of the triple will always be "gnu" for x86, yes. The ABI
itself I might call GNU, or SysV depending on exactly what I'm talking
about.

Cheers.

Tim.

I want to cross-compile using clang and I have to specify the following triple:
---
I know that sub-architectures (“sub” in the triple) for x86_64 Intel Xeon processors could be v2 for ivy bridge or v3 for haswell or v4 etc. Could you please answer: which version of sub-architecture is considered sandy bridge for Intel® Xeon® processor E5-4600/2600/1600 product family (I am thinking it could be v1 or v0 in llvm)? Thank you.

I don't think I've ever seen that notation. In fact I don't think
x86_64 uses sub-architectures at all. All Linux triples I've seen have
just been "x86_64-linux-gnu" with the CPU specified via a separate
-march=sandybridge option.

Cheers.

Tim.

Wouldn't it be nice if the available values of the triple's components were displayed under some option? :slight_smile:

-Krzysztof