2010/3/5 vlad burlik <[email protected]>:
> Hi,
> I have a problem with FPU generated code for ARM. Compiled script
> calls the function
> static double mul_two_doubles(double x, double y) {
>  return x * y;
> }
>
> which in asm looks like this:
>
> 0x7aa4d648 <v8::internal::mul_two_doubles>:   fmuld d0,d0,d1
> 0x7aa4d64c <v8::internal::mul_two_doubles+4>: mrrc  p11,0x1,r0,r1,cr0
> 0x7aa4d650 <v8::internal::mul_two_doubles+8>: bx
> lr                     -----> 0x04e1ca7c
>
> then it returns back to the script compiled code:
>
> 0x04e1ca7c ldr           r4,[sp],#4
> 0x04e1ca80 cmp           r4,#0x0
> 0x04e1ca84 ldreq         r4,[sp],#4
> 0x04e1ca88 sub           r5,r4,#0x1
> 0x04e1ca8c stfd          f0,[r5,#4]  <----------------------------
> crash....
>
> Everything works fine until stfd f0,[r5,#4]
>
> stfd supposed to just store the result to the memory address in R5+4,
> which is valid memory block...
>
> Any idea why this could happen? Which function generates: STFD
> instruction( op code for it: ED858101 )?

This is around line 5669 in codegen-arm.cc.  It is an stc (store
coprocessor register) instruction in the nomenclature of the V8 ARM
assembler.  This is for the old math coprocessor instruction set,
which is emulated on ARM operating systems that are running the old
(non-EABI) ABI.  If you are using a new CPU with the EABI then you
need to set the ARM_EABI macro and perhaps the
CAN_USE_ARMV7_INSTRUCTIONS macro.  See arm-constants.h.

The experimental/partial_snapshots branch also has the macro
CAN_USE_VFP_INSTRUCTIONS which hasn't been ported to trunk or bleeding
edge yet.  Without that flag V8 tries to runtime-detect VFP
instructions using the /proc filesystem on Linux.

>
> Thanks
> Vlad
>
> --
> v8-dev mailing list
> [email protected]
> http://groups.google.com/group/v8-dev
>

-- 
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to