git subrepo pull (merge) --force deps/lightning
[pcsx_rearmed.git] / deps / lightning / lib / jit_loongarch-fpu.c
index 2871de3..a3fd02a 100644 (file)
@@ -215,6 +215,10 @@ static void _divi_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_float32_t);
 # define absr_f(r0, r1)                        FABS_S(r0, r1)
 # define negr_f(r0, r1)                        FNEG_S(r0, r1)
 # define sqrtr_f(r0, r1)               FSQRT_S(r0, r1)
+# define fmar_f(r0, r1, r2, r3)                FMADD_S(r0, r1, r2, r3)
+# define fmsr_f(r0, r1, r2, r3)                FMSUB_S(r0, r1, r2, r3)
+# define fnmar_f(r0, r1, r2, r3)       FNMADD_S(r0, r1, r2, r3)
+# define fnmsr_f(r0, r1, r2, r3)       FNMSUB_S(r0, r1, r2, r3)
 # define extr_f(r0, r1)                        _extr_f(_jit, r0, r1)
 static void _extr_f(jit_state_t*, jit_int32_t, jit_int32_t);
 # define ldr_f(r0, r1)                 FLD_S(r0, r1, 0)
@@ -223,19 +227,27 @@ static void _ldi_f(jit_state_t*, jit_int32_t, jit_word_t);
 # define ldxr_f(r0, r1, r2)            FLDX_S(r0, r1, r2)
 # define ldxi_f(r0, r1, i0)            _ldxi_f(_jit, r0, r1, i0)
 static void _ldxi_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
+#  define unldr_x(r0, r1, i0)          _unldr_x(_jit, r0, r1, i0)
+static void _unldr_x(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
+#  define unldi_x(r0, i0, i1)          _unldi_x(_jit, r0, i0, i1)
+static void _unldi_x(jit_state_t*, jit_int32_t, jit_word_t, jit_word_t);
 # define str_f(r0, r1)                 FST_S(r1, r0, 0)
 # define sti_f(i0, r0)                 _sti_f(_jit, i0, r0)
 static void _sti_f(jit_state_t*, jit_word_t, jit_int32_t);
 # define stxr_f(r0, r1, r2)            FSTX_S(r2, r1, r0)
 # define stxi_f(i0, r0, r1)            _stxi_f(_jit, i0, r0, r1)
 static void _stxi_f(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_t);
+#define unstr_x(r0, r1, i0)            _unstr_x(_jit, r0, r1, i0)
+static void _unstr_x(jit_state_t*, jit_int32_t, jit_int32_t, jit_word_t);
+#define unsti_x(i0, r0, i1)            _unsti_x(_jit, i0, r0, i1)
+static void _unsti_x(jit_state_t*, jit_word_t, jit_int32_t, jit_word_t);
 # define movr_f(r0, r1)                        FMOV_S(r0, r1)
 # define movi_f(r0, i0)                        _movi_f(_jit, r0, i0)
 static void _movi_f(jit_state_t*, jit_int32_t, jit_float32_t);
 #  define movr_f_w(r0, r1)             MOVFR2GR_S(r0, r1)
-#  define movi_f_w(r0, im)             _movi_f_w(_jit, r0, im)
-static void _movi_f_w(jit_state_t*, jit_int32_t, jit_float32_t);
 #  define movr_w_f(r0, r1)             MOVGR2FR_W(r0, r1)
+#define movi_w_f(r0, i0)               _movi_w_f(_jit, r0, i0)
+static void _movi_w_f(jit_state_t*, jit_int32_t, jit_word_t);
 # define extr_d_f(r0, r1)              FCVT_S_D(r0, r1)
 # define ltr_f(r0, r1, r2)             _ltr_f(_jit, r0, r1, r2)
 static void _ltr_f(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
@@ -367,6 +379,10 @@ static void _divi_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_float64_t);
 # define absr_d(r0, r1)                        FABS_D(r0, r1)
 # define negr_d(r0, r1)                        FNEG_D(r0, r1)
 # define sqrtr_d(r0, r1)               FSQRT_D(r0, r1)
+# define fmar_d(r0, r1, r2, r3)                FMADD_D(r0, r1, r2, r3)
+# define fmsr_d(r0, r1, r2, r3)                FMSUB_D(r0, r1, r2, r3)
+# define fnmar_d(r0, r1, r2, r3)       FNMADD_D(r0, r1, r2, r3)
+# define fnmsr_d(r0, r1, r2, r3)       FNMSUB_D(r0, r1, r2, r3)
 # define extr_d(r0, r1)                        _extr_d(_jit, r0, r1)
 static void _extr_d(jit_state_t*, jit_int32_t, jit_int32_t);
 # define ldr_d(r0, r1)                 FLD_D(r0, r1, 0)
@@ -385,9 +401,9 @@ static void _stxi_d(jit_state_t*, jit_word_t, jit_int32_t, jit_int32_t);
 # define movi_d(r0, i0)                        _movi_d(_jit, r0, i0)
 static void _movi_d(jit_state_t*, jit_int32_t, jit_float64_t);
 #  define movr_d_w(r0, r1)             MOVFR2GR_D(r0, r1)
-#  define movi_d_w(r0, im)             _movi_d_w(_jit, r0, im)
-static void _movi_d_w(jit_state_t*, jit_int32_t, jit_float64_t);
 #  define movr_w_d(r0, r1)             MOVGR2FR_D(r0, r1)
+#define movi_w_d(r0, i0)               _movi_w_d(_jit, r0, i0)
+static void _movi_w_d(jit_state_t*, jit_int32_t, jit_word_t);
 # define extr_f_d(r0, r1)              FCVT_D_S(r0, r1)
 # define ltr_d(r0, r1, r2)             _ltr_d(_jit, r0, r1, r2)
 static void _ltr_d(jit_state_t*, jit_int32_t, jit_int32_t, jit_int32_t);
@@ -614,6 +630,24 @@ _ldxi_f(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
     }
 }
 
+static void
+_unldr_x(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
+{
+    if (jit_unaligned_p())
+       fallback_unldr_x(r0, r1, i0);
+    else
+       generic_unldr_x(r0, r1, i0);
+}
+
+static void
+_unldi_x(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0, jit_word_t i1)
+{
+    if (jit_unaligned_p())
+       fallback_unldi_x(r0, i0, i1);
+    else
+       generic_unldi_x(r0, i0, i1);
+}
+
 static void
 _sti_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0)
 {
@@ -642,6 +676,24 @@ _stxi_f(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1)
     }
 }
 
+static void
+_unstr_x(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1, jit_word_t i0)
+{
+    if (jit_unaligned_p())
+       fallback_unstr_x(r0, r1, i0);
+    else
+       generic_unstr_x(r0, r1, i0);
+}
+
+static void
+_unsti_x(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_word_t i1)
+{
+    if (jit_unaligned_p())
+       fallback_unsti_x(i0, r0, i1);
+    else
+       fallback_unsti_x(i0, r0, i1);
+}
+
 static void
 _movi_f(jit_state_t *_jit, jit_int32_t r0, jit_float32_t i0)
 {
@@ -662,14 +714,13 @@ _movi_f(jit_state_t *_jit, jit_int32_t r0, jit_float32_t i0)
 }
 
 static void
-_movi_f_w(jit_state_t *_jit, jit_int32_t r0, jit_float32_t i0)
+_movi_w_f(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
 {
-    union {
-       jit_int32_t     i;
-       jit_float32_t   f;
-    } data;
-    data.f = i0;
-    movi(r0, data.i);
+    jit_int32_t                reg;
+    reg = jit_get_reg(jit_class_gpr);
+    movi(rn(reg), i0);
+    movr_w_f(r0, rn(reg));
+    jit_unget_reg(reg);
 }
 
 static void
@@ -1028,14 +1079,13 @@ _movi_d(jit_state_t *_jit, jit_int32_t r0, jit_float64_t i0)
 }
 
 static void
-_movi_d_w(jit_state_t *_jit, jit_int32_t r0, jit_float64_t i0)
+_movi_w_d(jit_state_t *_jit, jit_int32_t r0, jit_word_t i0)
 {
-    union {
-       jit_int64_t     l;
-       jit_float64_t   d;
-    } data;
-    data.d = i0;
-    movi(r0, data.l);
+    jit_int32_t                reg;
+    reg = jit_get_reg(jit_class_gpr);
+    movi(rn(reg), i0);
+    movr_w_d(r0, rn(reg));
+    jit_unget_reg(reg);
 }
 
 static void