aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorWalter Lee <walt@tilera.com>2016-11-23 04:33:43 +0000
committerWalter Lee <walt@gcc.gnu.org>2016-11-23 04:33:43 +0000
commit0f525c3e59929888046e686ec8375514b5c381f5 (patch)
tree410cb308cfc4126288617deeef8a6e72cf1e25e6 /gcc
parent3135d8fe8a2ac2a88c9681494c6f1ea68d3ae614 (diff)
downloadgcc-0f525c3e59929888046e686ec8375514b5c381f5.zip
gcc-0f525c3e59929888046e686ec8375514b5c381f5.tar.gz
gcc-0f525c3e59929888046e686ec8375514b5c381f5.tar.bz2
TILE-Gx...
TILE-Gx: fixes the zero_extract/sign_extract patterns so that they properly handle the case when pos + size > number of bits in a word. * config/tilegx/tilegx.md (*zero_extract): Use define_insn_and_split instead of define_insn; Handle pos + size > 64. (*sign_extract): Likewise. From-SVN: r242734
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/tilegx/tilegx.md28
2 files changed, 33 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 8d11c29..a7a776e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2016-11-22 Walter Lee <walt@tilera.com>
+
+ * config/tilegx/tilegx.md (*zero_extract): Use
+ define_insn_and_split instead of define_insn; Handle pos + size >
+ 64.
+ (*sign_extract): Likewise.
+
2016-11-22 Marek Polacek <polacek@redhat.com>
PR tree-optimization/78455
diff --git a/gcc/config/tilegx/tilegx.md b/gcc/config/tilegx/tilegx.md
index 55c345c..3ad5a87 100644
--- a/gcc/config/tilegx/tilegx.md
+++ b/gcc/config/tilegx/tilegx.md
@@ -1237,7 +1237,7 @@
"ld<four_s_if_si>_tls\t%0, %1, tls_ie_load(%2)"
[(set_attr "type" "X1_2cycle")])
-(define_insn "*zero_extract<mode>"
+(define_insn_and_split "*zero_extract<mode>"
[(set (match_operand:I48MODE 0 "register_operand" "=r")
(zero_extract:I48MODE
(match_operand:I48MODE 1 "reg_or_0_operand" "r")
@@ -1245,6 +1245,18 @@
(match_operand:I48MODE 3 "u6bit_cint_operand" "n")))]
""
"bfextu\t%0, %r1, %3, %3+%2-1"
+ "&& reload_completed"
+ [(set (match_dup 0) (zero_extract:I48MODE
+ (match_dup 1)
+ (match_dup 2)
+ (match_dup 3)))]
+{
+ HOST_WIDE_INT bit_width = INTVAL (operands[2]);
+ HOST_WIDE_INT bit_offset = INTVAL (operands[3]);
+
+ if (bit_offset + bit_width > 64)
+ operands[2] = GEN_INT (64 - bit_offset);
+}
[(set_attr "type" "X0")])
(define_insn "*sign_extract_low32"
@@ -1256,7 +1268,7 @@
"INTVAL (operands[3]) == 0 && INTVAL (operands[2]) == 32"
"addxi\t%0, %r1, 0")
-(define_insn "*sign_extract"
+(define_insn_and_split "*sign_extract"
[(set (match_operand:I48MODE 0 "register_operand" "=r")
(sign_extract:I48MODE
(match_operand:I48MODE 1 "reg_or_0_operand" "r")
@@ -1264,6 +1276,18 @@
(match_operand:I48MODE 3 "u6bit_cint_operand" "n")))]
""
"bfexts\t%0, %r1, %3, %3+%2-1"
+ "&& reload_completed"
+ [(set (match_dup 0) (sign_extract:I48MODE
+ (match_dup 1)
+ (match_dup 2)
+ (match_dup 3)))]
+{
+ HOST_WIDE_INT bit_width = INTVAL (operands[2]);
+ HOST_WIDE_INT bit_offset = INTVAL (operands[3]);
+
+ if (bit_offset + bit_width > 64)
+ operands[2] = GEN_INT (64 - bit_offset);
+}
[(set_attr "type" "X0")])