Simon Burton
2006-Apr-19 06:17 UTC
[LLVMdev] floating point exception and SSE2 instructions
Hi,
I'm building a little JIT that creates functions to do array manipulations,
eg. sum all the elements of a double* array. I'm writing this in python,
generating
llvm assembly intructions and piping that through a call to ParseAssemblyString,
ExecutionEngine, etc.
It's working OK on integer values, but i'm getting nasty floating point
exceptions
when i try this on double* values. I've seen this behaviour before on this
platform
(debian Intel P4) when I tried using ATLAS with sse2. I'm pretty sure
it's
valid assembly; the code still causes exceptions when i try using the output
from the llvm demo website. And it works fine on an AMD machine.
What is LLVM doing with my code ? Does it generate SSE2 instructions ?
thanks!
Simon.
double sum_d(double*mem,int n)
{
double val=0.0;
while(n)
{ val += *mem; mem++; n--; }
return val;
}
--
Simon Burton, B.Sc.
Licensed PO Box 8066
ANU Canberra 2601
Australia
Ph. 61 02 6249 6940
http://arrowtheory.com
Hi Simon,
The x86 backend does generate scalar SSE2 instructions. For your
example, it should emit something like:
.text
.align 4
.globl _sum_d
_sum_d:
subl $12, %esp
movl 20(%esp), %eax
movl 16(%esp), %ecx
cmpl $0, %eax
jne LBB_sum_d_2 # cond_true.preheader
LBB_sum_d_1: # entry.bb9_crit_edge
pxor %xmm0, %xmm0
jmp LBB_sum_d_5 # bb9
LBB_sum_d_2: # cond_true.preheader
pxor %xmm0, %xmm0
xorl %edx, %edx
LBB_sum_d_3: # cond_true
addsd (%ecx), %xmm0
addl $8, %ecx
incl %edx
cmpl %eax, %edx
jne LBB_sum_d_3 # cond_true
LBB_sum_d_4: # bb9.loopexit
LBB_sum_d_5: # bb9
movsd %xmm0, (%esp)
fldl (%esp)
addl $12, %esp
ret
There is nothing here that should cause an exception. Are you using a
release or cvs?
Evan
On Apr 18, 2006, at 11:17 PM, Simon Burton wrote:
>
> Hi,
>
> I'm building a little JIT that creates functions to do array
> manipulations,
> eg. sum all the elements of a double* array. I'm writing this in
> python, generating
> llvm assembly intructions and piping that through a call to
> ParseAssemblyString,
> ExecutionEngine, etc.
>
> It's working OK on integer values, but i'm getting nasty floating
> point exceptions
> when i try this on double* values. I've seen this behaviour before
> on this platform
> (debian Intel P4) when I tried using ATLAS with sse2. I'm pretty
> sure it's
> valid assembly; the code still causes exceptions when i try using
> the output
> from the llvm demo website. And it works fine on an AMD machine.
>
> What is LLVM doing with my code ? Does it generate SSE2 instructions ?
>
> thanks!
>
> Simon.
>
> double sum_d(double*mem,int n)
> {
> double val=0.0;
> while(n)
> { val += *mem; mem++; n--; }
> return val;
> }
>
>
> --
> Simon Burton, B.Sc.
> Licensed PO Box 8066
> ANU Canberra 2601
> Australia
> Ph. 61 02 6249 6940
> http://arrowtheory.com
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
Simon Burton
2006-Apr-19 18:28 UTC
[LLVMdev] floating point exception and SSE2 instructions
On Tue, 18 Apr 2006 23:27:39 -0700 Evan Cheng <evan.cheng at apple.com> wrote:> Hi Simon, > > The x86 backend does generate scalar SSE2 instructions. For your > example, it should emit something like:Oh, how did you get this ? [...]> > There is nothing here that should cause an exception. Are you using a > release or cvs?CVS.>From what I remember, this is a bug in debian libc:some floating point flags are set incorrectly causing SIGFPE. Can't find the bug report ATM. Thanks, Simon. -- Simon Burton, B.Sc. Licensed PO Box 8066 ANU Canberra 2601 Australia Ph. 61 02 6249 6940 http://arrowtheory.com
Maybe Matching Threads
- [LLVMdev] floating point exception and SSE2 instructions
- [LLVMdev] floating point exception and SSE2 instructions
- [LLVMdev] floating point exception and SSE2 instructions
- [LLVMdev] floating point exception and SSE2 instructions
- [LLVMdev] floating point exception and SSE2 instructions