diff options
author | Sverker Eriksson <[email protected]> | 2016-08-26 12:27:17 +0200 |
---|---|---|
committer | Sverker Eriksson <[email protected]> | 2016-08-26 12:27:17 +0200 |
commit | f3e018dc3bb3c74b88c7454f6a1888938215f912 (patch) | |
tree | 7f217508515647e557cf3c30c79badba9ab0f1dd /lib/hipe/arm | |
parent | 2a6750d0804d1e30a5463c8aaf5b7342fda967fe (diff) | |
parent | a504c30efbc14381385a6ef911ba7296840f8cb7 (diff) | |
download | otp-f3e018dc3bb3c74b88c7454f6a1888938215f912.tar.gz otp-f3e018dc3bb3c74b88c7454f6a1888938215f912.tar.bz2 otp-f3e018dc3bb3c74b88c7454f6a1888938215f912.zip |
Merge branch 'sverker/hipe-backend-bugs/PR-1146' into maint
Diffstat (limited to 'lib/hipe/arm')
-rw-r--r-- | lib/hipe/arm/hipe_arm_registers.erl | 8 | ||||
-rw-r--r-- | lib/hipe/arm/hipe_rtl_to_arm.erl | 9 |
2 files changed, 11 insertions, 6 deletions
diff --git a/lib/hipe/arm/hipe_arm_registers.erl b/lib/hipe/arm/hipe_arm_registers.erl index 24cd929d41..dcf039676b 100644 --- a/lib/hipe/arm/hipe_arm_registers.erl +++ b/lib/hipe/arm/hipe_arm_registers.erl @@ -67,6 +67,8 @@ -define(R15, 15). -define(LAST_PRECOLOURED, 15). % must handle both GPR and FPR ranges +-define(LR, ?R14). + -define(ARG0, ?R1). -define(ARG1, ?R2). -define(ARG2, ?R3). @@ -114,7 +116,7 @@ stack_pointer() -> ?STACK_POINTER. proc_pointer() -> ?PROC_POINTER. -lr() -> ?R14. +lr() -> ?LR. pc() -> ?R15. @@ -198,7 +200,9 @@ call_clobbered() -> % does the RA strip the type or not? ]. tailcall_clobbered() -> % tailcall crapola needs one temp - [{?TEMP1,tagged},{?TEMP1,untagged}]. + [{?TEMP1,tagged},{?TEMP1,untagged} + ,{?LR,tagged},{?LR,untagged} + ]. live_at_return() -> [%%{?LR,untagged}, diff --git a/lib/hipe/arm/hipe_rtl_to_arm.erl b/lib/hipe/arm/hipe_rtl_to_arm.erl index ad5a559995..93342aba33 100644 --- a/lib/hipe/arm/hipe_rtl_to_arm.erl +++ b/lib/hipe/arm/hipe_rtl_to_arm.erl @@ -148,10 +148,11 @@ mk_shift_ir(S, Dst, Src1, ShiftOp, Src2) -> mk_li(Tmp, Src1, mk_shift_rr(S, Dst, Tmp, ShiftOp, Src2)). -mk_shift_ri(S, Dst, Src1, ShiftOp, Src2) when is_integer(Src2) -> - if Src2 >= 0, Src2 < 32 -> ok; - true -> io:format("~w: excessive immediate shift ~w\n", [?MODULE,Src2]) - end, +mk_shift_ri(S, Dst, Src1, ShiftOp, 0) + when ShiftOp =:= lsl; ShiftOp =:= lsr; ShiftOp =:= asr -> + [hipe_arm:mk_move(S, Dst, Src1)]; +mk_shift_ri(S, Dst, Src1, ShiftOp, Src2) + when is_integer(Src2), Src2 > 0, Src2 < 32 -> Am1 = {Src1,ShiftOp,Src2}, [hipe_arm:mk_move(S, Dst, Am1)]. |