You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
921 lines
22 KiB
C++
921 lines
22 KiB
C++
/* Generated automatically by the program 'build/genpreds'
|
|
from the machine description file '/home/seti/riscv-gnu-toolchain/gcc/gcc/config/riscv/riscv.md'. */
|
|
|
|
#define IN_TARGET_CODE 1
|
|
#include "config.h"
|
|
#include "system.h"
|
|
#include "coretypes.h"
|
|
#include "backend.h"
|
|
#include "predict.h"
|
|
#include "tree.h"
|
|
#include "rtl.h"
|
|
#include "alias.h"
|
|
#include "varasm.h"
|
|
#include "stor-layout.h"
|
|
#include "calls.h"
|
|
#include "memmodel.h"
|
|
#include "tm_p.h"
|
|
#include "insn-config.h"
|
|
#include "recog.h"
|
|
#include "output.h"
|
|
#include "flags.h"
|
|
#include "df.h"
|
|
#include "resource.h"
|
|
#include "diagnostic-core.h"
|
|
#include "reload.h"
|
|
#include "regs.h"
|
|
#include "emit-rtl.h"
|
|
#include "tm-constrs.h"
|
|
#include "target.h"
|
|
|
|
bool
|
|
const_arith_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
|
|
{
|
|
return (GET_CODE (op) == CONST_INT) && (
|
|
#line 24 "/home/seti/riscv-gnu-toolchain/gcc/gcc/config/riscv/predicates.md"
|
|
(SMALL_OPERAND (INTVAL (op))));
|
|
}
|
|
|
|
bool
|
|
arith_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
|
|
{
|
|
return (const_arith_operand (op, mode)) || (register_operand (op, mode));
|
|
}
|
|
|
|
bool
|
|
lui_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
|
|
{
|
|
return (GET_CODE (op) == CONST_INT) && (
|
|
#line 32 "/home/seti/riscv-gnu-toolchain/gcc/gcc/config/riscv/predicates.md"
|
|
(LUI_OPERAND (INTVAL (op))));
|
|
}
|
|
|
|
bool
|
|
sfb_alu_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
|
|
{
|
|
return (arith_operand (op, mode)) || (lui_operand (op, mode));
|
|
}
|
|
|
|
bool
|
|
const_csr_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
|
|
{
|
|
return (GET_CODE (op) == CONST_INT) && (
|
|
#line 40 "/home/seti/riscv-gnu-toolchain/gcc/gcc/config/riscv/predicates.md"
|
|
(IN_RANGE (INTVAL (op), 0, 31)));
|
|
}
|
|
|
|
bool
|
|
csr_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
|
|
{
|
|
return (const_csr_operand (op, mode)) || (register_operand (op, mode));
|
|
}
|
|
|
|
bool
|
|
sle_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
|
|
{
|
|
return (GET_CODE (op) == CONST_INT) && (
|
|
#line 48 "/home/seti/riscv-gnu-toolchain/gcc/gcc/config/riscv/predicates.md"
|
|
(SMALL_OPERAND (INTVAL (op) + 1)));
|
|
}
|
|
|
|
bool
|
|
sleu_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
|
|
{
|
|
return (sle_operand (op, mode)) && (
|
|
#line 52 "/home/seti/riscv-gnu-toolchain/gcc/gcc/config/riscv/predicates.md"
|
|
(INTVAL (op) + 1 != 0));
|
|
}
|
|
|
|
bool
|
|
const_0_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
|
|
{
|
|
switch (GET_CODE (op))
|
|
{
|
|
case CONST_INT:
|
|
case CONST_WIDE_INT:
|
|
case CONST_DOUBLE:
|
|
case CONST_VECTOR:
|
|
break;
|
|
default:
|
|
return false;
|
|
}
|
|
return (
|
|
#line 56 "/home/seti/riscv-gnu-toolchain/gcc/gcc/config/riscv/predicates.md"
|
|
(op == CONST0_RTX (GET_MODE (op)))) && (
|
|
(mode == VOIDmode || GET_MODE (op) == mode || GET_MODE (op) == VOIDmode));
|
|
}
|
|
|
|
bool
|
|
reg_or_0_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
|
|
{
|
|
return (const_0_operand (op, mode)) || (register_operand (op, mode));
|
|
}
|
|
|
|
bool
|
|
branch_on_bit_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
|
|
{
|
|
return (GET_CODE (op) == CONST_INT) && (
|
|
#line 65 "/home/seti/riscv-gnu-toolchain/gcc/gcc/config/riscv/predicates.md"
|
|
(INTVAL (op) >= IMM_BITS - 1));
|
|
}
|
|
|
|
static inline bool
|
|
splittable_const_int_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
|
|
#line 71 "/home/seti/riscv-gnu-toolchain/gcc/gcc/config/riscv/predicates.md"
|
|
{
|
|
/* Don't handle multi-word moves this way; we don't want to introduce
|
|
the individual word-mode moves until after reload. */
|
|
if (GET_MODE_SIZE (mode) > UNITS_PER_WORD)
|
|
return false;
|
|
|
|
/* Check whether the constant can be loaded in a single
|
|
instruction with zbs extensions. */
|
|
if (TARGET_64BIT && TARGET_ZBS && SINGLE_BIT_MASK_OPERAND (INTVAL (op)))
|
|
return false;
|
|
|
|
/* Otherwise check whether the constant can be loaded in a single
|
|
instruction. */
|
|
return !LUI_OPERAND (INTVAL (op)) && !SMALL_OPERAND (INTVAL (op));
|
|
}
|
|
|
|
bool
|
|
splittable_const_int_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
|
|
{
|
|
return (GET_CODE (op) == CONST_INT) && (
|
|
(splittable_const_int_operand_1 (op, mode)));
|
|
}
|
|
|
|
static inline bool
|
|
p2m1_shift_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
|
|
#line 89 "/home/seti/riscv-gnu-toolchain/gcc/gcc/config/riscv/predicates.md"
|
|
{
|
|
int val = exact_log2 (INTVAL (op) + 1);
|
|
if (val < 12)
|
|
return false;
|
|
return true;
|
|
}
|
|
|
|
bool
|
|
p2m1_shift_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
|
|
{
|
|
return (GET_CODE (op) == CONST_INT) && (
|
|
(p2m1_shift_operand_1 (op, mode)));
|
|
}
|
|
|
|
static inline bool
|
|
high_mask_shift_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
|
|
#line 98 "/home/seti/riscv-gnu-toolchain/gcc/gcc/config/riscv/predicates.md"
|
|
{
|
|
int val1 = clz_hwi (~ INTVAL (op));
|
|
int val0 = ctz_hwi (INTVAL (op));
|
|
if ((val0 + val1 == BITS_PER_WORD)
|
|
&& val0 > 31 && val0 < 64)
|
|
return true;
|
|
return false;
|
|
}
|
|
|
|
bool
|
|
high_mask_shift_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
|
|
{
|
|
return (GET_CODE (op) == CONST_INT) && (
|
|
(high_mask_shift_operand_1 (op, mode)));
|
|
}
|
|
|
|
static inline bool
|
|
move_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
|
|
#line 109 "/home/seti/riscv-gnu-toolchain/gcc/gcc/config/riscv/predicates.md"
|
|
{
|
|
enum riscv_symbol_type symbol_type;
|
|
|
|
/* The thinking here is as follows:
|
|
|
|
(1) The move expanders should split complex load sequences into
|
|
individual instructions. Those individual instructions can
|
|
then be optimized by all rtl passes.
|
|
|
|
(2) The target of pre-reload load sequences should not be used
|
|
to store temporary results. If the target register is only
|
|
assigned one value, reload can rematerialize that value
|
|
on demand, rather than spill it to the stack.
|
|
|
|
(3) If we allowed pre-reload passes like combine and cse to recreate
|
|
complex load sequences, we would want to be able to split the
|
|
sequences before reload as well, so that the pre-reload scheduler
|
|
can see the individual instructions. This falls foul of (2);
|
|
the splitter would be forced to reuse the target register for
|
|
intermediate results.
|
|
|
|
(4) We want to define complex load splitters for combine. These
|
|
splitters can request a temporary scratch register, which avoids
|
|
the problem in (2). They allow things like:
|
|
|
|
(set (reg T1) (high SYM))
|
|
(set (reg T2) (low (reg T1) SYM))
|
|
(set (reg X) (plus (reg T2) (const_int OFFSET)))
|
|
|
|
to be combined into:
|
|
|
|
(set (reg T3) (high SYM+OFFSET))
|
|
(set (reg X) (lo_sum (reg T3) SYM+OFFSET))
|
|
|
|
if T2 is only used this once. */
|
|
switch (GET_CODE (op))
|
|
{
|
|
case CONST_INT:
|
|
return !splittable_const_int_operand (op, mode);
|
|
|
|
case CONST:
|
|
case SYMBOL_REF:
|
|
case LABEL_REF:
|
|
return riscv_symbolic_constant_p (op, &symbol_type)
|
|
&& !riscv_split_symbol_type (symbol_type);
|
|
|
|
case HIGH:
|
|
op = XEXP (op, 0);
|
|
return riscv_symbolic_constant_p (op, &symbol_type)
|
|
&& riscv_split_symbol_type (symbol_type)
|
|
&& symbol_type != SYMBOL_PCREL;
|
|
|
|
default:
|
|
return true;
|
|
}
|
|
}
|
|
|
|
bool
|
|
move_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
|
|
{
|
|
return (general_operand (op, mode)) && (
|
|
(move_operand_1 (op, mode)));
|
|
}
|
|
|
|
static inline bool
|
|
symbolic_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
|
|
#line 168 "/home/seti/riscv-gnu-toolchain/gcc/gcc/config/riscv/predicates.md"
|
|
{
|
|
enum riscv_symbol_type type;
|
|
return riscv_symbolic_constant_p (op, &type);
|
|
}
|
|
|
|
bool
|
|
symbolic_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
|
|
{
|
|
switch (GET_CODE (op))
|
|
{
|
|
case CONST:
|
|
case SYMBOL_REF:
|
|
case LABEL_REF:
|
|
break;
|
|
default:
|
|
return false;
|
|
}
|
|
return (
|
|
(symbolic_operand_1 (op, mode))) && (
|
|
(mode == VOIDmode || GET_MODE (op) == mode || GET_MODE (op) == VOIDmode));
|
|
}
|
|
|
|
static inline bool
|
|
absolute_symbolic_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
|
|
#line 175 "/home/seti/riscv-gnu-toolchain/gcc/gcc/config/riscv/predicates.md"
|
|
{
|
|
enum riscv_symbol_type type;
|
|
return (riscv_symbolic_constant_p (op, &type)
|
|
&& (type == SYMBOL_ABSOLUTE || type == SYMBOL_PCREL));
|
|
}
|
|
|
|
bool
|
|
absolute_symbolic_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
|
|
{
|
|
switch (GET_CODE (op))
|
|
{
|
|
case CONST:
|
|
case SYMBOL_REF:
|
|
case LABEL_REF:
|
|
break;
|
|
default:
|
|
return false;
|
|
}
|
|
return (
|
|
(absolute_symbolic_operand_1 (op, mode))) && (
|
|
(mode == VOIDmode || GET_MODE (op) == mode || GET_MODE (op) == VOIDmode));
|
|
}
|
|
|
|
static inline bool
|
|
plt_symbolic_operand_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
|
|
#line 183 "/home/seti/riscv-gnu-toolchain/gcc/gcc/config/riscv/predicates.md"
|
|
{
|
|
enum riscv_symbol_type type;
|
|
return (riscv_symbolic_constant_p (op, &type)
|
|
&& type == SYMBOL_GOT_DISP && !SYMBOL_REF_WEAK (op) && TARGET_PLT);
|
|
}
|
|
|
|
bool
|
|
plt_symbolic_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
|
|
{
|
|
switch (GET_CODE (op))
|
|
{
|
|
case CONST:
|
|
case SYMBOL_REF:
|
|
case LABEL_REF:
|
|
break;
|
|
default:
|
|
return false;
|
|
}
|
|
return (
|
|
(plt_symbolic_operand_1 (op, mode))) && (
|
|
(mode == VOIDmode || GET_MODE (op) == mode || GET_MODE (op) == VOIDmode));
|
|
}
|
|
|
|
bool
|
|
call_insn_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
|
|
{
|
|
return (absolute_symbolic_operand (op, mode)) || ((plt_symbolic_operand (op, mode)) || (register_operand (op, mode)));
|
|
}
|
|
|
|
bool
|
|
modular_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
|
|
{
|
|
switch (GET_CODE (op))
|
|
{
|
|
case PLUS:
|
|
case MINUS:
|
|
case MULT:
|
|
case ASHIFT:
|
|
break;
|
|
default:
|
|
return false;
|
|
}
|
|
return
|
|
(mode == VOIDmode || GET_MODE (op) == mode);
|
|
}
|
|
|
|
bool
|
|
equality_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
|
|
{
|
|
switch (GET_CODE (op))
|
|
{
|
|
case EQ:
|
|
case NE:
|
|
break;
|
|
default:
|
|
return false;
|
|
}
|
|
return
|
|
(mode == VOIDmode || GET_MODE (op) == mode);
|
|
}
|
|
|
|
bool
|
|
order_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
|
|
{
|
|
switch (GET_CODE (op))
|
|
{
|
|
case EQ:
|
|
case NE:
|
|
case LT:
|
|
case LTU:
|
|
case LE:
|
|
case LEU:
|
|
case GE:
|
|
case GEU:
|
|
case GT:
|
|
case GTU:
|
|
break;
|
|
default:
|
|
return false;
|
|
}
|
|
return
|
|
(mode == VOIDmode || GET_MODE (op) == mode);
|
|
}
|
|
|
|
bool
|
|
signed_order_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
|
|
{
|
|
switch (GET_CODE (op))
|
|
{
|
|
case EQ:
|
|
case NE:
|
|
case LT:
|
|
case LE:
|
|
case GE:
|
|
case GT:
|
|
break;
|
|
default:
|
|
return false;
|
|
}
|
|
return
|
|
(mode == VOIDmode || GET_MODE (op) == mode);
|
|
}
|
|
|
|
bool
|
|
subreg_lowpart_operator (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
|
|
{
|
|
return ((GET_CODE (op) == TRUNCATE) || ((GET_CODE (op) == SUBREG) && (
|
|
#line 209 "/home/seti/riscv-gnu-toolchain/gcc/gcc/config/riscv/predicates.md"
|
|
(subreg_lowpart_p (op))))) && (
|
|
(mode == VOIDmode || GET_MODE (op) == mode));
|
|
}
|
|
|
|
bool
|
|
fp_native_comparison (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
|
|
{
|
|
switch (GET_CODE (op))
|
|
{
|
|
case EQ:
|
|
case LT:
|
|
case LE:
|
|
case GT:
|
|
case GE:
|
|
break;
|
|
default:
|
|
return false;
|
|
}
|
|
return
|
|
(mode == VOIDmode || GET_MODE (op) == mode);
|
|
}
|
|
|
|
bool
|
|
fp_scc_comparison (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
|
|
{
|
|
switch (GET_CODE (op))
|
|
{
|
|
case UNORDERED:
|
|
case ORDERED:
|
|
case UNLT:
|
|
case UNGE:
|
|
case UNLE:
|
|
case UNGT:
|
|
case LTGT:
|
|
case NE:
|
|
case EQ:
|
|
case LT:
|
|
case LE:
|
|
case GT:
|
|
case GE:
|
|
break;
|
|
default:
|
|
return false;
|
|
}
|
|
return
|
|
(mode == VOIDmode || GET_MODE (op) == mode);
|
|
}
|
|
|
|
bool
|
|
fp_branch_comparison (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
|
|
{
|
|
switch (GET_CODE (op))
|
|
{
|
|
case UNORDERED:
|
|
case ORDERED:
|
|
case UNLT:
|
|
case UNGE:
|
|
case UNLE:
|
|
case UNGT:
|
|
case UNEQ:
|
|
case LTGT:
|
|
case NE:
|
|
case EQ:
|
|
case LT:
|
|
case LE:
|
|
case GT:
|
|
case GE:
|
|
break;
|
|
default:
|
|
return false;
|
|
}
|
|
return
|
|
(mode == VOIDmode || GET_MODE (op) == mode);
|
|
}
|
|
|
|
static inline bool
|
|
gpr_save_operation_1 (rtx op ATTRIBUTE_UNUSED, machine_mode mode ATTRIBUTE_UNUSED)
|
|
#line 222 "/home/seti/riscv-gnu-toolchain/gcc/gcc/config/riscv/predicates.md"
|
|
{
|
|
return riscv_gpr_save_operation_p (op);
|
|
}
|
|
|
|
bool
|
|
gpr_save_operation (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
|
|
{
|
|
return (GET_CODE (op) == PARALLEL) && (
|
|
(gpr_save_operation_1 (op, mode)));
|
|
}
|
|
|
|
bool
|
|
single_bit_mask_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
|
|
{
|
|
return (GET_CODE (op) == CONST_INT) && (
|
|
#line 229 "/home/seti/riscv-gnu-toolchain/gcc/gcc/config/riscv/predicates.md"
|
|
(pow2p_hwi (INTVAL (op))));
|
|
}
|
|
|
|
bool
|
|
not_single_bit_mask_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
|
|
{
|
|
return (GET_CODE (op) == CONST_INT) && (
|
|
#line 233 "/home/seti/riscv-gnu-toolchain/gcc/gcc/config/riscv/predicates.md"
|
|
(pow2p_hwi (~INTVAL (op))));
|
|
}
|
|
|
|
bool
|
|
const31_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
|
|
{
|
|
return (GET_CODE (op) == CONST_INT) && (
|
|
#line 237 "/home/seti/riscv-gnu-toolchain/gcc/gcc/config/riscv/predicates.md"
|
|
(INTVAL (op) == 31));
|
|
}
|
|
|
|
bool
|
|
const63_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
|
|
{
|
|
return (GET_CODE (op) == CONST_INT) && (
|
|
#line 241 "/home/seti/riscv-gnu-toolchain/gcc/gcc/config/riscv/predicates.md"
|
|
(INTVAL (op) == 63));
|
|
}
|
|
|
|
enum constraint_num
|
|
lookup_constraint_1 (const char *str)
|
|
{
|
|
switch (str[0])
|
|
{
|
|
case '<':
|
|
return CONSTRAINT__l;
|
|
case '>':
|
|
return CONSTRAINT__g;
|
|
case 'A':
|
|
return CONSTRAINT_A;
|
|
case 'E':
|
|
return CONSTRAINT_E;
|
|
case 'F':
|
|
return CONSTRAINT_F;
|
|
case 'G':
|
|
return CONSTRAINT_G;
|
|
case 'I':
|
|
return CONSTRAINT_I;
|
|
case 'J':
|
|
return CONSTRAINT_J;
|
|
case 'K':
|
|
return CONSTRAINT_K;
|
|
case 'L':
|
|
return CONSTRAINT_L;
|
|
case 'S':
|
|
return CONSTRAINT_S;
|
|
case 'T':
|
|
return CONSTRAINT_T;
|
|
case 'U':
|
|
return CONSTRAINT_U;
|
|
case 'V':
|
|
return CONSTRAINT_V;
|
|
case 'X':
|
|
return CONSTRAINT_X;
|
|
case 'f':
|
|
return CONSTRAINT_f;
|
|
case 'i':
|
|
return CONSTRAINT_i;
|
|
case 'j':
|
|
return CONSTRAINT_j;
|
|
case 'l':
|
|
return CONSTRAINT_l;
|
|
case 'm':
|
|
return CONSTRAINT_m;
|
|
case 'n':
|
|
return CONSTRAINT_n;
|
|
case 'o':
|
|
return CONSTRAINT_o;
|
|
case 'p':
|
|
return CONSTRAINT_p;
|
|
case 'r':
|
|
return CONSTRAINT_r;
|
|
case 's':
|
|
return CONSTRAINT_s;
|
|
default: break;
|
|
}
|
|
return CONSTRAINT__UNKNOWN;
|
|
}
|
|
|
|
const unsigned char lookup_constraint_array[] = {
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
MIN ((int) CONSTRAINT__l, (int) UCHAR_MAX),
|
|
CONSTRAINT__UNKNOWN,
|
|
MIN ((int) CONSTRAINT__g, (int) UCHAR_MAX),
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
MIN ((int) CONSTRAINT_A, (int) UCHAR_MAX),
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
MIN ((int) CONSTRAINT_E, (int) UCHAR_MAX),
|
|
MIN ((int) CONSTRAINT_F, (int) UCHAR_MAX),
|
|
MIN ((int) CONSTRAINT_G, (int) UCHAR_MAX),
|
|
CONSTRAINT__UNKNOWN,
|
|
MIN ((int) CONSTRAINT_I, (int) UCHAR_MAX),
|
|
MIN ((int) CONSTRAINT_J, (int) UCHAR_MAX),
|
|
MIN ((int) CONSTRAINT_K, (int) UCHAR_MAX),
|
|
MIN ((int) CONSTRAINT_L, (int) UCHAR_MAX),
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
MIN ((int) CONSTRAINT_S, (int) UCHAR_MAX),
|
|
MIN ((int) CONSTRAINT_T, (int) UCHAR_MAX),
|
|
MIN ((int) CONSTRAINT_U, (int) UCHAR_MAX),
|
|
MIN ((int) CONSTRAINT_V, (int) UCHAR_MAX),
|
|
CONSTRAINT__UNKNOWN,
|
|
MIN ((int) CONSTRAINT_X, (int) UCHAR_MAX),
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
MIN ((int) CONSTRAINT_f, (int) UCHAR_MAX),
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
MIN ((int) CONSTRAINT_i, (int) UCHAR_MAX),
|
|
MIN ((int) CONSTRAINT_j, (int) UCHAR_MAX),
|
|
CONSTRAINT__UNKNOWN,
|
|
MIN ((int) CONSTRAINT_l, (int) UCHAR_MAX),
|
|
MIN ((int) CONSTRAINT_m, (int) UCHAR_MAX),
|
|
MIN ((int) CONSTRAINT_n, (int) UCHAR_MAX),
|
|
MIN ((int) CONSTRAINT_o, (int) UCHAR_MAX),
|
|
MIN ((int) CONSTRAINT_p, (int) UCHAR_MAX),
|
|
CONSTRAINT__UNKNOWN,
|
|
MIN ((int) CONSTRAINT_r, (int) UCHAR_MAX),
|
|
MIN ((int) CONSTRAINT_s, (int) UCHAR_MAX),
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN,
|
|
CONSTRAINT__UNKNOWN
|
|
};
|
|
|
|
enum reg_class
|
|
reg_class_for_constraint_1 (enum constraint_num c)
|
|
{
|
|
switch (c)
|
|
{
|
|
case CONSTRAINT_r: return GENERAL_REGS;
|
|
case CONSTRAINT_f: return TARGET_HARD_FLOAT ? FP_REGS : NO_REGS;
|
|
case CONSTRAINT_j: return SIBCALL_REGS;
|
|
case CONSTRAINT_l: return JALR_REGS;
|
|
default: break;
|
|
}
|
|
return NO_REGS;
|
|
}
|
|
|
|
bool (*constraint_satisfied_p_array[]) (rtx) = {
|
|
satisfies_constraint_I,
|
|
satisfies_constraint_J,
|
|
satisfies_constraint_K,
|
|
satisfies_constraint_L,
|
|
satisfies_constraint_m,
|
|
satisfies_constraint_o,
|
|
satisfies_constraint_A,
|
|
satisfies_constraint_p,
|
|
satisfies_constraint_G,
|
|
satisfies_constraint_S,
|
|
satisfies_constraint_U,
|
|
satisfies_constraint_V,
|
|
satisfies_constraint__l,
|
|
satisfies_constraint__g,
|
|
satisfies_constraint_i,
|
|
satisfies_constraint_s,
|
|
satisfies_constraint_n,
|
|
satisfies_constraint_E,
|
|
satisfies_constraint_F,
|
|
satisfies_constraint_X,
|
|
satisfies_constraint_T
|
|
};
|
|
|
|
bool
|
|
insn_const_int_ok_for_constraint (HOST_WIDE_INT ival, enum constraint_num c)
|
|
{
|
|
switch (c)
|
|
{
|
|
case CONSTRAINT_I:
|
|
return
|
|
#line 40 "/home/seti/riscv-gnu-toolchain/gcc/gcc/config/riscv/constraints.md"
|
|
(SMALL_OPERAND (ival));
|
|
|
|
case CONSTRAINT_J:
|
|
return
|
|
#line 45 "/home/seti/riscv-gnu-toolchain/gcc/gcc/config/riscv/constraints.md"
|
|
(ival == 0);
|
|
|
|
case CONSTRAINT_K:
|
|
return
|
|
#line 50 "/home/seti/riscv-gnu-toolchain/gcc/gcc/config/riscv/constraints.md"
|
|
(IN_RANGE (ival, 0, 31));
|
|
|
|
case CONSTRAINT_L:
|
|
return
|
|
#line 55 "/home/seti/riscv-gnu-toolchain/gcc/gcc/config/riscv/constraints.md"
|
|
(LUI_OPERAND (ival));
|
|
|
|
default: break;
|
|
}
|
|
return false;
|
|
}
|
|
|