Note that there are some explanatory texts on larger screens.

plurals
  1. POThis maybe a bug of llvm-gcc for ios-armv7, that I can't explain
    primarykey
    data
    text
    <pre> the following code works fine on linux-x86, darwin-x86, but not for ios-armv7. the right output should be: m[0]: 0.500000, v: 0.500000 m[1]: 0.500000, v: 0.500000 m[2]: 0.500000, v: 0.500000 m[3]: 0.500000, v: 0.500000 m[4]: 0.500000, v: 0.500000 but I found the wrong output: m[0]: 0.500000, v: 0.500000 m[1]: 0.500000, v: 0.000000 m[2]: 0.500000, v: 0.000000 m[3]: 0.500000, v: 0.000000 m[4]: 0.500000, v: 0.000000 I also found the stange when it's built for ios-armv7: [a] remove function 'func', move the function body to 'main' function, it works fine [b] declare the array 'm[5]' as 'double m[5]', it works fine [c] set the variable 'v' as 'v = 0.5 or v = sqrt(2.0f/8)', it works fine [d] if the gcc optimize option is '-O0', it works fine, but when it's '-O1 or -O2', wrong output occurs My iPad1 was cracked, so I can cross-compile a executable on my MacBook Air, and 'scp' the executable to iPad1 and run it. The following is details: 1. cross-compile a executable on Mac: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/llvm-gcc -O1 -Wall -arch armv7 -mcpu=cortex-a8 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/include -D__IPHONE_OS__ -miphoneos-version-min=4.0 foo.c 2. 'scp' the executable to iPad scp a.out mobile@192.168.1.106:~ 3. 'ssh' to iPad ssh mobile@192.168.1.106 #the default password is 'alpine' 4. run a.out on iPad ./a.out </pre> <pre><code>#include &lt;stdio.h&gt; #include &lt;math.h&gt; int func(int n) /* [a] */ { int i; float m[5]; /* [b] */ double v; v = sqrt(2.0f/n); /* [c] */ for(i=0;i&lt;5;++i) { m[i]=v; printf("m[%d]: %f, v: %f\n", i, m[i], v); } return 0; } int main(int argc, char **argv) { return func(8); } </code></pre> <p>You can also find the whole code on <a href="https://gist.github.com/ashun/5992120" rel="nofollow">https://gist.github.com/ashun/5992120</a></p> <p>The following is the assembly. you can find the difference with the help of command 'vim -d'</p> <ol> <li>assembly of the previous code, declare the array 'm[5]' as 'double m[5]'</li> </ol> <pre> .section __TEXT,__text,regular,pure_instructions .section __TEXT,__textcoal_nt,coalesced,pure_instructions .section __TEXT,__const_coal,coalesced .section __TEXT,__picsymbolstub4,symbol_stubs,none,16 .section __TEXT,__StaticInit,regular,pure_instructions .syntax unified .section __TEXT,__text,regular,pure_instructions .globl _func .align 2 .code 16 .thumb_func _func _func: push {r4, r5, r6, r7, lr} add r7, sp, #12 str r8, [sp, #-4]! sub sp, #8 vmov.f32 s0, #2.000000e+00 movw r8, :lower16:(L_.str-(LPC0_0+4)) vmov s2, r0 movt r8, :upper16:(L_.str-(LPC0_0+4)) vcvt.f32.s32 d1, d1 LPC0_0: add r8, pc movs r4, #0 vdiv.f32 s0, s0, s2 vsqrt.f32 s0, s0 vcvt.f64.f32 d16, s0 vmov r5, r6, d16 LBB0_1: mov r1, r4 mov r0, r8 mov r2, r5 mov r3, r6 vstr.64 d16, [sp] adds r4, #1 blx _printf cmp r4, #5 bne LBB0_1 movs r0, #0 add sp, #8 ldr r8, [sp], #4 pop {r4, r5, r6, r7, pc} .globl _main .align 2 .code 16 .thumb_func _main _main: push {r7, lr} mov r7, sp movs r0, #8 bl _func movs r0, #0 pop {r7, pc} .section __TEXT,__cstring,cstring_literals L_.str: .asciz "m[%d]: %f, v: %f\n" .subsections_via_symbols </pre> <ol> <li>assembly of the previous code, declare the array 'm[5]' as 'double m[5]'</li> </ol> <pre> .section __TEXT,__text,regular,pure_instructions .section __TEXT,__textcoal_nt,coalesced,pure_instructions .section __TEXT,__const_coal,coalesced .section __TEXT,__picsymbolstub4,symbol_stubs,none,16 .section __TEXT,__StaticInit,regular,pure_instructions .syntax unified .section __TEXT,__text,regular,pure_instructions .globl _func .align 2 .code 16 .thumb_func _func _func: push {r4, r5, r6, r7, lr} add r7, sp, #12 str r8, [sp, #-4]! **vpush {d8}** sub sp, #8 vmov.f32 s0, #2.000000e+00 movw r8, :lower16:(L_.str-(LPC0_0+4)) vmov s2, r0 movt r8, :upper16:(L_.str-(LPC0_0+4)) vcvt.f32.s32 d1, d1 LPC0_0: add r8, pc movs r4, #0 vdiv.f32 s0, s0, s2 vcvt.f64.f32 d16, s0 vsqrt.f64 d8, d16 vmov r5, r6, d8 LBB0_1: mov r1, r4 mov r0, r8 mov r2, r5 mov r3, r6 vstr.64 d8, [sp] adds r4, #1 blx _printf cmp r4, #5 bne LBB0_1 movs r0, #0 add sp, #8 vpop {d8} ldr r8, [sp], #4 pop {r4, r5, r6, r7, pc} .globl _main .align 2 .code 16 .thumb_func _main _main: push {r7, lr} mov r7, sp movs r0, #8 bl _func movs r0, #0 pop {r7, pc} .section __TEXT,__cstring,cstring_literals L_.str: .asciz "m[%d]: %f, v: %f\n" .subsections_via_symbols </pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload