------- Comment #3 from rbala at coresfoundation dot com  2009-02-15 20:43 
-------
Hi all,

Correct me if I'm wrong.

@mp2 - newlib is a source of 'C' libraries for various arch's. You won't find a
directory as such called newlib. While building your toolchain, you compile all
the files in the newlib source.

Coming to your issue, I shall verify it again. I don't think it is a GCC
issue., but I shall verify it. I saw the assembly code, but I shall again
generate the assembly myself., atleast from my perspective, I would generate
the assembly by using a local function name rather than using main().
I mean I wouldn't use the fn.name as main() when I was to debug a function's
assembly, because main() being a generic fn. Name might induce some other
fn.calls(I may be wrong here) but what I'm saying is, its just a good practice.

>From what I'm seeing, I don't know if it might be a typecasting issue, (don't
know for sure), did you try something like this? " (float)out =
sqrt((float)in); "
(In reply to comment #2)
> (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