git subrepo pull (merge) --force deps/lightning
[pcsx_rearmed.git] / deps / lightning / lib / jit_riscv-cpu.c
index 388489f..2ae11b9 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2019  Free Software Foundation, Inc.
+ * Copyright (C) 2019-2022  Free Software Foundation, Inc.
  *
  * This file is part of GNU lightning.
  *
@@ -434,12 +434,9 @@ static void _stxi_i(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
 static void _stxr_l(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
 #  define stxi_l(i0, r0, r1)           _stxi_l(_jit, i0, r0, r1)
 static void _stxi_l(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t);
-#  define htonr_us(r0, r1)             _htonr_us(_jit, r0, r1)
-static void _htonr_us(jit_state_t*,jit_int32_t,jit_int32_t);
-#  define htonr_ui(r0, r1)             _htonr_ui(_jit, r0, r1)
-static void _htonr_ui(jit_state_t*,jit_int32_t,jit_int32_t);
-#  define htonr_ul(r0, r1)             _htonr_ul(_jit, r0, r1)
-static void _htonr_ul(jit_state_t*,jit_int32_t,jit_int32_t);
+#  define bswapr_us(r0, r1)            generic_bswapr_us(_jit, r0, r1)
+#  define bswapr_ui(r0, r1)            generic_bswapr_ui(_jit, r0, r1)
+#  define bswapr_ul(r0, r1)            generic_bswapr_ul(_jit, r0, r1)
 #  define extr_c(r0, r1)               _extr_c(_jit, r0, r1)
 static void _extr_c(jit_state_t*,jit_int32_t,jit_int32_t);
 #  define extr_uc(r0, r1)              andi(r0, r1, 0xff)
@@ -455,6 +452,15 @@ static void _extr_ui(jit_state_t*,jit_int32_t,jit_int32_t);
 static void _movi(jit_state_t*,jit_int32_t,jit_word_t);
 #  define movi_p(r0, im)               _movi_p(_jit, r0, im)
 static jit_word_t _movi_p(jit_state_t*,jit_int32_t,jit_word_t);
+#  define movnr(r0,r1,r2)              _movnr(_jit,r0,r1,r2)
+static void _movnr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
+#  define movzr(r0,r1,r2)              _movzr(_jit,r0,r1,r2)
+static void _movzr(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t);
+#  define casx(r0, r1, r2, r3, i0)     _casx(_jit, r0, r1, r2, r3, i0)
+static void _casx(jit_state_t *_jit,jit_int32_t,jit_int32_t,
+                 jit_int32_t,jit_int32_t,jit_word_t);
+#define casr(r0, r1, r2, r3)           casx(r0, r1, r2, r3, 0)
+#define casi(r0, i0, r1, r2)           casx(r0, _NOREG, r1, r2, i0)
 #  define ltr(r0, r1, r2)              SLT(r0, r1, r2)
 #  define lti(r0, r1, im)              _lti(_jit, r0, r1, im)
 static void _lti(jit_state_t*,jit_int32_t,jit_int32_t,jit_word_t);
@@ -1243,59 +1249,6 @@ DEFST(s, H)
 DEFST(i, W)
 DEFST(l, D)
 
-static void
-_htonr_us(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
-{
-    jit_int32_t                t0;
-    t0 = jit_get_reg(jit_class_gpr);
-    rshi(rn(t0), r1, 8);
-    andi(r0, r1, 0xff);
-    andi(rn(t0), rn(t0), 0xff);
-    lshi(r0, r0, 8);
-    orr(r0, r0, rn(t0));
-    jit_unget_reg(t0);
-}
-
-static void
-_htonr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
-{
-    jit_int32_t                t0;
-    jit_int32_t                t1;
-    jit_int32_t                t2;
-    t0 = jit_get_reg(jit_class_gpr);
-    t1 = jit_get_reg(jit_class_gpr);
-    t2 = jit_get_reg(jit_class_gpr);
-    rshi(rn(t0), r1, 24);
-    rshi(rn(t1), r1, 16);
-    rshi(rn(t2), r1,  8);
-    andi(rn(t0), rn(t0), 0xff);
-    andi(rn(t1), rn(t1), 0xff);
-    andi(rn(t2), rn(t2), 0xff);
-    andi(r0, r1, 0xff);
-    lshi(r0, r0, 24);
-    lshi(rn(t1), rn(t1), 8);
-    orr(r0, r0, rn(t0));
-    lshi(rn(t2), rn(t2), 16);
-    orr(r0, r0, rn(t1));
-    orr(r0, r0, rn(t2));
-    jit_unget_reg(t2);
-    jit_unget_reg(t1);
-    jit_unget_reg(t0);
-}
-
-static void
-_htonr_ul(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
-{
-    jit_int32_t                t0;
-    t0 = jit_get_reg(jit_class_gpr);
-    rshi_u(rn(t0), r1, 32);
-    htonr_ui(r0, r1);
-    htonr_ui(rn(t0), rn(t0));
-    lshi(r0, r0, 32);
-    orr(r0, r0, rn(t0));
-    jit_unget_reg(t0);
-}
-
 static void
 _extr_c(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
 {
@@ -1327,7 +1280,9 @@ _extr_ui(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1)
 static void
 _movi(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
 {
+#  if __WORDSIZE == 64
     if (simm32_p(i0)) {
+#  endif
        jit_int32_t     lo = (jit_int32_t)i0 << 20 >> 20;
        jit_int32_t     hi = i0 - lo;
        if (hi) {
@@ -1337,40 +1292,81 @@ _movi(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
        }
        else
            ADDIW(r0, _ZERO_REGNO, lo);
+#  if __WORDSIZE == 64
     }
-    else {
-       jit_int32_t     lo = i0 << 32 >> 32;
-       jit_word_t      hi = i0 - lo;
-       jit_int32_t     t0 = jit_get_reg(jit_class_gpr);
-       movi(rn(t0), (jit_int32_t)(hi >> 32));
-       movi(r0, lo);
-       lshi(rn(t0), rn(t0), 32);
-       addr(r0, r0, rn(t0));
-       jit_unget_reg(t0);
-    }
+    else
+       load_const(r0, i0);
+#  endif
 }
 
 static jit_word_t
 _movi_p(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
 {
     jit_word_t         w;
-    jit_int32_t                t0;
-    jit_int32_t                ww = i0 << 32 >> 32;
-    jit_int32_t                lo = ww << 20 >> 20;
-    jit_int32_t                hi = ww - lo;
     w = _jit->pc.w;
+#  if __WORDSIZE == 64
+    AUIPC(r0, 0);
+    ADDI(r0, r0, 0);
+    LD(r0, r0, 0);
+#  else
+    LUI(r0, 0);
+    ADDIW(r0, r0, 0);
+#  endif
+    return (w);
+}
+
+static void
+_movnr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
+{
+    jit_word_t w;
+    w = beqi(_jit->pc.w, r2, 0);
+    movr(r0, r1);
+    patch_at(w, _jit->pc.w);
+}
+
+static void
+_movzr(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_int32_t r2)
+{
+    jit_word_t w;
+    w = bnei(_jit->pc.w, r2, 0);
+    movr(r0, r1);
+    patch_at(w, _jit->pc.w);
+}
+
+static void
+_casx(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1,
+      jit_int32_t r2, jit_int32_t r3, jit_word_t i0)
+{
+    jit_int32_t                t0, r1_reg, iscasi;
+    jit_word_t         retry, done, jump0, jump1;
+    if ((iscasi = (r1 == _NOREG))) {
+       r1_reg = jit_get_reg(jit_class_gpr);
+       r1 = rn(r1_reg);
+       movi(r1, i0);
+    }
     t0 = jit_get_reg(jit_class_gpr);
-    LUI(r0, hi >> 12);
-    ADDIW(r0, r0, lo);
-    ww = i0 >> 32;
-    lo = ww << 20 >> 20;
-    hi = ww - lo;
-    LUI(rn(t0), hi >> 12);
-    ADDIW(rn(t0), rn(t0), lo);
-    SLLI(rn(t0), rn(t0), 32);
-    ADD(r0, r0, rn(t0));
+    retry = _jit->pc.w;
+#  if __WORDSIZE == 32
+    LR_W(r0, r1);
+#  else
+    LR_D(r0, r1);
+#  endif
+    jump0 = _jit->pc.w;
+    BNE(r0, r2, 0);
+#  if __WORDSIZE == 32
+    SC_W(rn(t0), r1, r3);
+#  else
+    SC_D(rn(t0), r1, r3);
+#  endif
+    jump1 = _jit->pc.w;
+    BNE(rn(t0), _ZERO_REGNO, 0);
+    done = _jit->pc.w;
+    eqr(r0, r0, r2);
+    patch_at(jump0, done);
+    patch_at(jump1, retry);
     jit_unget_reg(t0);
-    return (w);
+    if (iscasi)
+       jit_unget_reg(r1_reg);
 }
 
 static void
@@ -2318,42 +2314,44 @@ _patch_at(jit_state_t *_jit, jit_word_t instr, jit_word_t label)
     u.w = instr;
     i.w = u.i[0];
     /* movi_p? */
+#  if __WORDSIZE == 64
+    if (i.U.opcode == 23) {                                    /* AUIPC */
+       jit_int32_t     lo, hi;
+       jit_word_t      address, relative;
+       address = get_const(label);
+       relative = address - instr;
+       assert(simm32_p(relative));
+       lo = (jit_int32_t)relative << 20 >> 20;
+       hi = relative - lo;
+       i.U.imm12_31 = hi >> 12;
+       u.i[0] = i.w;
+       i.w = u.i[1];
+       if (i.I.opcode == 19 && i.I.funct3 == 0) {              /* ADDI */
+           i.I.imm11_0 = lo;
+           u.i[1] = i.w;
+           i.w = u.i[2];
+       }
+       else
+           abort();
+       i.w = u.i[1];
+       assert(i.I.opcode == 3 && i.I.funct3 == 3);             /* LD */
+    }
+#  else
     if (i.U.opcode == 55) {                                    /* LUI */
-       jit_int32_t     ww = label << 32 >> 32;
-       jit_int32_t     lo = ww << 20 >> 20;
-       jit_int32_t     hi = ww - lo;
+       jit_int32_t     lo = (jit_int32_t)label << 20 >> 20;
+       jit_int32_t     hi = label - lo;
        i.U.imm12_31 = hi >> 12;
        u.i[0] = i.w;
        i.w = u.i[1];
        if (i.I.opcode == 27 && i.I.funct3 == 0) {              /* ADDIW */
-           i.I.imm11_0 = lo & 0xfff;
+           i.I.imm11_0 = lo;
            u.i[1] = i.w;
            i.w = u.i[2];
-           if (i.U.opcode == 55) {                             /* LUI */
-               ww = label >> 32;
-               lo = ww << 20 >> 20;
-               hi = ww - lo;
-               i.U.imm12_31 = hi >> 12;
-               u.i[2] = i.w;
-               i.w = u.i[3];
-               if (i.I.opcode == 27 && i.I.funct3 == 0) {      /* ADDIW */
-                   i.I.imm11_0 = lo & 0xfff;
-                   u.i[3] = i.w;
-                   i.w = u.i[4];
-                   assert(i.IS.opcode == 19);                  /* SLLI */
-                   assert(i.IS.shamt == 32);
-                   i.w = u.i[5];
-                   assert(i.R.opcode == 51);                   /* ADD */
-               }
-               else
-                   abort();
-           }
-           else
-               abort();
        }
        else
            abort();
     }
+#  endif
     /* b{lt,le,eq,ge,gt,ne}{,_u}? */
     else if (i.B.opcode == 99) {               /* B{EQ,NE,LT,GE,LTU,GEU} */
        jit_word_t jmp = label - instr;