From d4bde96be298b77069ce2324618dedc2946e9675 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Magnus=20L=C3=A5ng?= <margnus1@telia.com>
Date: Mon, 4 Apr 2016 16:50:28 +0200
Subject: hipe_ppc: Fix PPC64 bug encoding large immediates

---
 lib/hipe/ppc/hipe_ppc.erl          | 12 +++++++++---
 lib/hipe/ppc/hipe_ppc_assemble.erl |  1 +
 2 files changed, 10 insertions(+), 3 deletions(-)

(limited to 'lib')

diff --git a/lib/hipe/ppc/hipe_ppc.erl b/lib/hipe/ppc/hipe_ppc.erl
index 0fa96162f6..380e791bc1 100644
--- a/lib/hipe/ppc/hipe_ppc.erl
+++ b/lib/hipe/ppc/hipe_ppc.erl
@@ -167,8 +167,10 @@ temp_is_precoloured(#ppc_temp{reg=Reg,type=Type}) ->
     _ -> hipe_ppc_registers:is_precoloured_gpr(Reg)
   end.
 
-mk_simm16(Value) -> #ppc_simm16{value=Value}.
-mk_uimm16(Value) -> #ppc_uimm16{value=Value}.
+mk_simm16(Value) when Value >= -(1 bsl 15), Value < (1 bsl 15) ->
+  #ppc_simm16{value=Value}.
+mk_uimm16(Value) when Value >= 0, Value < (1 bsl 16) ->
+  #ppc_uimm16{value=Value}.
 
 mk_mfa(M, F, A) -> #ppc_mfa{m=M, f=F, a=A}.
 
@@ -240,7 +242,11 @@ mk_li(Dst, Value, Tail) ->   % Dst can be R0
      Value =< 16#7FFFFFFF ->
       mk_li32(Dst, R0, Value, Tail);
      true ->
-      Highest = (Value bsr 48),              % Value@highest
+      Highest = case (Value bsr 48) of       % Value@highest
+		  TopBitSet when TopBitSet >= (1 bsl 15) ->
+		    TopBitSet - (1 bsl 16);  % encoder needs it to be negative
+		  FitsSimm16 -> FitsSimm16
+		end,
       Higher = (Value bsr 32) band 16#FFFF,  % Value@higher
       High = (Value bsr 16) band 16#FFFF,    % Value@h
       Low = Value band 16#FFFF,              % Value@l
diff --git a/lib/hipe/ppc/hipe_ppc_assemble.erl b/lib/hipe/ppc/hipe_ppc_assemble.erl
index 2cbcee4802..d89ff6235c 100644
--- a/lib/hipe/ppc/hipe_ppc_assemble.erl
+++ b/lib/hipe/ppc/hipe_ppc_assemble.erl
@@ -248,6 +248,7 @@ do_load(I) ->
     case LdOp of
       'ld' -> do_disp_ds(Disp);
       'ldu' -> do_disp_ds(Disp);
+      'lwa' -> do_disp_ds(Disp);
       _ -> do_disp(Disp)
     end,
   NewBase = do_reg(Base),
-- 
cgit v1.2.3