[Pixman] [PATCH] SIMD: Try without any CFLAGS before forcing -mcpu=

Siarhei Siamashka siarhei.siamashka at gmail.com
Fri Mar 19 06:07:24 PDT 2010


On Friday 19 March 2010, Martin Jansa wrote:
> After this patch is SIMD enabled on my armv4t (samsung s3c2442) with
> -mthumb in CC by default, it never was before and I'm not sure it's
> intentional now as it fails in runtime on SIGILL.
>
> Environment:
> OpenEmbedded builg
> gcc-4.4.3
> binutils-2.20
> run env from http://pastebin.ca/1845506

[...]

> Program received signal SIGILL, Illegal instruction.
> 0x401af86a in pixman_transform_init_identity () from
> /usr/lib/libpixman-1.so.0 (gdb) disass 0x401af85a 0x401af87a
> Dump of assembler code from 0x401af85a to 0x401af87a:
> 0x401af85a <pixman_transform_scale+130>:        lsls    r0, r0, #0
> 0x401af85c <pixman_transform_scale+132>:        lsls    r1, r0, #0
> 0x401af85e <pixman_transform_scale+134>:        lsls    r0, r0, #0
> 0x401af860 <pixman_transform_init_identity+0>:  push    {r4, lr}
> 0x401af862 <pixman_transform_init_identity+2>:  movs    r1, #0
> 0x401af864 <pixman_transform_init_identity+4>:  movs    r2, #36 ; 0x24
> 0x401af866 <pixman_transform_init_identity+6>:  adds    r4, r0, #0
> 0x401af868 <pixman_transform_init_identity+8>:  blx     0x401868d0

OK, this "blx" in the above line is the instruction causing problems, and the
corresponding line from objdump output is the following:
    2c868:       f7d7 e832       blx     38d0 <_init+0xd8>

The value of PC register (0x401af86a) points in the middle of this
instruction. According to ARM Architecture Reference Manual, this form
of instruction is not supported on armv4t and it was introduced in
armv5t.

> 0x401af86c <pixman_transform_init_identity+12>: movs    r0, #128        ;
> 0x80 0x401af86e <pixman_transform_init_identity+14>: lsls    r3, r0, #9
> 0x401af870 <pixman_transform_init_identity+16>: str     r3, [r4, #0]
> 0x401af872 <pixman_transform_init_identity+18>: str     r3, [r4, #16]
> 0x401af874 <pixman_transform_init_identity+20>: str     r3, [r4, #32]
> 0x401af876 <pixman_transform_init_identity+22>: pop     {r4}
> 0x401af878 <pixman_transform_init_identity+24>: pop     {r0}

[...]

> When linked with binutils-2.19 (as suggested on #ubuntu-arm) it fails the
> same.
>
> For now I'll use --disable-arm-simd, but let me know how can I help
> debugging/testing simd code, or if it's only usefull with -mno-thumb, then
> how to modify configure.ac to respect -mthumb from CC (not only from
> CFLAGS) if possible.

The whole issue is very strange. This 'pixman_transform_init_identity'
function is defined in 'pixman-matrix.c' file. The compiler seems to generate
a call to 'memset' using the variant of 'blx' instruction which is invalid for
armv4t compatible processors.

I have no idea how this all could be related to the presence of absence
of arm-simd support. For me gcc-4.4.3 generates the following thumb code
for 'pixman_transform_init_identity' function when targeting armv4t
(support for arm-simd is also enabled):

00000f90 <pixman_transform_init_identity>:
 f90:   b510            push    {r4, lr}
 f92:   2100            movs    r1, #0
 f94:   2224            movs    r2, #36
 f96:   1c04            adds    r4, r0, #0
 f98:   f7ff fffe       bl      0 <memset>
 f9c:   2080            movs    r0, #128
 f9e:   0243            lsls    r3, r0, #9
 fa0:   6023            str     r3, [r4, #0]
 fa2:   6123            str     r3, [r4, #16]
 fa4:   6223            str     r3, [r4, #32]
 fa6:   bc10            pop     {r4}
 fa8:   bc01            pop     {r0}
 faa:   4700            bx      r0

Please check the precise options which are passed to the compiler when
compiling 'pixman-matrix.c' source file.

-- 
Best regards,
Siarhei Siamashka


More information about the Pixman mailing list