git subrepo pull (merge) --force deps/lightning
[pcsx_rearmed.git] / deps / lightning / lib / jit_aarch64-cpu.c
index 76a988b..b0bc26f 100644 (file)
@@ -1580,9 +1580,7 @@ static void
 _xrshr(jit_state_t *_jit, jit_bool_t sign,
        jit_int32_t r0, jit_int32_t r1, jit_int32_t r2, jit_int32_t r3)
 {
-    jit_bool_t         branch;
-    jit_word_t         over, zero, done, done_over;
-    jit_int32_t                t0, s0, t1, s1, t2, s2, t3, s3;
+    jit_int32_t                t0, s0, t2, s2, t3, s3;
     s0 = jit_get_reg(jit_class_gpr);
     t0 = rn(s0);
     if (r0 == r2 || r1 == r2) {
@@ -1599,51 +1597,26 @@ _xrshr(jit_state_t *_jit, jit_bool_t sign,
     }
     else
        t3 = r3;
-    if ((s1 = jit_get_reg(jit_class_gpr|jit_class_nospill|jit_class_chk))) {
-       t1 = rn(s1);
-       branch = 0;
-    }
-    else
-       branch = 1;
-    rsbi(t0, t3, __WORDSIZE);
-    if (sign)
-       rshr(r0, t2, t3);
-    else
-       rshr_u(r0, t2, t3);
-    lshr(r1, t2, t0);
-    if (branch) {
-       zero = beqi(_jit->pc.w, t3, 0);
-       over = beqi(_jit->pc.w, t3, __WORDSIZE);
-       done = jmpi(_jit->pc.w);
-       patch_at(over, _jit->pc.w);
-       /* underflow */
-       if (sign)
-           rshi(r0, t2, __WORDSIZE - 1);
-       else
-           movi(r0, 0);
-       done_over = jmpi(_jit->pc.w);
-       /* zero */
-       patch_at(zero, _jit->pc.w);
-       if (sign)
-           rshi(r1, t2, __WORDSIZE - 1);
-       else
-           movi(r1, 0);
-       patch_at(done, _jit->pc.w);
-       patch_at(done_over, _jit->pc.w);
-       jit_unget_reg(s1);
+
+    if (sign) {
+       /* underflow? */
+       eqi(t0, t3, __WORDSIZE);
+       subr(t0, t3, t0);
+       rshr(r0, t2, t0);
     }
     else {
-       /* zero? */
-       if (sign)
-           rshi(t0, t2, __WORDSIZE - 1);
-       else
-           movi(t0, 0);
-       movzr(r1, t0, t3);
        /* underflow? */
-       eqi(t1, t3, __WORDSIZE);
-       movnr(r0, t0, t1);
-       jit_unget_reg(s1);
+       nei(t0, t3, __WORDSIZE);
+       rshr_u(r0, t2, t3);
+       movzr(r0, t0, t0);
     }
+
+    rsbi(t0, t3, __WORDSIZE);
+    lshr(r1, t2, t0);
+
+    /* zero? */
+    movzr(r1, t3, t3);
+
     jit_unget_reg(s0);
     if (t2 != r2)
        jit_unget_reg(s2);
@@ -1657,10 +1630,7 @@ _xrshi(jit_state_t *_jit, jit_bool_t sign,
 {
     if (i0 == 0) {
        movr(r0, r2);
-       if (sign)
-           rshi(r1, r2, __WORDSIZE - 1);
-       else
-           movi(r1, 0);
+       movi(r1, 0);
     }
     else if (i0 == __WORDSIZE) {
        movr(r1, r2);