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
