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