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