https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70208
Bug ID: 70208
Summary: [6 Regression] Operand size mismatch for `vpextrb' w/
-O3 -mavx -masm=intel
Product: gcc
Version: 6.0
Status: UNCONFIRMED
Keywords: assemble-failure, ssemmx
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: asolokha at gmx dot com
Target Milestone: ---
Target: x86_64-*-*-*
When compiling the following reduced snippet w/ -O3 (or -Ofast) -mavx (and
above) -masm=intel, gcc-6.0.0-alpha20160306 produces assembly that is diagnosed
by gas as incorrect:
char oi;
void
pl(void)
{
int mx;
if (!oi)
for (mx = 0; mx < 30; ++mx)
oi ^= 1;
}
% x86_64-unknown-linux-gnu-gcc-6.0.0-alpha20160306 -c -O3 -march=ivybridge
-masm=intel ca1lwdmy.c
/tmp/ccFaEKel.s: Assembler messages:
/tmp/ccFaEKel.s:21: Error: operand size mismatch for `vpextrb'
And the offending instruction is obviously wrong: there should be
vpextrb BYTE PTR oi[rip], xmm0, 0
instead of generated
vpextrb DWORD PTR oi[rip], xmm0, 0
Given that instruction pextrb was introduced in SSE 4.1 (?), specifying -msse4,
-msse4.1, or -msse4.2 also works.