diff options
author | Andreas Krebbel <krebbel@linux.vnet.ibm.com> | 2015-07-24 11:28:06 +0000 |
---|---|---|
committer | Andreas Krebbel <krebbel@gcc.gnu.org> | 2015-07-24 11:28:06 +0000 |
commit | 3d44ff9919d50db3a67bee88235bbdb9735ba34b (patch) | |
tree | ebb22a10af14a6b8498dfe67c1ae6abb2122c957 /gcc/config/s390/s390.c | |
parent | bacf8ec3dff179036cbf31719087926e9036d898 (diff) | |
download | gcc-3d44ff9919d50db3a67bee88235bbdb9735ba34b.zip gcc-3d44ff9919d50db3a67bee88235bbdb9735ba34b.tar.gz gcc-3d44ff9919d50db3a67bee88235bbdb9735ba34b.tar.bz2 |
[PATCH] S/390: Improve risbg usage
gcc/ChangeLog:
2015-07-24 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
* config/s390/s390.c (s390_rtx_costs): Make risbg patterns
cheaper.
(s390_expand_insv): Don't generate risbg pattern for constant zero
sources.
* config/s390/s390.md ("*insv<mode>_zEC12_appendbitsleft")
("*insv<mode>_z10_appendbitsleft"): New pattern definitions. New
splitters.
gcc/testsuite/ChangeLog:
2015-07-24 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
* gcc.target/s390/insv-1.c: New test.
* gcc.target/s390/insv-2.c: New test.
* gcc.target/s390/insv-3.c: New test.
From-SVN: r226148
Diffstat (limited to 'gcc/config/s390/s390.c')
-rw-r--r-- | gcc/config/s390/s390.c | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c index 1764243..f421e88 100644 --- a/gcc/config/s390/s390.c +++ b/gcc/config/s390/s390.c @@ -3321,13 +3321,26 @@ s390_rtx_costs (rtx x, machine_mode mode, int outer_code, *total = 0; return true; + case IOR: + /* risbg */ + if (GET_CODE (XEXP (x, 0)) == AND + && GET_CODE (XEXP (x, 1)) == ASHIFT + && REG_P (XEXP (XEXP (x, 0), 0)) + && REG_P (XEXP (XEXP (x, 1), 0)) + && CONST_INT_P (XEXP (XEXP (x, 0), 1)) + && CONST_INT_P (XEXP (XEXP (x, 1), 1)) + && (UINTVAL (XEXP (XEXP (x, 0), 1)) == + (1UL << UINTVAL (XEXP (XEXP (x, 1), 1))) - 1)) + { + *total = COSTS_N_INSNS (2); + return true; + } case ASHIFT: case ASHIFTRT: case LSHIFTRT: case ROTATE: case ROTATERT: case AND: - case IOR: case XOR: case NEG: case NOT: @@ -5839,8 +5852,17 @@ s390_expand_insv (rtx dest, rtx op1, rtx op2, rtx src) if (mode_s == VOIDmode) { - /* Assume const_int etc already in the proper mode. */ - src = force_reg (mode, src); + /* For constant zero values the representation with AND + appears to be folded in more situations than the (set + (zero_extract) ...). + We only do this when the start and end of the bitfield + remain in the same SImode chunk. That way nihf or nilf + can be used. + The AND patterns might still generate a risbg for this. */ + if (src == const0_rtx && bitpos / 32 == (bitpos + bitsize - 1) / 32) + return false; + else + src = force_reg (mode, src); } else if (mode_s != mode) { |