On 05/04/2016 11:08 AM, Laurent Vivier wrote:
-    if (count == 0) {
-        count = 8;
-    }
+    count = ((count - 1) & 0x7) + 1; /* 1..8 */

How is that clearer, or even simpler?

+                tcg_gen_setcond_i32(TCG_COND_EQ, QREG_CC_V, reg, zero);
+                /* adjust V: (1,0) -> (0,-1) */
+                tcg_gen_subi_i32(QREG_CC_V, QREG_CC_V, 1);

Better to use NE and neg.

+                TCGv t0 = tcg_temp_new();
+                TCGv t1 = tcg_const_i32(bits - 1 - count);
+
+                tcg_gen_shr_i32(QREG_CC_V, reg, t1);
+                tcg_gen_sar_i32(t0, reg, t1);
+                tcg_temp_free(t1);
+                tcg_gen_not_i32(t0, t0);
+
+                tcg_gen_setcond_i32(TCG_COND_EQ, QREG_CC_V, QREG_CC_V, zero);
+                tcg_gen_setcond_i32(TCG_COND_EQ, t0, t0, zero);
+                tcg_gen_or_i32(QREG_CC_V, QREG_CC_V, t0); /* V is !V here */
+
+                tcg_temp_free(t0);
+
+                /* adjust V: (1,0) -> (0,-1) */
+                tcg_gen_subi_i32(QREG_CC_V, QREG_CC_V, 1);

Can this be done more simply by creating a mask of sign bits, i.e.

    tcg_gen_sari_i32(t0, reg, 31);
    tcg_gen_shri_i32(t0, t0, bits - count);
    tcg_gen_shri_i32(t1, reg, bits - count);
    tcg_gen_setcond_i32(TCG_COND_NE, QREG_CC_V, t0, t1);
    tcg_gen_neg_i32(QREG_CC_V, QREG_CC_V);


r~

Reply via email to