I was working on a code using SSE4.1 instructions. When compiled with "icc -O3 -msse4.1", everything worked just fine. Howerver, if I add -ipo to the compilation, the code can be generated fine, but it will crash with "Illegal instruction" error.
Using valgrind, I found the offending instruction was the following
vex amd64->IR: unhandled instruction bytes: 0x66 0x45 0xF 0x3A 0x40 0xD9
I don't know what does that mean.
Similarly, if I used -fast, I will also get some other errors, such as
Fatal Error: This program was not built to run on the processor in your system.
The allowed processors are: Intel processors with SSE4.2 and POPCNT instructions support.
My computer has a Xeon E5520 quad-core CPU, it is running 64bit Ubuntu Linux 10.04. The /proc/cpuinfo shows the following
- processor : 0
- vendor_id : GenuineIntel
- cpu family : 6
- model : 26
- model name : Intel Xeon CPU E5520 @ 2.27GHz
- stepping : 5
- cpu MHz : 2266.785
- cache size : 8192 KB
- physical id : 0
- siblings : 4
- core id : 0
- cpu cores : 4
- apicid : 0
- initial apicid : 0
- fpu : yes
- fpu_exception : yes
- cpuid level : 11
- wp : yes
- flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm dca sse4_1 sse4_2 popcnt lahf_lm ida tpr_shadow vnmi flexpriority ept vpid
- bogomips : 4533.57
- clflush size : 64
- cache_alignment : 64
- address sizes : 40 bits physical, 48 bits virtual
- power management:
It looks like sse4_1, sse4_2 and popcnt are all supported.
Can any one let me know what was going on and if there is a work-around? The icc version is icc "(ICC) 12.0.0 20101006".
thanks in advance!