Fwd: [PATCH, i386]: Remove special handling of memory operands from *testqi_ext_3
Uros Bizjak
ubizjak@gmail.com
Thu Jan 5 19:18:00 GMT 2017
Hello!
It turned out that recent changes made special handling of memory
operands in *testqi_ext_3 obsolete. Combine now always pass correct
width of memory operands for the extraction, as assured by added
assert.
2017-01-05 Uros Bizjak <ubizjak@gmail.com>
* config/i386/i386.md (*testqi_ext_3): No need to handle memory
operands in a special way. Assert that pos+len <= mode precision.
Bootstrapped and regression tested on x86_64-linux-gnu {,-m32}.
Committed to mainline SVN.
Uros.
-------------- next part --------------
Index: i386.md
===================================================================
--- i386.md (revision 244058)
+++ i386.md (working copy)
@@ -8007,36 +8007,30 @@
rtx val = operands[2];
HOST_WIDE_INT len = INTVAL (operands[3]);
HOST_WIDE_INT pos = INTVAL (operands[4]);
- machine_mode mode, submode;
+ machine_mode mode = GET_MODE (val);
- mode = GET_MODE (val);
- if (MEM_P (val))
+ if (SUBREG_P (val))
{
- /* ??? Combine likes to put non-volatile mem extractions in QImode
- no matter the size of the test. So find a mode that works. */
- if (! MEM_VOLATILE_P (val))
+ machine_mode submode = GET_MODE (SUBREG_REG (val));
+
+ /* Narrow paradoxical subregs to prevent partial register stalls. */
+ if (GET_MODE_BITSIZE (mode) > GET_MODE_BITSIZE (submode)
+ && GET_MODE_CLASS (submode) == MODE_INT)
{
- mode = smallest_mode_for_size (pos + len, MODE_INT);
- val = adjust_address (val, mode, 0);
+ val = SUBREG_REG (val);
+ mode = submode;
}
}
- else if (SUBREG_P (val)
- && (submode = GET_MODE (SUBREG_REG (val)),
- GET_MODE_BITSIZE (mode) > GET_MODE_BITSIZE (submode))
- && pos + len <= GET_MODE_BITSIZE (submode)
- && GET_MODE_CLASS (submode) == MODE_INT)
+
+ /* Small HImode tests can be converted to QImode. */
+ if (register_operand (val, HImode) && pos + len <= 8)
{
- /* Narrow a paradoxical subreg to prevent partial register stalls. */
- mode = submode;
- val = SUBREG_REG (val);
- }
- else if (mode == HImode && pos + len <= 8)
- {
- /* Small HImode tests can be converted to QImode. */
+ val = gen_lowpart (QImode, val);
mode = QImode;
- val = gen_lowpart (QImode, val);
}
+ gcc_assert (pos + len <= GET_MODE_PRECISION (mode));
+
wide_int mask
= wi::shifted_mask (pos, len, false, GET_MODE_PRECISION (mode));
More information about the Gcc-patches
mailing list