bug-mes
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] riscv: Implement large addend for global address


From: Ekaitz Zarraga
Subject: [PATCH] riscv: Implement large addend for global address
Date: Tue, 16 Apr 2024 13:19:12 +0200

---
 riscv64-gen.c | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/riscv64-gen.c b/riscv64-gen.c
index 8636d8b4..70093993 100644
--- a/riscv64-gen.c
+++ b/riscv64-gen.c
@@ -295,7 +295,7 @@ int gtst(int inv, int t)
 
 static int load_symofs(int r, SValue *sv, int forstore)
 {
-    int rr, doload = 0;
+    int rr, doload = 0, large_addend = 0;
     int fc = sv->c.i, v = sv->r & VT_VALMASK;
     if (sv->r & VT_SYM) {
         Sym label = {0};
@@ -305,8 +305,9 @@ static int load_symofs(int r, SValue *sv, int forstore)
                     R_RISCV_PCREL_HI20, sv->c.i);
             sv->c.i = 0;
         } else {
-            if (((unsigned)fc + (1 << 11)) >> 12)
-              tcc_error("unimp: large addend for global address (0x%lx)", 
(long)sv->c.i);
+            if (((unsigned)fc + (1 << 11)) >> 12){
+              large_addend = 1;
+            }
             greloca(cur_text_section, sv->sym, ind,
                     R_RISCV_GOT_HI20, 0);
             doload = 1;
@@ -321,6 +322,11 @@ static int load_symofs(int r, SValue *sv, int forstore)
                   ? R_RISCV_PCREL_LO12_I : R_RISCV_PCREL_LO12_S, 0);
         if (doload) {
             EI(0x03, 3, rr, rr, 0); // ld RR, 0(RR)
+            if (large_addend) {
+                o(0x37 | (5 << 7) | ((0x800 + fc) & 0xfffff000)); //lui t0, 
high(fc)
+                ER(0x33, 0, rr, rr, 5, 0); // add RR, RR, t0
+                sv->c.i = fc << 20 >> 20;
+            }
         }
     } else if (v == VT_LOCAL || v == VT_LLOCAL) {
         rr = 8; // s0
-- 
2.41.0




reply via email to

[Prev in Thread] Current Thread [Next in Thread]