diff options
author | Chao-ying Fu <fu@mips.com> | 2007-08-23 00:30:39 +0000 |
---|---|---|
committer | Chao-ying Fu <chaoyingfu@gcc.gnu.org> | 2007-08-23 00:30:39 +0000 |
commit | 091a3ac7b8dc905e22be2198966d43977699a49e (patch) | |
tree | 94fb170497e612ea3b6c7e7f3250d4c77df42147 /gcc/doc | |
parent | 9851005046530a2de4bceef47a4dffb56449302c (diff) | |
download | gcc-091a3ac7b8dc905e22be2198966d43977699a49e.zip gcc-091a3ac7b8dc905e22be2198966d43977699a49e.tar.gz gcc-091a3ac7b8dc905e22be2198966d43977699a49e.tar.bz2 |
rtl.c (rtx_code_size): Check CONST_FIXED to calcualte correct sizes in DEF_RTL_EXPR.
* rtl.c (rtx_code_size): Check CONST_FIXED to calcualte correct sizes
in DEF_RTL_EXPR.
(copy_rtx): Handle CONST_FIXED.
(rtx_equal_p): Likewise.
* rtl.h (fixed_value.h): New include.
(rtx_def): Add a new field of fixed_value to u.
(XCNMPFV): Define for accessing fixed_value.
(CONST_FIXED_VALUE, CONST_FIXED_VALUE_HIGH, CONST_FIXED_VALUE_LOW):
Define.
* rtl.def (CONST_FIXED): New constant.
(SS_MULT, US_MULT, SS_DIV, US_DIV, FRACT_CONVERT,
UNSIGNED_FRACT_CONVERT, SAT_FRACT, UNSIGNED_SAT_FRACT, US_NEG,
US_ASHIFT): New codes.
* doc/rtl.texi (Expressions): Document const_fixed, us_neg, ss_mult,
us_mult, ss_div, us_div, us_ashift, fract_convert, sat_fract,
unsigned_fract_convert, unsigned_sat_fract): Document them.
* varasm.c (assemble_integer): Extend to support fixed-point constants
by using different machine classes.
(decode_addr_const): Handle FIXED_CST.
(const_hash_1): Likewise.
(compare_constant): Likewise.
(copy_constant): Likewise.
(const_rtx_hash_1): Handle CONST_FIXED.
(output_constant_pool_2): Handle MODE_FRACT, MODE_UFRACT, MODE_ACCUM,
MODE_UACCUM, MODE_VECTOR_FRACT, MODE_VECTOR_UFRACT, MODE_VECTOR_ACCUM,
MODE_VECTOR_UACCUM.
(initializer_constant_valid_p): Handle FIXED_CST.
(output_constant): Support FIXED_POINT_TYPE.
* gengenrtl.c (excluded_rtx): Check CONST_FIXED to exclude.
* cse.c (hash_rtx): Support CONST_FIXED.
(exp_equiv_p): Likewise.
(cannon_reg): Likewise.
(fold_rtx): Likewise.
(equiv_constant): Likewise.
(cse_process_notes_1): Likewise.
(count_reg_usage): Likewise.
* cselib.c (entry_and_rtx_equal_p): Check CONST_FIXED.
(rtx_equal_for_cselib_p): Handle CONST_FIXED.
(wrap_constant): Check CONST_FIXED.
(cselib_hash_rtx): Support CONST_FIXED.
(cselib_subst_to_values): Likewise.
* df-scan.c (df_uses_record): Likewise.
* gcse.c (want_to_gcse_p): Likewise.
(oprs_unchanged_p): Likewise.
(oprs_not_set_p): Likewise.
(compute_transp): Likewise.
(extract_mentioned_regs_helper): Likewise.
* genemit.c (gen_exp): Likewise.
* local-alloc.c (equiv_init_varies_p): Likewise.
(contains_replace_regs): Likewise.
(memref_referenced_p): Likewise.
* loop-invariant.c (check_maybe_invariant): Likewise.
(hash_invariant_expr_1): Likewise.
(invariant_expr_equal_p): Likewise.
* postreload-gcse.c (oprs_unchanged_p): Likewise.
* regclass.c (reg_scan_mark_refs): Likewise.
* regrename.c (scan_rtx): Likewise.
* resource.c (mark_referenced_resources): Likewise.
(mark_set_resources): Likewise.
* rtlanal.c (rtx_unstable_p): Likewise.
(rtx_varies_p): Likewise.
(count_occurrences): Likewise.
(reg_mentioned_p): Likewise.
(modified_between_p): Likewise.
(modified_in_p): Likewise.
(volatile_insn_p): Likewise.
(volatile_refs_p): Likewise.
(side_effects_p): Likewise.
(may_trap_p_1): Likewise.
(inequality_comparisons_p): Likewise.
(computed_jump_p_1): Likewise.
(commutative_operand_precedence): Likewise.
* sched-deps.c (sched_analyze_2): Likewise.
* sched-vis.c (print_value): Likewise.
* reload.c (operands_match_p): Likewise.
(subst_reg_equivs): Likewise.
* reload1.c (eliminate_regs_1): Likewise.
(elimination_effects): Likewise.
(scan_paradoxical_subregs): Likewise.
* alias.c (rtx_equal_for_memref_p): Likewise.
* Makefile.in (RTL_BASE_H): Add fixed-value.h.
* emit-rtl.c (const_fixed_htab): New hash table.
(const_fixed_htab_hash, const_fixed_htab_eq, lookup_const_fixed):
Declare.
(const_fixed_htab_hash, const_fixed_htab_eq, lookup_const_fixed,
const_fixed_from_fixed_value): New functions.
(verify_rtx_sharing): Handle CONST_FIXED.
(copy_rtx_if_shared_1): Likewise.
(reset_used_flags): Likewise.
(set_used_flags): Likewise.
(copy_insn_1): Likewise.
(init_emit_once): Create const_fixed_htab.
Store fixed-point scalar and vector zero and one to const_tiny_rtx.
From-SVN: r127725
Diffstat (limited to 'gcc/doc')
-rw-r--r-- | gcc/doc/rtl.texi | 76 |
1 files changed, 70 insertions, 6 deletions
diff --git a/gcc/doc/rtl.texi b/gcc/doc/rtl.texi index 247a22e..83fa089 100644 --- a/gcc/doc/rtl.texi +++ b/gcc/doc/rtl.texi @@ -1492,6 +1492,15 @@ bits but small enough to fit within twice that number of bits (GCC does not provide a mechanism to represent even larger constants). In the latter case, @var{m} will be @code{VOIDmode}. +@findex const_fixed +@item (const_fixed:@var{m} @var{addr}) +Represents a fixed-point constant of mode @var{m}. +The data structure, which contains data with the size of two +@code{HOST_BITS_PER_WIDE_INT} and the associated fixed-point mode, +is access with the macro @code{CONST_FIXED_VALUE}. The high part of data +is accessed with @code{CONST_FIXED_VALUE_HIGH}; the low part is accessed +with @code{CONST_FIXED_VALUE_LOW}. + @findex const_vector @item (const_vector:@var{m} [@var{x0} @var{x1} @dots{}]) Represents a vector constant. The square brackets stand for the vector @@ -2013,24 +2022,35 @@ still known. @findex neg @findex ss_neg +@findex us_neg @cindex negation @cindex negation with signed saturation +@cindex negation with unsigned saturation @item (neg:@var{m} @var{x}) @itemx (ss_neg:@var{m} @var{x}) +@itemx (us_neg:@var{m} @var{x}) These two expressions represent the negation (subtraction from zero) of the value represented by @var{x}, carried out in mode @var{m}. They differ in the behavior on overflow of integer modes. In the case of @code{neg}, the negation of the operand may be a number not representable in mode @var{m}, in which case it is truncated to @var{m}. @code{ss_neg} -ensures that an out-of-bounds result saturates to the maximum or minimum -representable value. +and @code{us_neg} ensure that an out-of-bounds result saturates to the +maximum or minimum signed or unsigned value. @findex mult +@findex ss_mult +@findex us_mult @cindex multiplication @cindex product +@cindex multiplication with signed saturation +@cindex multiplication with unsigned saturation @item (mult:@var{m} @var{x} @var{y}) +@itemx (ss_mult:@var{m} @var{x} @var{y}) +@itemx (us_mult:@var{m} @var{x} @var{y}) Represents the signed product of the values represented by @var{x} and @var{y} carried out in machine mode @var{m}. +@code{ss_mult} and @code{us_mult} ensure that an out-of-bounds result +saturates to the maximum or minimum signed or unsigned value. Some machines support a multiplication that generates a product wider than the operands. Write the pattern for this as @@ -2046,14 +2066,19 @@ For unsigned widening multiplication, use the same idiom, but with @code{zero_extend} instead of @code{sign_extend}. @findex div +@findex ss_div @cindex division @cindex signed division +@cindex signed division with signed saturation @cindex quotient @item (div:@var{m} @var{x} @var{y}) +@itemx (ss_div:@var{m} @var{x} @var{y}) Represents the quotient in signed division of @var{x} by @var{y}, carried out in machine mode @var{m}. If @var{m} is a floating point mode, it represents the exact quotient; otherwise, the integerized quotient. +@code{ss_div} ensures that an out-of-bounds result saturates to the maximum +or minimum signed value. Some machines have division instructions in which the operands and quotient widths are not all the same; you should represent @@ -2065,9 +2090,13 @@ such instructions using @code{truncate} and @code{sign_extend} as in, @findex udiv @cindex unsigned division +@cindex unsigned division with unsigned saturation @cindex division @item (udiv:@var{m} @var{x} @var{y}) +@itemx (us_div:@var{m} @var{x} @var{y}) Like @code{div} but represents unsigned division. +@code{us_div} ensures that an out-of-bounds result saturates to the maximum +or minimum unsigned value. @findex mod @findex umod @@ -2131,18 +2160,21 @@ fixed-point mode. @findex ashift @findex ss_ashift +@findex us_ashift @cindex left shift @cindex shift @cindex arithmetic shift @cindex arithmetic shift with signed saturation +@cindex arithmetic shift with unsigned saturation @item (ashift:@var{m} @var{x} @var{c}) @itemx (ss_ashift:@var{m} @var{x} @var{c}) -These two expressions represent the result of arithmetically shifting @var{x} +@itemx (us_ashift:@var{m} @var{x} @var{c}) +These three expressions represent the result of arithmetically shifting @var{x} left by @var{c} places. They differ in their behavior on overflow of integer modes. An @code{ashift} operation is a plain shift with no special behavior -in case of a change in the sign bit; @code{ss_ashift} saturates to the minimum -or maximum representable value if any of the bits shifted out differs from the -final sign bit. +in case of a change in the sign bit; @code{ss_ashift} and @code{us_ashift} +saturates to the minimum or maximum representable value if any of the bits +shifted out differs from the final sign bit. @var{x} have mode @var{m}, a fixed-point machine mode. @var{c} be a fixed-point mode or be a constant with mode @code{VOIDmode}; which @@ -2529,6 +2561,38 @@ When @var{m} is a floating point mode, represents the result of converting floating point value @var{x} (valid for mode @var{m}) to an integer, still represented in floating point mode @var{m}, by rounding towards zero. + +@findex fract_convert +@item (fract_convert:@var{m} @var{x}) +Represents the result of converting fixed-point value @var{x} to +fixed-point mode @var{m}, signed integer value @var{x} to +fixed-point mode @var{m}, floating-point value @var{x} to +fixed-point mode @var{m}, fixed-point value @var{x} to integer mode @var{m} +regarded as signed, or fixed-point value @var{x} to floating-point mode @var{m}. +When overflows or underflows happen, the results are undefined. + +@findex sat_fract +@item (sat_fract:@var{m} @var{x}) +Represents the result of converting fixed-point value @var{x} to +fixed-point mode @var{m}, signed integer value @var{x} to +fixed-point mode @var{m}, or floating-point value @var{x} to +fixed-point mode @var{m}. +When overflows or underflows happen, the results are saturated to the +maximum or the minimum. + +@findex unsigned_fract_convert +@item (unsigned_fract_convert:@var{m} @var{x}) +Represents the result of converting fixed-point value @var{x} to +integer mode @var{m} regarded as unsigned, or unsigned integer value @var{x} to +fixed-point mode @var{m}. +When overflows or underflows happen, the results are undefined. + +@findex unsigned_sat_fract +@item (unsigned_sat_fract:@var{m} @var{x}) +Represents the result of converting unsigned integer value @var{x} to +fixed-point mode @var{m}. +When overflows or underflows happen, the results are saturated to the +maximum or the minimum. @end table @node RTL Declarations |