Mercurial > hg > CbC > CbC_gcc
diff gcc/config/tilegx/tilegx-multiply.h @ 111:04ced10e8804
gcc 7
author | kono |
---|---|
date | Fri, 27 Oct 2017 22:46:09 +0900 |
parents | |
children | 84e7813d76e9 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gcc/config/tilegx/tilegx-multiply.h Fri Oct 27 22:46:09 2017 +0900 @@ -0,0 +1,78 @@ +/* Header for constant multiple table for TILE-Gx. + Copyright (C) 2011-2017 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 */