Android/ARM codegen
Dan Olson via digitalmars-d-ldc
digitalmars-d-ldc at puremagic.com
Fri Jul 17 01:58:30 PDT 2015
"Joakim" <dlang at joakim.fea.st> writes:
> Alright, I've been stepping through some failing tests: one that seems
> to be bad codegen is that many calls to std.algorithm.iteration.map
> seem to fail, for example, when running the tests for std.zip. One of
> the std.zip tests calls std.random.uniform, which then gets its second
> parameter stomped by map from rndGen().
Joakim, I have a hunch. Can you try changing your abi-android.cpp so
passByVal() returns false always? That is the only difference in our
generated IR and in my experience byval causes incorrect code on ARM.
As an experiment, I changed my passByVal() back to return true for
Tstruct (the LDC default), and then my IR is identical to yours and my
ARM code, though slightly different, also is clobbering a saved reg on
the stack.
Anyway, I pasted my GOOD assembly below yours for comparison.
> which gets translated to the following ARM assembly:
>
> _D3std9algorithm9iteration47__T3mapS363std6random6rndGenFNcNdNfZ9__lambda4Z42__T3mapTS3std5range13__T6RepeatTiZ6RepeatZ3mapMFNaNbNiNfS3std5range13__T6RepeatTiZ6RepeatZS3std9algorithm9iteration87__T9MapResultS363std6random6rndGenFNcNdNfZ9__lambda4TS3std5range13__T6RepeatTiZ6RepeatZ9MapResult:
> .fnstart
> .Leh_func_begin94:
> .pad #8
> sub sp, sp, #8
> .save {r4, lr}
> push {r4, lr}
> .pad #8
> sub sp, sp, #8
> mov r4, r0
> mov r0, #0
> str r2, [sp, #20]
> stmib sp, {r0, r1}
> add r0, sp, #4
> ldr r1, [sp, #20]
> bl
> _D3std9algorithm9iteration87__T9MapResultS363std6random6rndGenFNcNdNfZ9__lambda4TS3std5range13__T6RepeatTiZ6RepeatZ9MapResult6__ctorMFNaNbNcNiNfS3std5range13__T6RepeatTiZ6RepeatZS3std9algorithm9iteration87__T9MapResultS363std6random6rndGenFNcNdNfZ9__lambda4TS3std5range13__T6RepeatTiZ6RepeatZ9MapResult(PLT)
> ldmib sp, {r0, r1}
> stm r4, {r0, r1}
> add sp, sp, #8
> pop {r4, lr}
> add sp, sp, #8
> bx lr
Better assembly produced with -output-s -w -d -mtriple=armv7-apple-ios
-relocation-model=pic -O3 -release -unittest -disable-inlining (needed
to match up with your change). It is similar but uses stm (e.g stmia)
instead of stmib.
__D3std9algorithm9iteration47__T3mapS363std6random6rndGenFNcNdNfZ9__lambda4Z42__T3mapTS3std5range13__T6RepeatTiZ6RepeatZ3mapMFNaNbNiNfS3std5range13__T6RepeatTiZ6RepeatZS3std9algorithm9iteration87__T9MapResultS363std6random6rndGenFNcNdNfZ9__lambda4TS3std5range13__T6RepeatTiZ6RepeatZ9MapResult:
push {r4, r7, lr}
add r7, sp, #4
sub sp, sp, #8
mov r4, r0
mov r0, #0
stm sp, {r0, r1}
mov r0, sp
mov r1, r2
bl __D3std9algorithm9iteration87__T9MapResultS363std6random6rndGenFNcNdNfZ9__lambda4TS3std5range13__T6RepeatTiZ6RepeatZ9MapResult6__ctorMFNaNbNcNiNfS3std5range13__T6RepeatTiZ6RepeatZS3std9algorithm9iteration87__T9MapResultS363std6random6rndGenFNcNdNfZ9__lambda4TS3std5range13__T6RepeatTiZ6RepeatZ9MapResult
ldm sp, {r0, r1}
strd r0, r1, [r4]
sub sp, r7, #4
pop {r4, r7, pc}
I wanted to use your triple with OS of android, but std/random.d needs
Android specific D code from elsewhere, so compile failed.
As aside, with inlining enabled, that function shrinks to 3 instructions:
__D3std9algorithm9iteration47__T3mapS363std6random6rndGenFNcNdNfZ9__lambda4Z42__T3mapTS3std5range13__T6RepeatTiZ6RepeatZ3mapMFNaNbNiNfS3std5range13__T6RepeatTiZ6RepeatZS3std9algorithm9iteration87__T9MapResultS363std6random6rndGenFNcNdNfZ9__lambda4TS3std5range13__T6RepeatTiZ6RepeatZ9MapResult:
mov r3, r1
strd r2, r3, [r0]
bx lr
Hope it helps
More information about the digitalmars-d-ldc
mailing list