On 07/15/2010 09:57 AM, Uros Bizjak wrote:
Hello!

I was playing a bit with TARGET_SHIFT_TRUNCATION_MASK on x86 in the
hope that redundant masking would get eliminated from:

int test (int a, int c)
{
        return a<<  (c&  0x1f);
}

The macro was defined as:

+/* Implement TARGET_SHIFT_TRUNCATION_MASK.  */
+static unsigned HOST_WIDE_INT
+ix86_shift_truncation_mask (enum machine_mode mode)
+{
+  switch (mode)
+    {
+    case QImode:
+    case HImode:
+    case SImode:
+      return 31;
+
+    case DImode:
+      if (TARGET_64BIT)
+       return 63;
+
+    default:
+      return 0;
+    }
+}

However, I was not able to get rid of the masking "and".

FWIW, the reason the hook is not implemented on x86 is that some variants of bsf/bsr (I think with memory source) do not honor the truncation.

Paolo

Reply via email to