------- Comment #2 from mp2 at ladybridge dot com  2009-02-15 12:14 -------
(In reply to comment #1)
> sqrt is usually implemented as a library function and GCC does not implement 
> it
> for you.  Do you use newlib?

My previous reply doesn't seem to have made it into the system. Here it is
again...
As far as I can see, there is no library named newlib or anything near it on
this system. What is this library and where do I get it?

I am not convinced that this is a library issue as two of the sqrt() functions
in the program work though the last has been pre-evaluated to a constant by the
gcc compiler. The problem only happens when the result is stored in a variable.

I cannot find any good documentation for the Arm9 assembler but by inspired
guesswork interpreting the instruction names, the code generated for the
program looks very odd as there appears to be a conditional jump around the
sqrt() function.

int main()
{
 double in, out;
 in = 2.0;
 out = sqrt(in);
 printf("%f\n", out);
 printf("%f\n", sqrt(in));
 printf("%f\n", sqrt(2.0));
 return 0;
}

Assembler code...

          .file     "a.c"
          .section  .rodata
          .align    2
.LC0:
          .ascii    "%f\012\000"
          .text
          .align    2
          .global   main
          .type     main, %function
main:
          @ args = 0, pretend = 0, frame = 24
          @ frame_needed = 1, uses_anonymous_args = 0
          mov       ip, sp
          stmfd     sp!, {r4, fp, ip, lr, pc}
          sub       fp, ip, #4
          sub       sp, sp, #24
          adr       r3, .L4
          ldmia     r3, {r3-r4}
          str       r3, [fp, #-32]
          str       r4, [fp, #-28]
          ldfd      f0, [fp, #-32]
          sqtd      f0, f0
          stfd      f0, [fp, #-40]
          ldfd      f0, [fp, #-40]
          ldfd      f0, [fp, #-40]
          cmf       f0, f0
          beq       .L2    <============
          sub       r0, fp, #32
          ldmia     r0, {r0-r1}
          bl        sqrt
          stfd      f0, [fp, #-40]
.L2:
          sub       r3, fp, #40
          ldmia     r3, {r3-r4}
          str       r3, [fp, #-24]
          str       r4, [fp, #-20]
          ldr       r0, .L4+16
          sub       r1, fp, #24
          ldmia     r1, {r1-r2}
          bl        printf
          sub       r0, fp, #32
          ldmia     r0, {r0-r1}
          bl        sqrt
          stfd      f0, [sp, #-8]!
          ldmfd     sp!, {r3, r4}
          ldr       r0, .L4+16
          mov       r1, r3
          mov       r2, r4
          bl        printf
          ldr       r0, .L4+16
          adr       r1, .L4+8
          ldmia     r1, {r1-r2}
          bl        printf
          mov       r3, #0
          mov       r0, r3
          sub       sp, fp, #16
          ldmfd     sp, {r4, fp, sp, pc}
.L5:
          .align    2
.L4:
          .word     1073741824
          .word     0
          .word     1073127582
          .word     1719614413
          .word     .LC0
          .size     main, .-main
          .ident    "GCC: (GNU) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)"


Martin Phillips
Ladybridge Systems Ltd
17b Coldstream Lane, Hardingstone, Northampton, NN4 6DB
+44-(0)1604-709200


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39085

Reply via email to