summaryrefslogtreecommitdiff
path: root/gcc/rtl.h
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@linaro.org>2017-12-20 12:53:52 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2017-12-20 12:53:52 +0000
commitfc60a41612bad379060969b6ed3a78eb160aae8a (patch)
treec5ad67c91160778f85d53cd9d8e5203871279310 /gcc/rtl.h
parent2d7b38df8e50a2c29bbc778a34c6ab6349178994 (diff)
poly_int: extract_bit_field bitrange
Similar to the previous store_bit_field patch, but for extractions rather than insertions. The patch splits out the extraction-as-subreg handling into a new function (extract_bit_field_as_subreg), both for ease of writing and because a later patch will add another caller. The simplify_gen_subreg overload is temporary; it goes away in a later patch. 2017-12-20 Richard Sandiford <richard.sandiford@linaro.org> Alan Hayward <alan.hayward@arm.com> David Sherwood <david.sherwood@arm.com> gcc/ * rtl.h (simplify_gen_subreg): Add a temporary overload that accepts poly_uint64 offsets. * expmed.h (extract_bit_field): Take bitsize and bitnum as poly_uint64s rather than unsigned HOST_WIDE_INTs. * expmed.c (lowpart_bit_field_p): Likewise. (extract_bit_field_as_subreg): New function, split out from... (extract_bit_field_1): ...here. Take bitsize and bitnum as poly_uint64s rather than unsigned HOST_WIDE_INTs. For vector extractions, check that BITSIZE matches the size of the extracted value and that BITNUM is an exact multiple of that size. If all else fails, try forcing the value into memory if BITNUM is variable, and adjusting the address so that the offset is constant. Split the part that can only handle constant bitsize and bitnum out into... (extract_integral_bit_field): ...this new function. (extract_bit_field): Take bitsize and bitnum as poly_uint64s rather than unsigned HOST_WIDE_INTs. Co-Authored-By: Alan Hayward <alan.hayward@arm.com> Co-Authored-By: David Sherwood <david.sherwood@arm.com> From-SVN: r255878
Diffstat (limited to 'gcc/rtl.h')
-rw-r--r--gcc/rtl.h6
1 files changed, 6 insertions, 0 deletions
diff --git a/gcc/rtl.h b/gcc/rtl.h
index 408298a8f7a..f09a9f46875 100644
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -3293,6 +3293,12 @@ extern rtx simplify_subreg (machine_mode, rtx, machine_mode,
unsigned int);
extern rtx simplify_gen_subreg (machine_mode, rtx, machine_mode,
unsigned int);
+inline rtx
+simplify_gen_subreg (machine_mode omode, rtx x, machine_mode imode,
+ poly_uint64 offset)
+{
+ return simplify_gen_subreg (omode, x, imode, offset.to_constant ());
+}
extern rtx lowpart_subreg (machine_mode, rtx, machine_mode);
extern rtx simplify_replace_fn_rtx (rtx, const_rtx,
rtx (*fn) (rtx, const_rtx, void *), void *);