Sorry for a delay.

Here are C function (from reconstructed bug example):

double c_fn( double a, double b) {
  return a * b;
}

and uffi definition:

(def-function ("c_fn" c_fn) ((a :double) (b :double)) :returning :double)



The resulting asm code for C function:

<c_fn>:
   0:   55                      push   %ebp
   1:   89 e5                   mov    %esp,%ebp
   3:   dd 45 10                fldl   0x10(%ebp)
   6:   dc 4d 08                fmull  0x8(%ebp)
   9:   5d                      pop    %ebp
   a:   c3                      ret    


and UFFI wrapper:

<L1c_fn>:
 a60:   56                      push   %esi
 a61:   53                      push   %ebx
 a62:   e8 f4 fe ff ff          call   95b <__x86.get_pc_thunk.bx>
 a67:   81 c3 2d 07 00 00       add    $0x72d,%ebx
 a6d:   83 ec 34                sub    $0x34,%esp
 a70:   e8 4b fd ff ff          call   7c0 <ecl_process_env@plt>
 a75:   89 c6                   mov    %eax,%esi
 a77:   8d 44 24 2c             lea    0x2c(%esp),%eax
 a7b:   39 86 58 01 00 00       cmp    %eax,0x158(%esi)
 a81:   73 49                   jae    acc <L1c_fn+0x6c>
 a83:   8b 44 24 44             mov    0x44(%esp),%eax
 a87:   89 04 24                mov    %eax,(%esp)
 a8a:   e8 a1 fd ff ff          call   830 <ecl_to_double@plt>
 a8f:   8b 44 24 40             mov    0x40(%esp),%eax
 a93:   89 04 24                mov    %eax,(%esp)
 a96:   dd 5c 24 10             fstpl  0x10(%esp)
 a9a:   e8 91 fd ff ff          call   830 <ecl_to_double@plt>
 a9f:   dd 44 24 10             fldl   0x10(%esp)
 aa3:   dd 5c 24 08             fstpl  0x8(%esp)
 aa7:   dd 1c 24                fstpl  (%esp)
 aaa:   e8 21 fd ff ff          call   7d0 <c_fn@plt>
 aaf:   89 44 24 1c             mov    %eax,0x1c(%esp)
 ab3:   db 44 24 1c             fildl  0x1c(%esp)
 ab7:   dd 1c 24                fstpl  (%esp)
 aba:   e8 21 fd ff ff          call   7e0 <ecl_make_double_float@plt>
 abf:   c7 46 04 01 00 00 00    movl   $0x1,0x4(%esi)
 ac6:   83 c4 34                add    $0x34,%esp
 ac9:   5b                      pop    %ebx
 aca:   5e                      pop    %esi
 acb:   c3                      ret    
 acc:   e8 1f fd ff ff          call   7f0 <ecl_cs_overflow@plt>
 ad1:   eb b0                   jmp    a83 <L1c_fn+0x23>
 ad3:   8d b6 00 00 00 00       lea    0x0(%esi),%esi
 ad9:   8d bc 27 00 00 00 00    lea    0x0(%edi,%eiz,1),%edi



I've also tried the same C function, but with casting result to an integer
and returning int signature, and it works fine. Compiling C code with
-mno-fp-ret-in-387 doesn't work ether. 

With a C function, which calls c_ref: 

 double ref( double a, double b) {
  return 2 * c_fn( a, b);
}


the asm listing is:

<ref>:
  33:   55                      push   %ebp
  34:   89 e5                   mov    %esp,%ebp
  36:   dd 45 10                fldl   0x10(%ebp)
  39:   dc 4d 08                fmull  0x8(%ebp)
  3c:   5d                      pop    %ebp
  3d:   d9 e8                   fld1   
  3f:   de c1                   faddp  %st,%st(1)
  41:   c3                      ret    


So, i believe that an uffi wrapper should use ST register, instead of 
fildl and fstpl sequence.

------------------------------------------------------------------------------
October Webinars: Code for Performance
Free Intel webinars can help you accelerate application performance.
Explore tips for MPI, OpenMP, advanced profiling, and more. Get the most from 
the latest Intel processors and coprocessors. See abstracts and register >
http://pubads.g.doubleclick.net/gampad/clk?id=60134071&iu=/4140/ostg.clktrk
_______________________________________________
Ecls-list mailing list
Ecls-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ecls-list

Reply via email to