1 1.1 mrg /* Predicates for TI C6X 2 1.10 mrg Copyright (C) 2010-2022 Free Software Foundation, Inc. 3 1.1 mrg Contributed by Andrew Jenner <andrew (at) codesourcery.com> 4 1.1 mrg Contributed by Bernd Schmidt <bernds (at) codesourcery.com> 5 1.1 mrg 6 1.1 mrg This file is part of GCC. 7 1.1 mrg 8 1.1 mrg GCC is free software; you can redistribute it and/or modify it 9 1.1 mrg under the terms of the GNU General Public License as published 10 1.1 mrg by the Free Software Foundation; either version 3, or (at your 11 1.1 mrg option) any later version. 12 1.1 mrg 13 1.1 mrg GCC is distributed in the hope that it will be useful, but WITHOUT 14 1.1 mrg ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 15 1.1 mrg or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public 16 1.1 mrg License for more details. 17 1.1 mrg 18 1.1 mrg You should have received a copy of the GNU General Public License 19 1.1 mrg along with GCC; see the file COPYING3. If not see 20 1.1 mrg <http://www.gnu.org/licenses/>. */ 21 1.1 mrg 22 1.1 mrg (define_predicate "reg_or_const_int_operand" 23 1.1 mrg (ior (match_operand 0 "register_operand") 24 1.1 mrg (match_operand 0 "const_int_operand"))) 25 1.1 mrg 26 1.1 mrg (define_predicate "const_vector_operand" 27 1.1 mrg (match_code "const_vector")) 28 1.1 mrg 29 1.1 mrg (define_predicate "scst5_operand" 30 1.1 mrg (and (match_operand 0 "const_int_operand") 31 1.1 mrg (match_test "satisfies_constraint_Is5 (op)"))) 32 1.1 mrg 33 1.1 mrg (define_predicate "reg_or_ucst4_operand" 34 1.1 mrg (ior (match_operand 0 "register_operand") 35 1.1 mrg (and (match_operand 0 "const_int_operand") 36 1.1 mrg (match_test "satisfies_constraint_Iu4 (op)")))) 37 1.1 mrg 38 1.1 mrg (define_predicate "reg_or_scst5_operand" 39 1.1 mrg (ior (match_operand 0 "register_operand") 40 1.1 mrg (match_operand 0 "scst5_operand"))) 41 1.1 mrg 42 1.1 mrg (define_predicate "reg_or_ucst5_operand" 43 1.1 mrg (ior (match_operand 0 "register_operand") 44 1.1 mrg (and (match_operand 0 "const_int_operand") 45 1.1 mrg (match_test "satisfies_constraint_Iu5 (op)")))) 46 1.1 mrg 47 1.1 mrg (define_predicate "addsi_operand" 48 1.1 mrg (ior (match_operand 0 "register_operand") 49 1.1 mrg (and (match_operand 0 "const_int_operand") 50 1.1 mrg (match_test "satisfies_constraint_IsB (op)")))) 51 1.1 mrg 52 1.1 mrg (define_predicate "andsi_operand" 53 1.1 mrg (ior (match_operand 0 "reg_or_scst5_operand") 54 1.1 mrg (and (match_operand 0 "const_int_operand") 55 1.1 mrg (match_test "satisfies_constraint_Jc (op)")))) 56 1.1 mrg 57 1.1 mrg (define_predicate "iorsi_operand" 58 1.1 mrg (ior (match_operand 0 "reg_or_scst5_operand") 59 1.1 mrg (and (match_operand 0 "const_int_operand") 60 1.1 mrg (match_test "satisfies_constraint_Js (op)")))) 61 1.1 mrg 62 1.1 mrg (define_predicate "insv_operand" 63 1.1 mrg (and (match_operand 0 "const_int_operand") 64 1.1 mrg (match_test "INTVAL (op) == 0 || INTVAL (op) == -1"))) 65 1.1 mrg 66 1.1 mrg (define_predicate "c6x_jump_operand" 67 1.1 mrg (match_code "label_ref,symbol_ref,reg")) 68 1.1 mrg 69 1.1 mrg (define_predicate "c6x_call_operand" 70 1.1 mrg (ior (match_code "symbol_ref,reg") 71 1.1 mrg (and (match_code "subreg") 72 1.1 mrg (match_test "GET_CODE (XEXP (op, 0)) == REG"))) 73 1.1 mrg { 74 1.1 mrg /* The linker transforms jumps to undefined weak symbols in a way that 75 1.1 mrg is incompatible with our code generation. */ 76 1.1 mrg return (GET_CODE (op) != SYMBOL_REF 77 1.1 mrg || (!SYMBOL_REF_WEAK (op) 78 1.1 mrg && !c6x_long_call_p (op))); 79 1.1 mrg }) 80 1.1 mrg 81 1.1 mrg ;; Returns 1 if OP is a symbolic operand, i.e. a symbol_ref or a label_ref, 82 1.1 mrg ;; possibly with an offset. 83 1.1 mrg (define_predicate "symbolic_operand" 84 1.1 mrg (ior (match_code "symbol_ref,label_ref") 85 1.1 mrg (and (match_code "const") 86 1.1 mrg (match_test "GET_CODE (XEXP (op,0)) == PLUS 87 1.1 mrg && (GET_CODE (XEXP (XEXP (op, 0), 0)) == SYMBOL_REF 88 1.1 mrg || GET_CODE (XEXP (XEXP (op, 0), 0)) == LABEL_REF) 89 1.1 mrg && GET_CODE (XEXP (XEXP (op, 0), 1)) == CONST_INT")))) 90 1.1 mrg 91 1.1 mrg (define_predicate "const_int_or_symbolic_operand" 92 1.1 mrg (ior (match_operand 0 "symbolic_operand") 93 1.1 mrg (match_operand 0 "const_int_operand"))) 94 1.1 mrg 95 1.1 mrg ;; Return nonzero iff OP is one of the integer constants 2, 4 or 8. 96 1.1 mrg (define_predicate "adda_scale_operand" 97 1.1 mrg (and (match_code "const_int") 98 1.1 mrg (match_test "INTVAL (op) == 2 || INTVAL (op) == 4 99 1.1 mrg || ((TARGET_INSNS_64 || TARGET_INSNS_67) 100 1.1 mrg && INTVAL (op) == 8)"))) 101 1.1 mrg 102 1.1 mrg ;; Return nonzero iff OP is one of the integer constants 2 or 4. 103 1.1 mrg (define_predicate "suba_scale_operand" 104 1.1 mrg (and (match_code "const_int") 105 1.1 mrg (match_test "INTVAL (op) == 2 || INTVAL (op) == 4"))) 106 1.1 mrg 107 1.1 mrg ;; True if this operator is valid for predication. 108 1.1 mrg (define_predicate "predicate_operator" 109 1.1 mrg (match_code "eq,ne")) 110 1.1 mrg 111 1.1 mrg (define_predicate "c6x_comparison_operator" 112 1.1 mrg (match_code "eq,ltu,gtu,lt,gt")) 113 1.1 mrg 114 1.1 mrg (define_predicate "non_c6x_comparison_operator" 115 1.1 mrg (match_code "ne,leu,geu,le,ge")) 116 1.1 mrg 117 1.1 mrg ;; FP Comparisons handled by c6x_expand_compare. 118 1.1 mrg (define_predicate "c6x_fp_comparison_operator" 119 1.1 mrg (ior (match_code "eq,lt,gt,le,ge") 120 1.1 mrg (and (match_test "TARGET_FP") 121 1.1 mrg (match_code "ltgt,uneq,unlt,ungt,unle,unge,ordered,unordered")))) 122 1.1 mrg 123 1.1 mrg (define_predicate "c6x_any_comparison_operand" 124 1.1 mrg (match_code "eq,lt,gt,le,ge,ltu,gtu") 125 1.1 mrg { 126 1.1 mrg rtx op0 = XEXP (op, 0); 127 1.1 mrg rtx op1 = XEXP (op, 1); 128 1.1 mrg if (ltugtu_operator (op, SImode) 129 1.1 mrg && register_operand (op0, SImode) 130 1.1 mrg && ((TARGET_INSNS_64 && reg_or_ucst5_operand (op1, SImode)) 131 1.1 mrg || (!TARGET_INSNS_64 && reg_or_ucst4_operand (op1, SImode)))) 132 1.1 mrg return true; 133 1.1 mrg if (eqltgt_operator (op, SImode) 134 1.1 mrg && register_operand (op0, SImode) 135 1.1 mrg && reg_or_scst5_operand (op1, SImode)) 136 1.1 mrg return true; 137 1.1 mrg if (!TARGET_FP) 138 1.1 mrg return false; 139 1.1 mrg if (!eqltgt_operator (op, SFmode) && !eqltgt_operator (op, DFmode)) 140 1.1 mrg return false; 141 1.1 mrg if (register_operand (op0, GET_MODE (op)) 142 1.1 mrg && register_operand (op1, GET_MODE (op))) 143 1.1 mrg return true; 144 1.1 mrg return false; 145 1.1 mrg }) 146 1.1 mrg 147 1.1 mrg (define_predicate "ltugtu_operator" 148 1.1 mrg (match_code "ltu,gtu")) 149 1.1 mrg 150 1.1 mrg (define_predicate "eqltgt_operator" 151 1.1 mrg (match_code "eq,lt,gt")) 152 1.1 mrg 153 1.1 mrg (define_predicate "eqne_operator" 154 1.1 mrg (match_code "eq,ne")) 155 1.1 mrg 156 1.1 mrg (define_predicate "predicate_register" 157 1.1 mrg (and (match_code "reg") 158 1.1 mrg (ior (match_test "REGNO_REG_CLASS (REGNO (op)) == PREDICATE_A_REGS") 159 1.1 mrg (match_test "REGNO_REG_CLASS (REGNO (op)) == PREDICATE_B_REGS")))) 160 1.1 mrg 161 1.1 mrg ;; Allow const_ints for things like the real_mult patterns. 162 1.1 mrg (define_predicate "a_register" 163 1.1 mrg (ior (and (match_code "reg") 164 1.1 mrg (match_test "A_REGNO_P (REGNO (op))")) 165 1.1 mrg (and (match_code "const_int") 166 1.1 mrg (match_test "A_REGNO_P (INTVAL (op))")))) 167 1.1 mrg 168 1.1 mrg (define_predicate "b_register" 169 1.1 mrg (ior (and (match_code "reg") 170 1.1 mrg (match_test "B_REGNO_P (REGNO (op))")) 171 1.1 mrg (and (match_code "const_int") 172 1.1 mrg (match_test "B_REGNO_P (INTVAL (op))")))) 173 1.1 mrg 174 1.1 mrg (define_predicate "pic_register_operand" 175 1.1 mrg (and (match_code "reg") 176 1.1 mrg (match_test "op == pic_offset_table_rtx"))) 177 1.1 mrg 178 1.1 mrg ;; True if OP refers to a symbol in the sdata section. 179 1.1 mrg (define_predicate "sdata_symbolic_operand" 180 1.1 mrg (match_code "symbol_ref,const") 181 1.1 mrg { 182 1.1 mrg HOST_WIDE_INT offset = 0, size = 0; 183 1.1 mrg tree t; 184 1.1 mrg 185 1.1 mrg switch (GET_CODE (op)) 186 1.1 mrg { 187 1.1 mrg case CONST: 188 1.1 mrg op = XEXP (op, 0); 189 1.1 mrg if (GET_CODE (op) != PLUS 190 1.1 mrg || GET_CODE (XEXP (op, 0)) != SYMBOL_REF 191 1.1 mrg || GET_CODE (XEXP (op, 1)) != CONST_INT) 192 1.1 mrg return false; 193 1.1 mrg offset = INTVAL (XEXP (op, 1)); 194 1.1 mrg op = XEXP (op, 0); 195 1.1 mrg /* FALLTHRU */ 196 1.1 mrg 197 1.1 mrg case SYMBOL_REF: 198 1.1 mrg /* For shared libraries, only allow symbols we know are local. 199 1.1 mrg For executables, the linker knows to create copy relocs if 200 1.1 mrg necessary so we can use DP-relative addressing for all small 201 1.1 mrg objects. */ 202 1.1 mrg if ((c6x_initial_flag_pic && !SYMBOL_REF_LOCAL_P (op)) 203 1.1 mrg || !SYMBOL_REF_SMALL_P (op)) 204 1.1 mrg return false; 205 1.1 mrg 206 1.1 mrg /* Note that in addition to DECLs, we can get various forms 207 1.1 mrg of constants here. */ 208 1.1 mrg t = SYMBOL_REF_DECL (op); 209 1.1 mrg if (DECL_P (t)) 210 1.1 mrg t = DECL_SIZE_UNIT (t); 211 1.1 mrg else 212 1.1 mrg t = TYPE_SIZE_UNIT (TREE_TYPE (t)); 213 1.3 mrg if (t && tree_fits_shwi_p (t)) 214 1.1 mrg { 215 1.3 mrg size = tree_to_shwi (t); 216 1.1 mrg if (size < 0) 217 1.1 mrg size = 0; 218 1.1 mrg } 219 1.1 mrg 220 1.1 mrg /* Don't allow addressing outside the object. */ 221 1.1 mrg return (offset >= 0 && offset <= size); 222 1.1 mrg 223 1.1 mrg default: 224 1.1 mrg gcc_unreachable (); 225 1.1 mrg } 226 1.1 mrg }) 227