/* Register Transfer Language (RTL) definitions for GCC Copyright (C) 1987-2023 Free Software Foundation, Inc. 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 . */ #ifndef GCC_RTL_H #define GCC_RTL_H /* This file is occasionally included by generator files which expect machmode.h and other files to exist and would not normally have been included by coretypes.h. */ #ifdef GENERATOR_FILE #include "real.h" #include "fixed-value.h" #include "statistics.h" #include "vec.h" #include "hash-table.h" #include "hash-set.h" #include "input.h" #include "is-a.h" #endif /* GENERATOR_FILE */ #include "hard-reg-set.h" class predefined_function_abi; /* Value used by some passes to "recognize" noop moves as valid instructions. */ #define NOOP_MOVE_INSN_CODE INT_MAX /* Register Transfer Language EXPRESSIONS CODES */ #define RTX_CODE enum rtx_code enum rtx_code { #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) ENUM , #include "rtl.def" /* rtl expressions are documented here */ #undef DEF_RTL_EXPR LAST_AND_UNUSED_RTX_CODE}; /* A convenient way to get a value for NUM_RTX_CODE. Assumes default enum value assignment. */ /* The cast here, saves many elsewhere. */ #define NUM_RTX_CODE ((int) LAST_AND_UNUSED_RTX_CODE) /* Similar, but since generator files get more entries... */ #ifdef GENERATOR_FILE # define NON_GENERATOR_NUM_RTX_CODE ((int) MATCH_OPERAND) #endif /* Register Transfer Language EXPRESSIONS CODE CLASSES */ enum rtx_class { /* We check bit 0-1 of some rtx class codes in the predicates below. */ /* Bit 0 = comparison if 0, arithmetic is 1 Bit 1 = 1 if commutative. */ RTX_COMPARE, /* 0 */ RTX_COMM_COMPARE, RTX_BIN_ARITH, RTX_COMM_ARITH, /* Must follow the four preceding values. */ RTX_UNARY, /* 4 */ RTX_EXTRA, RTX_MATCH, RTX_INSN, /* Bit 0 = 1 if constant. */ RTX_OBJ, /* 8 */ RTX_CONST_OBJ, RTX_TERNARY, RTX_BITFIELD_OPS, RTX_AUTOINC }; #define RTX_OBJ_MASK (~1) #define RTX_OBJ_RESULT (RTX_OBJ & RTX_OBJ_MASK) #define RTX_COMPARE_MASK (~1) #define RTX_COMPARE_RESULT (RTX_COMPARE & RTX_COMPARE_MASK) #define RTX_ARITHMETIC_MASK (~1) #define RTX_ARITHMETIC_RESULT (RTX_COMM_ARITH & RTX_ARITHMETIC_MASK) #define RTX_BINARY_MASK (~3) #define RTX_BINARY_RESULT (RTX_COMPARE & RTX_BINARY_MASK) #define RTX_COMMUTATIVE_MASK (~2) #define RTX_COMMUTATIVE_RESULT (RTX_COMM_COMPARE & RTX_COMMUTATIVE_MASK) #define RTX_NON_COMMUTATIVE_RESULT (RTX_COMPARE & RTX_COMMUTATIVE_MASK) extern const unsigned char rtx_length[NUM_RTX_CODE]; #define GET_RTX_LENGTH(CODE) (rtx_length[(int) (CODE)]) extern const char * const rtx_name[NUM_RTX_CODE]; #define GET_RTX_NAME(CODE) (rtx_name[(int) (CODE)]) extern const char * const rtx_format[NUM_RTX_CODE]; #define GET_RTX_FORMAT(CODE) (rtx_format[(int) (CODE)]) extern const enum rtx_class rtx_class[NUM_RTX_CODE]; #define GET_RTX_CLASS(CODE) (rtx_class[(int) (CODE)]) /* True if CODE is part of the insn chain (i.e. has INSN_UID, PREV_INSN and NEXT_INSN fields). */ #define INSN_CHAIN_CODE_P(CODE) IN_RANGE (CODE, DEBUG_INSN, NOTE) extern const unsigned char rtx_code_size[NUM_RTX_CODE]; extern const unsigned char rtx_next[NUM_RTX_CODE];