diff options
author | Sverker Eriksson <[email protected]> | 2017-03-22 21:39:48 +0100 |
---|---|---|
committer | GitHub <[email protected]> | 2017-03-22 21:39:48 +0100 |
commit | c5e09d9315044bb9ac27702f6a9d3c6f290a3b8e (patch) | |
tree | a9549285fa68b47d24ac8610d0daa0e2d64681d0 /lib/hipe/arm/hipe_arm_frame.erl | |
parent | b4ac8b2b32f094217d0533ee139273923c3a8af7 (diff) | |
parent | 9e618caac607379e1154e24bc9bd09709cce5d41 (diff) | |
download | otp-c5e09d9315044bb9ac27702f6a9d3c6f290a3b8e.tar.gz otp-c5e09d9315044bb9ac27702f6a9d3c6f290a3b8e.tar.bz2 otp-c5e09d9315044bb9ac27702f6a9d3c6f290a3b8e.zip |
Merge margnus1/hipe-range-split-rebase/PR-1380/OTP-14293
HiPE: Range splitting register allocation
Diffstat (limited to 'lib/hipe/arm/hipe_arm_frame.erl')
-rw-r--r-- | lib/hipe/arm/hipe_arm_frame.erl | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/lib/hipe/arm/hipe_arm_frame.erl b/lib/hipe/arm/hipe_arm_frame.erl index e323907e31..a1004fb609 100644 --- a/lib/hipe/arm/hipe_arm_frame.erl +++ b/lib/hipe/arm/hipe_arm_frame.erl @@ -69,6 +69,8 @@ do_insn(I, LiveOut, Context, FPoff) -> do_pseudo_call_prepare(I, FPoff); #pseudo_move{} -> {do_pseudo_move(I, Context, FPoff), FPoff}; + #pseudo_spill_move{} -> + {do_pseudo_spill_move(I, Context, FPoff), FPoff}; #pseudo_tailcall{} -> {do_pseudo_tailcall(I, Context), context_framesize(Context)}; _ -> @@ -100,6 +102,26 @@ pseudo_offset(Temp, FPoff, Context) -> FPoff + context_offset(Context, Temp). %%% +%%% Moves from one spill slot to another +%%% + +do_pseudo_spill_move(I, Context, FPoff) -> + #pseudo_spill_move{dst=Dst, temp=Temp, src=Src} = I, + case temp_is_pseudo(Src) andalso temp_is_pseudo(Dst) of + false -> % Register allocator changed its mind, turn back to move + do_pseudo_move(hipe_arm:mk_pseudo_move(Dst, Src), Context, FPoff); + true -> + SrcOffset = pseudo_offset(Src, FPoff, Context), + DstOffset = pseudo_offset(Dst, FPoff, Context), + case SrcOffset =:= DstOffset of + true -> []; % omit move-to-self + false -> + mk_load('ldr', Temp, SrcOffset, mk_sp(), + mk_store('str', Temp, DstOffset, mk_sp(), [])) + end + end. + +%%% %%% Return - deallocate frame and emit 'ret $N' insn. %%% |