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

Martin Jansa martin.jansa at gmail.com
Fri Mar 19 05:18:11 PDT 2010


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
CFLAGS="-isystem/OE/tmpdir-dev-shr/staging/armv4t-oe-linux-gnueabi/usr/include -fexpensive-optimizations -fomit-frame-pointer -frename-registers -Os"
CC="arm-oe-linux-gnueabi-gcc -march=armv4t -mtune=arm920t -mthumb-interwork -mthumb"
configure \
		    --build=x86_64-linux \
		    --host=arm-oe-linux-gnueabi \
		    --target=arm-oe-linux-gnueabi \
		    --prefix=/usr \
		    --exec_prefix=/usr \
		    --bindir=/usr/bin \
		    --sbindir=/usr/sbin \
		    --libexecdir=/usr/libexec \
		    --datadir=/usr/share \
		    --sysconfdir=/etc \
		    --sharedstatedir=/com \
		    --localstatedir=/var \
		    --libdir=/usr/lib \
		    --includedir=/usr/include \
		    --oldincludedir=/usr/include \
		    --infodir=/usr/share/info \
		    --mandir=/usr/share/man \
  		    --disable-arm-neon \
                    --disable-gtk

config.log from 933540861383da27402680593edefe8d61e6fb02
from http://paste.pocoo.org/show/191449/
configure:11465: checking whether to use ARM SIMD assembler
configure:11477: arm-oe-linux-gnueabi-gcc -march=armv4t -mtune=arm920t -mthumb-interwork -mthumb -c -mcpu=arm1136j-s -isystem/OE/tmpdir-dev-shr/staging/armv4t-oe-linux-gnueabi/usr/include -fexpensive-optimizations -fomit-frame-pointer -frename-registers -Os -Wall -fno-strict-aliasing -fvisibility=hidden -isystem/OE/tmpdir-dev-shr/staging/armv4t-oe-linux-gnueabi/usr/include conftest.c >&5
conftest.c:1: warning: switch -mcpu=arm1136j-s conflicts with -march= switch
/tmp/ccUDty6k.s: Assembler messages:
/tmp/ccUDty6k.s:23: Error: selected processor does not support `uqadd8 r1,r1,r2'
configure:11477: $? = 1
configure: failed program was:
| /* confdefs.h */
[snip]
| /* end confdefs.h.  */
| 
| int main () {
|     asm("uqadd8 r1, r1, r2");
|     return 0;
| }
configure:11503: result: no

config.log from 18f0de452dc7e12e4cb544d761a626d5c6031663
from http://paste.pocoo.org/show/191450/
configure:11465: checking whether to use ARM SIMD assembler
configure:11476: arm-oe-linux-gnueabi-gcc -march=armv4t -mtune=arm920t -mthumb-interwork -mthumb -c -isystem/OE/tmpdir-dev-shr/staging/armv4t-oe-linux-gnueabi/usr/include -fexpensive-optimizations -fomit-frame-pointer -frename-registers -Os -Wall -fno-strict-aliasing -fvisibility=hidden -isystem/OE/tmpdir-dev-shr/staging/armv4t-oe-linux-gnueabi/usr/include conftest.c >&5
/tmp/ccPXr408.s: Assembler messages:
/tmp/ccPXr408.s:23: Error: selected processor does not support `uqadd8 r1,r1,r2'
configure:11476: $? = 1
configure: failed program was:
| /* confdefs.h */
[snip]
| /* end confdefs.h.  */
| 
| int main () {
|     asm("uqadd8 r1, r1, r2");
|     return 0;
| }
configure:11493: arm-oe-linux-gnueabi-gcc -march=armv4t -mtune=arm920t -mthumb-interwork -mthumb -c -mcpu=arm1136j-s -marm -isystem/OE/tmpdir-dev-shr/staging/armv4t-oe-linux-gnueabi/usr/include -fexpensive-optimizations -fomit-frame-pointer -frename-registers -Os -Wall -fno-strict-aliasing -fvisibility=hidden -isystem/OE/tmpdir-dev-shr/staging/armv4t-oe-linux-gnueabi/usr/include conftest.c >&5
conftest.c:1: warning: switch -mcpu=arm1136j-s conflicts with -march= switch
configure:11493: $? = 0
configure:11521: result: yes

Then resulting binary fails in runtime with SIGILL

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
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}
End of assembler dump.

(gdb) info reg
r0             0x141b8c 1317772
r1             0x0      0
r2             0x24     36
r3             0xac     172
r4             0x141b8c 1317772
r5             0xbe     190
r6             0x1418a8 1317032
r7             0x0      0
r8             0x0      0
r9             0x0      0
r10            0x40023000       1073885184
r11            0x0      0
r12            0x401af861       1075509345
sp             0xbeac5550       0xbeac5550
lr             0x4018686c       1075341420
pc             0x401af86a       0x401af86a <pixman_transform_init_identity+10>
fps            0x0      0
cpsr           0x30     48

disassm from objdump
whole file: http://build.shr-project.org/tests/jama/libpixman-1.so.0.17.13.disass
0002c860 <pixman_transform_init_identity>:
   2c860:       b510            push    {r4, lr}
   2c862:       2100            movs    r1, #0
   2c864:       2224            movs    r2, #36 ; 0x24
   2c866:       1c04            adds    r4, r0, #0
   2c868:       f7d7 e832       blx     38d0 <_init+0xd8>
   2c86c:       2080            movs    r0, #128        ; 0x80
   2c86e:       0243            lsls    r3, r0, #9
   2c870:       6023            str     r3, [r4, #0]
   2c872:       6123            str     r3, [r4, #16]
   2c874:       6223            str     r3, [r4, #32]
   2c876:       bc10            pop     {r4}
   2c878:       bc01            pop     {r0}
   2c87a:       4700            bx      r0
   2c87c:       46c0            nop                     ; (mov r8, r8)
   2c87e:       46c0            nop                     ; (mov r8, r8)

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.

Regards,

-- 
uin:136542059                jid:Martin.Jansa at gmail.com
Jansa Martin                 sip:jamasip at voip.wengo.fr 
JaMa                         


More information about the Pixman mailing list