2007-08-07 01:18:57 +02:00
|
|
|
/* Fixed-point arithmetic support.
|
2022-01-03 10:42:10 +01:00
|
|
|
Copyright (C) 2006-2022 Free Software Foundation, Inc.
|
2007-08-07 01:18:57 +02:00
|
|
|
|
|
|
|
This file is part of GCC.
|
|
|
|
|
|
|
|
GCC is free software; you can redistribute it and/or modify it under
|
|
|
|
the terms of the GNU General Public License as published by the Free
|
|
|
|
Software Foundation; either version 3, or (at your option) any later
|
|
|
|
version.
|
|
|
|
|
|
|
|
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
|
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
|
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
|
|
for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with GCC; see the file COPYING3. If not see
|
|
|
|
<http://www.gnu.org/licenses/>. */
|
|
|
|
|
|
|
|
#ifndef GCC_FIXED_VALUE_H
|
|
|
|
#define GCC_FIXED_VALUE_H
|
|
|
|
|
2009-04-22 20:29:36 +02:00
|
|
|
struct GTY(()) fixed_value
|
2007-08-07 01:18:57 +02:00
|
|
|
{
|
2017-08-30 13:20:55 +02:00
|
|
|
double_int data; /* Store data up to 2 wide integers. */
|
|
|
|
scalar_mode_pod mode; /* Use machine mode to know IBIT and FBIT. */
|
2007-08-07 01:18:57 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
#define FIXED_VALUE_TYPE struct fixed_value
|
|
|
|
|
|
|
|
#define MAX_FCONST0 18 /* For storing 18 fixed-point zeros per
|
|
|
|
fract, ufract, accum, and uaccum modes . */
|
|
|
|
#define MAX_FCONST1 8 /* For storing 8 fixed-point ones per accum
|
|
|
|
and uaccum modes. */
|
|
|
|
/* Constant fixed-point values 0 and 1. */
|
|
|
|
extern FIXED_VALUE_TYPE fconst0[MAX_FCONST0];
|
|
|
|
extern FIXED_VALUE_TYPE fconst1[MAX_FCONST1];
|
|
|
|
|
|
|
|
/* Macros to access fconst0 and fconst1 via machine modes. */
|
|
|
|
#define FCONST0(mode) fconst0[mode - QQmode]
|
|
|
|
#define FCONST1(mode) fconst1[mode - HAmode]
|
|
|
|
|
|
|
|
/* Return a CONST_FIXED with value R and mode M. */
|
|
|
|
#define CONST_FIXED_FROM_FIXED_VALUE(r, m) \
|
|
|
|
const_fixed_from_fixed_value (r, m)
|
decl.c, [...]: Remove redundant enum from machine_mode.
gcc/ada/
* gcc-interface/decl.c, gcc-interface/gigi.h, gcc-interface/misc.c,
gcc-interface/trans.c, gcc-interface/utils.c, gcc-interface/utils2.c:
Remove redundant enum from machine_mode.
gcc/c-family/
* c-common.c, c-common.h, c-cppbuiltin.c, c-lex.c: Remove redundant
enum from machine_mode.
gcc/c/
* c-decl.c, c-tree.h, c-typeck.c: Remove redundant enum from
machine_mode.
gcc/cp/
* constexpr.c: Remove redundant enum from machine_mode.
gcc/fortran/
* trans-types.c, trans-types.h: Remove redundant enum from
machine_mode.
gcc/go/
* go-lang.c: Remove redundant enum from machine_mode.
gcc/java/
* builtins.c, java-tree.h, typeck.c: Remove redundant enum from
machine_mode.
gcc/lto/
* lto-lang.c: Remove redundant enum from machine_mode.
gcc/
* addresses.h, alias.c, asan.c, auto-inc-dec.c, bt-load.c, builtins.c,
builtins.h, caller-save.c, calls.c, calls.h, cfgexpand.c, cfgloop.h,
cfgrtl.c, combine.c, compare-elim.c, config/aarch64/aarch64-builtins.c,
config/aarch64/aarch64-protos.h, config/aarch64/aarch64-simd.md,
config/aarch64/aarch64.c, config/aarch64/aarch64.h,
config/aarch64/aarch64.md, config/alpha/alpha-protos.h,
config/alpha/alpha.c, config/arc/arc-protos.h, config/arc/arc.c,
config/arc/arc.h, config/arc/predicates.md,
config/arm/aarch-common-protos.h, config/arm/aarch-common.c,
config/arm/arm-protos.h, config/arm/arm.c, config/arm/arm.h,
config/arm/arm.md, config/arm/neon.md, config/arm/thumb2.md,
config/avr/avr-log.c, config/avr/avr-protos.h, config/avr/avr.c,
config/avr/avr.md, config/bfin/bfin-protos.h, config/bfin/bfin.c,
config/c6x/c6x-protos.h, config/c6x/c6x.c, config/c6x/c6x.md,
config/cr16/cr16-protos.h, config/cr16/cr16.c,
config/cris/cris-protos.h, config/cris/cris.c, config/cris/cris.md,
config/darwin-protos.h, config/darwin.c,
config/epiphany/epiphany-protos.h, config/epiphany/epiphany.c,
config/epiphany/epiphany.md, config/fr30/fr30.c,
config/frv/frv-protos.h, config/frv/frv.c, config/frv/predicates.md,
config/h8300/h8300-protos.h, config/h8300/h8300.c,
config/i386/i386-builtin-types.awk, config/i386/i386-protos.h,
config/i386/i386.c, config/i386/i386.md, config/i386/predicates.md,
config/i386/sse.md, config/i386/sync.md, config/ia64/ia64-protos.h,
config/ia64/ia64.c, config/iq2000/iq2000-protos.h,
config/iq2000/iq2000.c, config/iq2000/iq2000.md,
config/lm32/lm32-protos.h, config/lm32/lm32.c,
config/m32c/m32c-protos.h, config/m32c/m32c.c,
config/m32r/m32r-protos.h, config/m32r/m32r.c,
config/m68k/m68k-protos.h, config/m68k/m68k.c,
config/mcore/mcore-protos.h, config/mcore/mcore.c,
config/mcore/mcore.md, config/mep/mep-protos.h, config/mep/mep.c,
config/microblaze/microblaze-protos.h, config/microblaze/microblaze.c,
config/mips/mips-protos.h, config/mips/mips.c,
config/mmix/mmix-protos.h, config/mmix/mmix.c,
config/mn10300/mn10300-protos.h, config/mn10300/mn10300.c,
config/moxie/moxie.c, config/msp430/msp430-protos.h,
config/msp430/msp430.c, config/nds32/nds32-cost.c,
config/nds32/nds32-intrinsic.c, config/nds32/nds32-md-auxiliary.c,
config/nds32/nds32-protos.h, config/nds32/nds32.c,
config/nios2/nios2-protos.h, config/nios2/nios2.c,
config/pa/pa-protos.h, config/pa/pa.c, config/pdp11/pdp11-protos.h,
config/pdp11/pdp11.c, config/rl78/rl78-protos.h, config/rl78/rl78.c,
config/rs6000/altivec.md, config/rs6000/rs6000-c.c,
config/rs6000/rs6000-protos.h, config/rs6000/rs6000.c,
config/rs6000/rs6000.h, config/rx/rx-protos.h, config/rx/rx.c,
config/s390/predicates.md, config/s390/s390-protos.h,
config/s390/s390.c, config/s390/s390.h, config/s390/s390.md,
config/sh/predicates.md, config/sh/sh-protos.h, config/sh/sh.c,
config/sh/sh.md, config/sparc/predicates.md,
config/sparc/sparc-protos.h, config/sparc/sparc.c,
config/sparc/sparc.md, config/spu/spu-protos.h, config/spu/spu.c,
config/stormy16/stormy16-protos.h, config/stormy16/stormy16.c,
config/tilegx/tilegx-protos.h, config/tilegx/tilegx.c,
config/tilegx/tilegx.md, config/tilepro/tilepro-protos.h,
config/tilepro/tilepro.c, config/v850/v850-protos.h,
config/v850/v850.c, config/v850/v850.md, config/vax/vax-protos.h,
config/vax/vax.c, config/vms/vms-c.c, config/xtensa/xtensa-protos.h,
config/xtensa/xtensa.c, coverage.c, cprop.c, cse.c, cselib.c, cselib.h,
dbxout.c, ddg.c, df-problems.c, dfp.c, dfp.h, doc/md.texi,
doc/rtl.texi, doc/tm.texi, doc/tm.texi.in, dojump.c, dse.c,
dwarf2cfi.c, dwarf2out.c, dwarf2out.h, emit-rtl.c, emit-rtl.h,
except.c, explow.c, expmed.c, expmed.h, expr.c, expr.h, final.c,
fixed-value.c, fixed-value.h, fold-const.c, function.c, function.h,
fwprop.c, gcse.c, gengenrtl.c, genmodes.c, genopinit.c, genoutput.c,
genpreds.c, genrecog.c, gensupport.c, gimple-ssa-strength-reduction.c,
graphite-clast-to-gimple.c, haifa-sched.c, hooks.c, hooks.h, ifcvt.c,
internal-fn.c, ira-build.c, ira-color.c, ira-conflicts.c, ira-costs.c,
ira-emit.c, ira-int.h, ira-lives.c, ira.c, ira.h, jump.c, langhooks.h,
libfuncs.h, lists.c, loop-doloop.c, loop-invariant.c, loop-iv.c,
loop-unroll.c, lower-subreg.c, lower-subreg.h, lra-assigns.c,
lra-constraints.c, lra-eliminations.c, lra-int.h, lra-lives.c,
lra-spills.c, lra.c, lra.h, machmode.h, omp-low.c, optabs.c, optabs.h,
output.h, postreload.c, print-tree.c, read-rtl.c, real.c, real.h,
recog.c, recog.h, ree.c, reg-stack.c, regcprop.c, reginfo.c,
regrename.c, regs.h, reload.c, reload.h, reload1.c, rtl.c, rtl.h,
rtlanal.c, rtlhash.c, rtlhooks-def.h, rtlhooks.c, sched-deps.c,
sel-sched-dump.c, sel-sched-ir.c, sel-sched-ir.h, sel-sched.c,
simplify-rtx.c, stmt.c, stor-layout.c, stor-layout.h, target.def,
targhooks.c, targhooks.h, tree-affine.c, tree-call-cdce.c,
tree-complex.c, tree-data-ref.c, tree-dfa.c, tree-if-conv.c,
tree-inline.c, tree-outof-ssa.c, tree-scalar-evolution.c,
tree-ssa-address.c, tree-ssa-ccp.c, tree-ssa-loop-ivopts.c,
tree-ssa-loop-ivopts.h, tree-ssa-loop-manip.c,
tree-ssa-loop-prefetch.c, tree-ssa-math-opts.c, tree-ssa-reassoc.c,
tree-ssa-sccvn.c, tree-streamer-in.c, tree-switch-conversion.c,
tree-vect-data-refs.c, tree-vect-generic.c, tree-vect-loop.c,
tree-vect-patterns.c, tree-vect-slp.c, tree-vect-stmts.c,
tree-vrp.c, tree.c, tree.h, tsan.c, ubsan.c, valtrack.c,
var-tracking.c, varasm.c: Remove redundant enum from
machine_mode.
gcc/
* gengtype.c (main): Treat machine_mode as a scalar typedef.
* genmodes.c (emit_insn_modes_h): Hide inline functions if
USED_FOR_TARGET.
From-SVN: r216834
2014-10-29 13:02:45 +01:00
|
|
|
extern rtx const_fixed_from_fixed_value (FIXED_VALUE_TYPE, machine_mode);
|
2007-08-07 01:18:57 +02:00
|
|
|
|
2013-01-30 12:04:30 +01:00
|
|
|
/* Construct a FIXED_VALUE from a bit payload and machine mode MODE.
|
2013-02-08 14:23:34 +01:00
|
|
|
The bits in PAYLOAD are sign-extended/zero-extended according to MODE. */
|
2017-08-30 13:19:47 +02:00
|
|
|
extern FIXED_VALUE_TYPE fixed_from_double_int (double_int, scalar_mode);
|
2013-01-30 12:04:30 +01:00
|
|
|
|
|
|
|
/* Return a CONST_FIXED from a bit payload and machine mode MODE.
|
2013-02-08 14:23:34 +01:00
|
|
|
The bits in PAYLOAD are sign-extended/zero-extended according to MODE. */
|
2013-01-30 12:04:30 +01:00
|
|
|
static inline rtx
|
|
|
|
const_fixed_from_double_int (double_int payload,
|
2017-08-30 13:19:47 +02:00
|
|
|
scalar_mode mode)
|
2013-01-30 12:04:30 +01:00
|
|
|
{
|
|
|
|
return
|
|
|
|
const_fixed_from_fixed_value (fixed_from_double_int (payload, mode),
|
|
|
|
mode);
|
|
|
|
}
|
|
|
|
|
2007-08-07 01:18:57 +02:00
|
|
|
/* Initialize from a decimal or hexadecimal string. */
|
|
|
|
extern void fixed_from_string (FIXED_VALUE_TYPE *, const char *,
|
2017-08-30 13:19:47 +02:00
|
|
|
scalar_mode);
|
2007-08-07 01:18:57 +02:00
|
|
|
|
2022-01-14 16:57:02 +01:00
|
|
|
/* In tree.cc: wrap up a FIXED_VALUE_TYPE in a tree node. */
|
2007-08-07 01:18:57 +02:00
|
|
|
extern tree build_fixed (tree, FIXED_VALUE_TYPE);
|
|
|
|
|
|
|
|
/* Extend or truncate to a new mode. */
|
2017-08-30 13:19:47 +02:00
|
|
|
extern bool fixed_convert (FIXED_VALUE_TYPE *, scalar_mode,
|
2007-08-07 01:18:57 +02:00
|
|
|
const FIXED_VALUE_TYPE *, bool);
|
|
|
|
|
|
|
|
/* Convert to a fixed-point mode from an integer. */
|
2017-08-30 13:19:47 +02:00
|
|
|
extern bool fixed_convert_from_int (FIXED_VALUE_TYPE *, scalar_mode,
|
2007-08-07 01:18:57 +02:00
|
|
|
double_int, bool, bool);
|
|
|
|
|
|
|
|
/* Convert to a fixed-point mode from a real. */
|
2017-08-30 13:19:47 +02:00
|
|
|
extern bool fixed_convert_from_real (FIXED_VALUE_TYPE *, scalar_mode,
|
2007-08-07 01:18:57 +02:00
|
|
|
const REAL_VALUE_TYPE *, bool);
|
|
|
|
|
|
|
|
/* Convert to a real mode from a fixed-point. */
|
2017-08-30 13:19:47 +02:00
|
|
|
extern void real_convert_from_fixed (REAL_VALUE_TYPE *, scalar_mode,
|
2007-08-07 01:18:57 +02:00
|
|
|
const FIXED_VALUE_TYPE *);
|
|
|
|
|
|
|
|
/* Compare two fixed-point objects for bitwise identity. */
|
|
|
|
extern bool fixed_identical (const FIXED_VALUE_TYPE *, const FIXED_VALUE_TYPE *);
|
|
|
|
|
|
|
|
/* Calculate a hash value. */
|
|
|
|
extern unsigned int fixed_hash (const FIXED_VALUE_TYPE *);
|
|
|
|
|
|
|
|
#define FIXED_VALUES_IDENTICAL(x, y) fixed_identical (&(x), &(y))
|
|
|
|
|
|
|
|
/* Determine whether a fixed-point value X is negative. */
|
|
|
|
#define FIXED_VALUE_NEGATIVE(x) fixed_isneg (&(x))
|
|
|
|
|
|
|
|
/* Render F as a decimal floating point constant. */
|
|
|
|
extern void fixed_to_decimal (char *str, const FIXED_VALUE_TYPE *, size_t);
|
|
|
|
|
|
|
|
/* Binary or unary arithmetic on tree_code. */
|
|
|
|
extern bool fixed_arithmetic (FIXED_VALUE_TYPE *, int, const FIXED_VALUE_TYPE *,
|
|
|
|
const FIXED_VALUE_TYPE *, bool);
|
|
|
|
|
|
|
|
/* Compare fixed-point values by tree_code. */
|
|
|
|
extern bool fixed_compare (int, const FIXED_VALUE_TYPE *,
|
|
|
|
const FIXED_VALUE_TYPE *);
|
|
|
|
|
|
|
|
/* Determine whether a fixed-point value X is negative. */
|
|
|
|
extern bool fixed_isneg (const FIXED_VALUE_TYPE *);
|
|
|
|
|
|
|
|
#endif /* GCC_FIXED_VALUE_H */
|