--- Begin Message ---
Package: uqm
Version: 0.6.2.dfsg-9.3
Severity: serious
Justification: fails to build from source (but built successfully in the past)
Forwarded: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78311
Hi,
uqm started to FTBFS after the switch of the default compiler from gcc-5 to
gcc-6.
gcc -c -o "obj/release/src/sc2code/libs/graphics/sdl/2xscalers_mmx.c.o" -g -O2
-fdebug-prefix-map=/build/uqm-0.6.2.dfsg=. -fstack-protector-strong -Wformat
-Werror=format-security -I/usr/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT
-I/usr/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT -O3 -DGFXMODULE_SDL
-DHAVE_OPENGL -DSOUNDMODULE_SDL -DNETPLAY=NETPLAY_FULL -DHAVE_JOYSTICK
-DHAVE_ZIP=1 -DUSE_PLATFORM_ACCEL -I "." -g -Wdate-time -D_FORTIFY_SOURCE=2 -I
src -I src/sc2code -I src/sc2code/libs
"src/sc2code/libs/graphics/sdl/2xscalers_mmx.c"
src/sc2code/libs/graphics/sdl/scalemmx.h: Assembler messages:
src/sc2code/libs/graphics/sdl/scalemmx.h:638: Error: register value used as
expression
src/sc2code/libs/graphics/sdl/scalemmx.h:640: Error: register value used as
expression
src/sc2code/libs/graphics/sdl/scalemmx.h:638: Error: register value used as
expression
src/sc2code/libs/graphics/sdl/scalemmx.h:640: Error: register value used as
expression
[...]
That's in an inline assembly block ... I've marked the
problematic lines with ***
// compare 2 pixels with respect to their YUV representations
// tolerance set by toler arg
// returns true: close; false: distant (-gt toler)
static inline bool
SCALE_(CmpYUV) (Uint32 pix1, Uint32 pix2, int toler)
{
int delta;
__asm__ (
"movd %1, %%mm1 \n\t"
"movd %2, %%mm3 \n\t"
// convert RGB888 to 555
// this is somewhat parallelized
"punpcklbw %%mm0, %%mm1 \n\t"
CLR_UPPER32 (A_REG) "\n\t"
"psrlw $3, %%mm1 \n\t" // 8->5 bit
"punpcklbw %%mm0, %%mm3 \n\t"
"psrlw $3, %%mm3 \n\t" // 8->5 bit
"pmaddwd %4, %%mm1 \n\t" // shuffle into the right
channel order
"movq %%mm1, %%mm2 \n\t" // finish shuffling
"pmaddwd %4, %%mm3 \n\t" // shuffle into the right
channel order
CLR_UPPER32 (D_REG) "\n\t"
"movq %%mm3, %%mm4 \n\t" // finish shuffling
"punpckhdq %%mm0, %%mm2 \n\t" // ditto
"por %%mm2, %%mm1 \n\t" // ditto
"punpckhdq %%mm0, %%mm4 \n\t" // ditto
"por %%mm4, %%mm3 \n\t" // ditto
// lookup the YUV vector
"movd %%mm1, %%eax \n\t"
"movd %%mm3, %%edx \n\t"
//movd (%3, %%eax, 4), %%mm1
*** MOVD_WMO (%3, "%%" A_REG, 4, %%mm1) "\n\t"
"movq %%mm1, %%mm4 \n\t"
//movd (%3, %%edx, 4), %%mm2
*** MOVD_WMO (%3, "%%" D_REG, 4, %%mm2) "\n\t"
// get abs difference between YUV components
#ifdef USE_PSADBW
// we can use PSADBW and save us some grief
"psadbw %%mm2, %%mm1 \n\t"
"movd %%mm1, %0 \n\t"
#else
// no PSADBW -- have to do it the hard way
"psubusb %%mm2, %%mm1 \n\t"
"psubusb %%mm4, %%mm2 \n\t"
"por %%mm2, %%mm1 \n\t"
// sum the differences
// technically, this produces a MAX diff of 510
// but we do not need anything bigger, currently
"movq %%mm1, %%mm2 \n\t"
"psrlq $8, %%mm2 \n\t"
"paddusb %%mm2, %%mm1 \n\t"
"psrlq $8, %%mm2 \n\t"
"paddusb %%mm2, %%mm1 \n\t"
// store intermediate delta
"movd %%mm1, %0 \n\t"
"andl $0xff, %0 \n\t"
#endif /* USE_PSADBW */
: /*0*/"=r" (delta)
: /*1*/"rm" (pix1), /*2*/"rm" (pix2),
/*3*/OFFSETABLE_PTR(RGB15_to_YUV),
/*4*/"m" (mmx_888to555_mult)
: "%" A_REG, "%" D_REG
);
return (delta << 1) <= toler;
}
This was preprocessed with gcc-5:
static __inline__ bool
Scale_MMX_CmpYUV (Uint32 pix1, Uint32 pix2, int toler)
{
int delta;
__asm__ (
"movd %1, %%mm1 \n\t"
"movd %2, %%mm3 \n\t"
"punpcklbw %%mm0, %%mm1 \n\t"
"\n\t"
"psrlw $3, %%mm1 \n\t"
"punpcklbw %%mm0, %%mm3 \n\t"
"psrlw $3, %%mm3 \n\t"
"pmaddwd %4, %%mm1 \n\t"
"movq %%mm1, %%mm2 \n\t"
"pmaddwd %4, %%mm3 \n\t"
"\n\t"
"movq %%mm3, %%mm4 \n\t"
"punpckhdq %%mm0, %%mm2 \n\t"
"por %%mm2, %%mm1 \n\t"
"punpckhdq %%mm0, %%mm4 \n\t"
"por %%mm4, %%mm3 \n\t"
"movd %%mm1, %%eax \n\t"
"movd %%mm3, %%edx \n\t"
*** "movd " "%3" "(," "%%" "eax" "," "4" ")," "%%mm1" "\n\t"
"movq %%mm1, %%mm4 \n\t"
*** "movd " "%3" "(," "%%" "edx" "," "4" ")," "%%mm2" "\n\t"
# 657 "src/sc2code/libs/graphics/sdl/scalemmx.h"
"psubusb %%mm2, %%mm1 \n\t"
"psubusb %%mm4, %%mm2 \n\t"
"por %%mm2, %%mm1 \n\t"
"movq %%mm1, %%mm2 \n\t"
"psrlq $8, %%mm2 \n\t"
"paddusb %%mm2, %%mm1 \n\t"
"psrlq $8, %%mm2 \n\t"
"paddusb %%mm2, %%mm1 \n\t"
"movd %%mm1, %0 \n\t"
"andl $0xff, %0 \n\t"
: "=r" (delta)
: "rm" (pix1), "rm" (pix2),
"o" (*(RGB15_to_YUV)),
"m" (mmx_888to555_mult)
: "%" "eax", "%" "edx"
);
return (delta << 1) <= toler;
}
This was preprocessed by gcc-6:
static __inline__ bool
Scale_MMX_CmpYUV (Uint32 pix1, Uint32 pix2, int toler)
{
int delta;
__asm__ (
"movd %1, %%mm1 \n\t"
"movd %2, %%mm3 \n\t"
"punpcklbw %%mm0, %%mm1 \n\t"
"\n\t"
"psrlw $3, %%mm1 \n\t"
"punpcklbw %%mm0, %%mm3 \n\t"
"psrlw $3, %%mm3 \n\t"
"pmaddwd %4, %%mm1 \n\t"
"movq %%mm1, %%mm2 \n\t"
"pmaddwd %4, %%mm3 \n\t"
"\n\t"
"movq %%mm3, %%mm4 \n\t"
"punpckhdq %%mm0, %%mm2 \n\t"
"por %%mm2, %%mm1 \n\t"
"punpckhdq %%mm0, %%mm4 \n\t"
"por %%mm4, %%mm3 \n\t"
"movd %%mm1, %%eax \n\t"
"movd %%mm3, %%edx \n\t"
*** "movd " "%3" "(," "%%" "eax" "," "4" ")," "%%mm1" "\n\t"
"movq %%mm1, %%mm4 \n\t"
*** "movd " "%3" "(," "%%" "edx" "," "4" ")," "%%mm2" "\n\t"
# 657 "src/sc2code/libs/graphics/sdl/scalemmx.h"
"psubusb %%mm2, %%mm1 \n\t"
"psubusb %%mm4, %%mm2 \n\t"
"por %%mm2, %%mm1 \n\t"
"movq %%mm1, %%mm2 \n\t"
"psrlq $8, %%mm2 \n\t"
"paddusb %%mm2, %%mm1 \n\t"
"psrlq $8, %%mm2 \n\t"
"paddusb %%mm2, %%mm1 \n\t"
"movd %%mm1, %0 \n\t"
"andl $0xff, %0 \n\t"
: "=r" (delta)
: "rm" (pix1), "rm" (pix2),
"o" (*(RGB15_to_YUV)),
"m" (mmx_888to555_mult)
: "%" "eax", "%" "edx"
);
return (delta << 1) <= toler;
}
This is how it looks after being compiled to .s with gcc-5:
# 620 "src/sc2code/libs/graphics/sdl/scalemmx.h" 1
movd %ebx, %mm1
movd %ebp, %mm3
punpcklbw %mm0, %mm1
psrlw $3, %mm1
punpcklbw %mm0, %mm3
psrlw $3, %mm3
pmaddwd mmx_888to555_mult, %mm1
movq %mm1, %mm2
pmaddwd mmx_888to555_mult, %mm3
movq %mm3, %mm4
punpckhdq %mm0, %mm2
por %mm2, %mm1
punpckhdq %mm0, %mm4
por %mm4, %mm3
movd %mm1, %eax
movd %mm3, %edx
*** movd RGB15_to_YUV(,%eax,4),%mm1
movq %mm1, %mm4
*** movd RGB15_to_YUV(,%edx,4),%mm2
psubusb %mm2, %mm1
psubusb %mm4, %mm2
por %mm2, %mm1
movq %mm1, %mm2
psrlq $8, %mm2
paddusb %mm2, %mm1
psrlq $8, %mm2
paddusb %mm2, %mm1
movd %mm1, %ebp
andl $0xff, %ebp
and this was generated by gcc-6:
# 620 "src/sc2code/libs/graphics/sdl/scalemmx.h" 1
movd %ebx, %mm1
movd %ebp, %mm3
punpcklbw %mm0, %mm1
psrlw $3, %mm1
punpcklbw %mm0, %mm3
psrlw $3, %mm3
pmaddwd (%esi), %mm1
movq %mm1, %mm2
pmaddwd (%esi), %mm3
movq %mm3, %mm4
punpckhdq %mm0, %mm2
por %mm2, %mm1
punpckhdq %mm0, %mm4
por %mm4, %mm3
movd %mm1, %eax
movd %mm3, %edx
*** movd (%edi)(,%eax,4),%mm1
movq %mm1, %mm4
*** movd (%edi)(,%edx,4),%mm2
psubusb %mm2, %mm1
psubusb %mm4, %mm2
por %mm2, %mm1
movq %mm1, %mm2
psrlq $8, %mm2
paddusb %mm2, %mm1
psrlq $8, %mm2
paddusb %mm2, %mm1
movd %mm1, %ebp
andl $0xff, %ebp
OK, since this looks like a regression in gcc, I've filed
PR78311 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78311
Andreas
--- End Message ---