diff options
Diffstat (limited to 'gcc-4.9/gcc/config/tilegx/tilegx-multiply.h')
-rw-r--r-- | gcc-4.9/gcc/config/tilegx/tilegx-multiply.h | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/config/tilegx/tilegx-multiply.h b/gcc-4.9/gcc/config/tilegx/tilegx-multiply.h new file mode 100644 index 000000000..b59d6b36e --- /dev/null +++ b/gcc-4.9/gcc/config/tilegx/tilegx-multiply.h @@ -0,0 +1,78 @@ +/* Header for constant multiple table for TILE-Gx. + Copyright (C) 2011-2014 Free Software Foundation, Inc. + Contributed by Walter Lee (walt@tilera.com) + + 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_TILEGX_MULTIPLY_H +#define GCC_TILEGX_MULTIPLY_H + +/* A node of a tilegx_multiply_insn_seq, corresponding to a single + machine instruction such as 'add', 's1a', or an shl by a constant. */ +struct tilegx_multiply_insn_seq_entry +{ + /* Which operation this node performs (e.g. an add or sub). + Don't use this directly, call get_opcode() table to get a insn_code. */ + unsigned char compressed_opcode; + + /* The left-hand side of this expression tree. + If equal to 0, it refers to 'zero'. + If equal to 1, it refers to the original input to the multiply operation. + Otherwise, subtract two and it is an index into the containing + tilegx_multiply_insn_seq's 'op' array. Since it can only point to some + value that has already been computed it will always point to an + earlier entry in the array. */ + unsigned char lhs; + + /* This is like lhs, but for the right-hand side. However, for shift + opcodes this is a shift count rather than an operand index. */ + unsigned char rhs; +}; + +/* Maximum size of op array. */ +#define tilegx_multiply_insn_seq_MAX_OPERATIONS 4 + +/* This defines a DAG describing how to multiply by a constant in + terms of one or more machine instructions. */ +struct tilegx_multiply_insn_seq +{ + /* The constant factor by which this expression tree multiplies its input. */ + long long multiplier; + + /* The nodes of the parse tree. These are ordered so that instructions + can be emitted in the same order that they appear in this array. + Entry entry in this array can only refer to earlier entries in + the array. */ + struct tilegx_multiply_insn_seq_entry + op[tilegx_multiply_insn_seq_MAX_OPERATIONS]; + +}; + +/* A mapping from the compressed opcode to the corresponding enum + insn_code. */ +extern const enum insn_code tilegx_multiply_insn_seq_decode_opcode[]; + +/* Table mapping constant int multipliers to an expression + tree that efficiently performs that multiplication. + This is sorted by its 'multiplier' field so a binary search + can look for matches. */ +extern const struct tilegx_multiply_insn_seq tilegx_multiply_insn_seq_table[]; + +/* The number of elements in multiply_insn_seq_table. */ +extern const int tilegx_multiply_insn_seq_table_size; + +#endif /* !GCC_TILEGX_MULTIPLY_H */ |