Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 24 May 2013 18:06:57 +1000 (EST)
From:      Bruce Evans <brde@optusnet.com.au>
To:        numerics@freebsd.org
Cc:        dim@freebsd.org
Subject:   clang crash on "x" constraint for athlon-xp
Message-ID:  <20130524173835.T2001@besplex.bde.org>

next in thread | raw e-mail | index | archive | help
Why does clang -march=athlon-xp abort on this?

@ #include <xmmintrin.h>
@ 
@ void
@ foo(void)
@ {
@ 	__m128 x;
@ 
@ 	asm("" : "=x" (x));
@ }

@ SplitVectorResult #0: 0x2a190228: v16i8 = Register %vreg1 [ORD=1] [ID=0]
@ 
@ fatal error: error in backend: Do not know how to split the result of this operator!
@ 
@ cc: error: clang frontend command failed with exit code 70 (use -v to see invocation)
@ FreeBSD clang version 3.3 (trunk 178860) 20130405
@ Target: i386-unknown-freebsd10.0
@ Thread model: posix
@ cc: note: diagnostic msg: PLEASE submit a bug report to http://llvm.org/bugs/ and include the crash backtrace, preprocessed source, and associated run script.
@ cc: note: diagnostic msg: 
@ ********************
@ 
@ PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
@ Preprocessed source(s) and associated run script(s) are located at:
@ cc: note: diagnostic msg: /tmp/z-SmXpwL.c
@ cc: note: diagnostic msg: /tmp/z-SmXpwL.sh
@ cc: note: diagnostic msg: 
@ 
@ ********************

clang also fills up /tmp with these files.

gcc -march=athlon-xp works, and so does clang -march=athlon64.

athlon64 has SSE1 and SSE2; athlon-xp only has SSE1.  The above is trying
to use only SSE1 features.

I don't really understand <xmmintrin.h> and am using it here just to
declare __m128.  Perhaps it can do what I want without any asm.  This
is to take an 8-byte double and split it into 2 integers using SSE*,
and vice versa.  SSE* must be used on 32-bit systems since compilers
still don't understand how to unpack and repack 64-bit objects efficiently
using integer instructions (loads and stores must be 64 bits).  I also
need this for 10-byte long doubles.  Raw asm is needed for 2 bytes of
these, and it would be hard to combine this with any intrinsics.

While here, I will re-report another clang asm problem:

@ 	double_t dt;
@ 	double d;
@ 
@ 	__asm("" : "=t" (d) : "0" (dt));

This works with gcc, but fails (generates a store-load of d, but the
whole point of this null asm is to avoid this store-load by pretending
that the asm does it) with clang.  If the constraints are changed to
"=&t" and "t", then it works for clang but fails (with constraint
and/or reload errors) with gcc.

Bruce



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20130524173835.T2001>