22d2d1d
From ab30529b723d451fd0ea8ac64d24fc417af55541 Mon Sep 17 00:00:00 2001
22d2d1d
From: Nicolas Ojeda Bar <n.oje.bar@gmail.com>
22d2d1d
Date: Wed, 23 Nov 2016 12:38:28 +0100
7a76b44
Subject: [PATCH 10/11] Another immediate range fix
22d2d1d
22d2d1d
---
22d2d1d
 asmcomp/riscv/emit.mlp | 57 ++++++++++++++++++++++++++++++--------------------
22d2d1d
 1 file changed, 34 insertions(+), 23 deletions(-)
22d2d1d
22d2d1d
diff --git a/asmcomp/riscv/emit.mlp b/asmcomp/riscv/emit.mlp
7a76b44
index 97c49ce80..6cc190864 100644
22d2d1d
--- a/asmcomp/riscv/emit.mlp
22d2d1d
+++ b/asmcomp/riscv/emit.mlp
22d2d1d
@@ -85,14 +85,6 @@ let emit_reg = function
22d2d1d
   | {loc = Reg r} -> emit_string (register_name r)
22d2d1d
   | _ -> fatal_error "Emit.emit_reg"
22d2d1d
 
22d2d1d
-(* Output a stack reference *)
22d2d1d
-
22d2d1d
-let emit_stack r =
22d2d1d
-  match r.loc with
22d2d1d
-    Stack s ->
22d2d1d
-      let ofs = slot_offset s (register_class r) in `{emit_int ofs}(sp)`
22d2d1d
-  | _ -> fatal_error "Emit.emit_stack"
22d2d1d
-
22d2d1d
 (* Adjust sp by the given byte amount *)
22d2d1d
 
22d2d1d
 let emit_stack_adjustment = function
22d2d1d
@@ -103,7 +95,27 @@ let emit_stack_adjustment = function
22d2d1d
       `	li	{emit_reg reg_tmp1}, {emit_int n}\n`;
22d2d1d
       `	add	sp, sp, {emit_reg reg_tmp1}\n`
22d2d1d
 
22d2d1d
-let emit_store src ofs =
22d2d1d
+let reload_ra n =
22d2d1d
+  let ofs = n - size_addr in
22d2d1d
+  if is_immediate ofs then
22d2d1d
+    `	{emit_string lg}	ra, {emit_int ofs}(sp)\n`
22d2d1d
+  else begin
22d2d1d
+    `	li	{emit_reg reg_tmp1}, {emit_int ofs}\n`;
22d2d1d
+    `	add	{emit_reg reg_tmp1}, sp, {emit_reg reg_tmp1}\n`;
22d2d1d
+    `	{emit_string lg}	ra, 0({emit_reg reg_tmp1})\n`
22d2d1d
+  end
22d2d1d
+
22d2d1d
+let store_ra n =
22d2d1d
+  let ofs = n - size_addr in
22d2d1d
+  if is_immediate ofs then
22d2d1d
+    `	{emit_string stg}	ra, {emit_int(n - size_addr)}(sp)\n`
22d2d1d
+  else begin
22d2d1d
+    `	li	{emit_reg reg_tmp1}, {emit_int ofs}\n`;
22d2d1d
+    `	add	{emit_reg reg_tmp1}, sp, {emit_reg reg_tmp1}\n`;
22d2d1d
+    `	{emit_string stg}	ra, 0({emit_reg reg_tmp1})\n`
22d2d1d
+  end
22d2d1d
+
22d2d1d
+let emit_store stg src ofs =
22d2d1d
   if is_immediate ofs then
22d2d1d
     `	{emit_string stg}	{emit_reg src}, {emit_int ofs}(sp)\n`
22d2d1d
   else begin
22d2d1d
@@ -112,7 +124,7 @@ let emit_store src ofs =
22d2d1d
     `	{emit_string stg}	{emit_reg src}, 0({emit_reg reg_tmp1})\n`
22d2d1d
   end
22d2d1d
 
22d2d1d
-let emit_load dst ofs =
22d2d1d
+let emit_load lg dst ofs =
22d2d1d
   if is_immediate ofs then
22d2d1d
     `	{emit_string lg}	{emit_reg dst}, {emit_int ofs}(sp)\n`
22d2d1d
   else begin
22d2d1d
@@ -265,14 +277,16 @@ let emit_instr i =
22d2d1d
             `	fmv.d   {emit_reg dst}, {emit_reg src}\n`
22d2d1d
         | {loc = Reg _; typ = (Val | Int | Addr)}, {loc = Stack s} ->
22d2d1d
             let ofs = slot_offset s (register_class dst) in
22d2d1d
-            emit_store src ofs
22d2d1d
-        | {loc = Reg _; typ = Float}, {loc = Stack _} ->
22d2d1d
-            `	fsd	{emit_reg src}, {emit_stack dst}\n`
22d2d1d
+            emit_store stg src ofs
22d2d1d
+        | {loc = Reg _; typ = Float}, {loc = Stack s} ->
22d2d1d
+            let ofs = slot_offset s (register_class dst) in
22d2d1d
+            emit_store "fsd" src ofs
22d2d1d
         | {loc = Stack s; typ = (Val | Int | Addr)}, {loc = Reg _} ->
22d2d1d
             let ofs = slot_offset s (register_class src) in
22d2d1d
-            emit_load dst ofs
22d2d1d
-        | {loc = Stack _; typ = Float}, {loc = Reg _} ->
22d2d1d
-            `	fld	{emit_reg dst}, {emit_stack src}\n`
22d2d1d
+            emit_load lg dst ofs
22d2d1d
+        | {loc = Stack s; typ = Float}, {loc = Reg _} ->
22d2d1d
+            let ofs = slot_offset s (register_class src) in
22d2d1d
+            emit_load "fld" dst ofs
22d2d1d
         | _ ->
22d2d1d
             fatal_error "Emit: Imove"
22d2d1d
       end
22d2d1d
@@ -292,8 +306,7 @@ let emit_instr i =
22d2d1d
       record_frame ~label i.live false i.dbg
22d2d1d
   | Lop(Itailcall_ind {label_after = _}) ->
22d2d1d
       let n = frame_size() in
22d2d1d
-      if !contains_calls then
22d2d1d
-        `	{emit_string lg}	ra, {emit_int(n - size_addr)}(sp)\n`;
22d2d1d
+      if !contains_calls then reload_ra n;
22d2d1d
       emit_stack_adjustment n;
22d2d1d
       `	jr	{emit_reg i.arg.(0)}\n`
22d2d1d
   | Lop(Itailcall_imm {func; label_after = _}) ->
22d2d1d
@@ -301,8 +314,7 @@ let emit_instr i =
22d2d1d
         `	j	{emit_label !tailrec_entry_point}\n`
22d2d1d
       end else begin
22d2d1d
         let n = frame_size() in
22d2d1d
-        if !contains_calls then
22d2d1d
-          `	{emit_string lg}	ra, {emit_int(n - size_addr)}(sp)\n`;
22d2d1d
+        if !contains_calls then reload_ra n;
22d2d1d
         emit_stack_adjustment n;
22d2d1d
         `	tail	{emit_symbol func}\n`
22d2d1d
       end
22d2d1d
@@ -424,7 +436,7 @@ let emit_instr i =
22d2d1d
       `	{emit_string instr}	{emit_reg i.res.(0)}, {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}, {emit_reg i.arg.(2)}\n`
22d2d1d
   | Lreloadretaddr ->
22d2d1d
       let n = frame_size () in
22d2d1d
-      `	{emit_string lg}	ra, {emit_int(n - size_addr)}(sp)\n`
22d2d1d
+      reload_ra n
22d2d1d
   | Lreturn ->
22d2d1d
       let n = frame_size() in
22d2d1d
       emit_stack_adjustment n;
22d2d1d
@@ -542,8 +554,7 @@ let fundecl fundecl =
22d2d1d
   `{emit_symbol fundecl.fun_name}:\n`;
22d2d1d
   let n = frame_size() in
22d2d1d
   emit_stack_adjustment (-n);
22d2d1d
-  if !contains_calls then
22d2d1d
-    `	{emit_string stg}	ra, {emit_int(n - size_addr)}(sp)\n`;
22d2d1d
+  if !contains_calls then store_ra n;
22d2d1d
   `{emit_label !tailrec_entry_point}:\n`;
22d2d1d
   emit_all fundecl.fun_body;
22d2d1d
   List.iter emit_call_gc !call_gc_sites;
22d2d1d
-- 
7a76b44
2.13.1
22d2d1d