Mulx: Illegal Instruction

Leif Leonhardy not.really at
Wed Dec 2 16:57:17 UTC 2015

Torbjörn Granlund wrote:
> Paul Peet <peetpaul69 at> writes:
>   Distro: Arch Linux (x86_64)
>   CPU: Intel Pentium G4400 (Skylake)
>   Kernel: Linux Kernel 4.2.5-1-ARCH
>   GMP-Version: 6.1.0
>   GCC: 5.2.0
>   I discovered this bug while trying to compiling the linux kernel but
>   it ultimately failed.
>   The issue which occured was an SIGILL one. I traced down the issue
>   back to the assembly code and the result was that
>   it was executing a mulx instruction which apparently is invalid here
>   on my cpu (Pentium G4400).
>   A member suggested that it might be an issue with the detection logic in gmp.
>   For more detailed overview of the issue:
>   Disassembly of the illegal instruction:
>   Dump of assembler code for function __gmpn_sqr_basecase_coreibwl:
>      0x00007ffff7708000 <+0>: cmp    $0x2,%rdx
>      0x00007ffff7708004 <+4>: jae    0x7ffff7708016
>   <__gmpn_sqr_basecase_coreibwl+22>
>      0x00007ffff7708006 <+6>: mov    (%rsi),%rdx
>   => 0x00007ffff7708009 <+9>: mulx   %rdx,%rax,%rdx
> I would expect skylake to come with MULX (which were introduced with
> haswell) as well as ADX (which were introduced with broadwell)..
> Perhaps Intel fused them out in an attempt to make a low-end product
> less attractive.  I'll ask.

None of the Pentium G Skylakes have AVX (just SSE 4.1/4.2) [1], nor
apparently BMI2.

Quoting Intel [2]:

"It is important to understand that a new instruction is supported on a
particular processor only if the corresponding CPUID feature flag is
set.  Applications must not assume support of any instruction set
extension simply based on, for example, checking a CPU model or family
and must instead always check for _all_ the feature CPUID bits of the
instructions being used."

InterestinglyTM, the Spec Update for the Skylake processors [3, PDF
only] lists the following:

SKD052:  CPUID Incorrectly Reports Bit Manipulation Instructions Support

Problem:  Executing CPUID with EAX = 7 and ECX = 0 may return EBX with
bits [3] and [8] set, incorrectly indicating the presence of BMI1 and
BMI2 instruction set extensions.

Implication:  Attempting to use instructions from the BMI1 or BMI2
instruction set extensions will result in a #UD exception.

Workaround:  It is possible for the BIOS to contain a workaround for
this erratum.

Status:  No fix.  Affects 6th Generation Intel® Pentium® processor
family and Intel® Celeron® processor family.

So at least for now, configuring with 'ivybridgenoavx' seems to be the
right thing to do.  (Adding in addition '-mno-bmi -mno-bmi2' to CFLAGS
isn't necessary in this case.)

@Paul:  You probably have to recompile a couple of packages with
modified CFLAGS / '-march=...' etc.




(page 30, 11)

> We encountered a similar situation with AVX challenged haswells.
> It will be too much work for us to support a matrix of
> (microarchitectures x fused instructions).  We will handle this new
> world by dropping back to an older microarchitecture where the fused
> instruction exists.  E.g., a skylake without MULX will be treated as an
> ivybridge.

More information about the gmp-bugs mailing list