1 1.1 mrg /* Auxiliary functions for pipeline descriptions pattern of Andes 2 1.1 mrg NDS32 cpu for GNU compiler 3 1.1 mrg Copyright (C) 2012-2022 Free Software Foundation, Inc. 4 1.1 mrg Contributed by Andes Technology Corporation. 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 /* ------------------------------------------------------------------------ */ 23 1.1 mrg 24 1.1 mrg #define IN_TARGET_CODE 1 25 1.1 mrg 26 1.1 mrg #include "config.h" 27 1.1 mrg #include "system.h" 28 1.1 mrg #include "coretypes.h" 29 1.1 mrg #include "backend.h" 30 1.1 mrg #include "rtl.h" 31 1.1 mrg #include "insn-attr.h" 32 1.1 mrg #include "insn-codes.h" 33 1.1 mrg #include "target.h" 34 1.1 mrg 35 1.1 mrg #include "nds32-protos.h" 36 1.1 mrg 37 1.1 mrg /* ------------------------------------------------------------------------ */ 38 1.1 mrg 39 1.1 mrg namespace nds32 { 40 1.1 mrg namespace scheduling { 41 1.1 mrg 42 1.1 mrg /* Classify the memory access direction. It's unknown if the offset register 43 1.1 mrg is not a constant value. */ 44 1.1 mrg enum memory_access_direction 45 1.1 mrg { 46 1.1 mrg MEM_ACCESS_DIR_POS, 47 1.1 mrg MEM_ACCESS_DIR_NEG, 48 1.1 mrg MEM_ACCESS_DIR_UNKNOWN 49 1.1 mrg }; 50 1.1 mrg 51 1.1 mrg /* A safe wrapper to the function reg_overlap_mentioned_p (). */ 52 1.1 mrg bool 53 1.1 mrg reg_overlap_p (rtx x, rtx in) 54 1.1 mrg { 55 1.1 mrg if (x == NULL_RTX || in == NULL_RTX) 56 1.1 mrg return false; 57 1.1 mrg 58 1.1 mrg return static_cast <bool> (reg_overlap_mentioned_p (x, in)); 59 1.1 mrg } 60 1.1 mrg 61 1.1 mrg 62 1.1 mrg /* Determine the memory access direction of a load/store insn. */ 63 1.1 mrg memory_access_direction 64 1.1 mrg determine_access_direction (rtx_insn *insn) 65 1.1 mrg { 66 1.1 mrg int post_update_rtx_index; 67 1.1 mrg rtx plus_rtx; 68 1.1 mrg rtx mem_rtx; 69 1.1 mrg rtx offset_rtx; 70 1.1 mrg 71 1.1 mrg switch (get_attr_type (insn)) 72 1.1 mrg { 73 1.1 mrg case TYPE_LOAD_MULTIPLE: 74 1.1 mrg gcc_assert (parallel_elements (insn) >= 2); 75 1.1 mrg 76 1.1 mrg post_update_rtx_index = find_post_update_rtx (insn); 77 1.1 mrg if (post_update_rtx_index != -1) 78 1.1 mrg plus_rtx = SET_SRC (parallel_element (insn, post_update_rtx_index)); 79 1.1 mrg else 80 1.1 mrg { 81 1.1 mrg /* (parallel 82 1.1 mrg [(set (reg) (mem (reg))) : index 0 83 1.1 mrg (set (reg) (mem (plus (reg) (...)))) : index 1 84 1.1 mrg ...]) */ 85 1.1 mrg mem_rtx = SET_SRC (parallel_element (insn, 1)); 86 1.1 mrg if (GET_CODE (mem_rtx) == UNSPEC) 87 1.1 mrg mem_rtx = XVECEXP (mem_rtx, 0, 0); 88 1.1 mrg gcc_assert (MEM_P (mem_rtx)); 89 1.1 mrg plus_rtx = XEXP (mem_rtx, 0); 90 1.1 mrg } 91 1.1 mrg break; 92 1.1 mrg 93 1.1 mrg case TYPE_STORE_MULTIPLE: 94 1.1 mrg gcc_assert (parallel_elements (insn) >= 2); 95 1.1 mrg 96 1.1 mrg post_update_rtx_index = find_post_update_rtx (insn); 97 1.1 mrg if (post_update_rtx_index != -1) 98 1.1 mrg plus_rtx = SET_SRC (parallel_element (insn, post_update_rtx_index)); 99 1.1 mrg else 100 1.1 mrg { 101 1.1 mrg /* (parallel 102 1.1 mrg [(set (mem (reg)) (reg)) : index 0 103 1.1 mrg (set (mem (plus (reg) (...))) (reg)) : index 1 104 1.1 mrg ...]) */ 105 1.1 mrg mem_rtx = SET_DEST (parallel_element (insn, 1)); 106 1.1 mrg if (GET_CODE (mem_rtx) == UNSPEC) 107 1.1 mrg mem_rtx = XVECEXP (mem_rtx, 0, 0); 108 1.1 mrg gcc_assert (MEM_P (mem_rtx)); 109 1.1 mrg plus_rtx = XEXP (mem_rtx, 0); 110 1.1 mrg } 111 1.1 mrg break; 112 1.1 mrg 113 1.1 mrg case TYPE_LOAD: 114 1.1 mrg case TYPE_STORE: 115 1.1 mrg mem_rtx = extract_mem_rtx (insn); 116 1.1 mrg 117 1.1 mrg switch (GET_CODE (XEXP (mem_rtx, 0))) 118 1.1 mrg { 119 1.1 mrg case POST_INC: 120 1.1 mrg /* (mem (post_inc (...))) */ 121 1.1 mrg return MEM_ACCESS_DIR_POS; 122 1.1 mrg 123 1.1 mrg case POST_DEC: 124 1.1 mrg /* (mem (post_dec (...))) */ 125 1.1 mrg return MEM_ACCESS_DIR_NEG; 126 1.1 mrg 127 1.1 mrg case PLUS: 128 1.1 mrg /* (mem (plus (reg) (...))) */ 129 1.1 mrg plus_rtx = XEXP (mem_rtx, 0); 130 1.1 mrg break; 131 1.1 mrg 132 1.1 mrg case POST_MODIFY: 133 1.1 mrg /* (mem (post_modify (reg) (plus (reg) (...)))) */ 134 1.1 mrg plus_rtx = XEXP (XEXP (mem_rtx, 0), 1); 135 1.1 mrg break; 136 1.1 mrg 137 1.1 mrg default: 138 1.1 mrg gcc_unreachable (); 139 1.1 mrg } 140 1.1 mrg break; 141 1.1 mrg 142 1.1 mrg default: 143 1.1 mrg gcc_unreachable (); 144 1.1 mrg } 145 1.1 mrg 146 1.1 mrg gcc_assert (GET_CODE (plus_rtx) == PLUS); 147 1.1 mrg 148 1.1 mrg offset_rtx = XEXP (plus_rtx, 1); 149 1.1 mrg if (GET_CODE (offset_rtx) == CONST_INT) 150 1.1 mrg { 151 1.1 mrg if (INTVAL (offset_rtx) < 0) 152 1.1 mrg return MEM_ACCESS_DIR_NEG; 153 1.1 mrg else 154 1.1 mrg return MEM_ACCESS_DIR_POS; 155 1.1 mrg } 156 1.1 mrg 157 1.1 mrg return MEM_ACCESS_DIR_UNKNOWN; 158 1.1 mrg } 159 1.1 mrg 160 1.1 mrg /* Return the nth load/store operation in the real micro-operation 161 1.1 mrg accessing order. */ 162 1.1 mrg rtx 163 1.1 mrg extract_nth_access_rtx (rtx_insn *insn, int n) 164 1.1 mrg { 165 1.1 mrg int n_elems = parallel_elements (insn); 166 1.1 mrg int post_update_rtx_index = find_post_update_rtx (insn); 167 1.1 mrg memory_access_direction direction = determine_access_direction (insn); 168 1.1 mrg 169 1.1 mrg gcc_assert (direction != MEM_ACCESS_DIR_UNKNOWN); 170 1.1 mrg 171 1.1 mrg /* Reverse the order if the direction negative. */ 172 1.1 mrg if (direction == MEM_ACCESS_DIR_NEG) 173 1.1 mrg n = -1 * n - 1; 174 1.1 mrg 175 1.1 mrg if (post_update_rtx_index != -1) 176 1.1 mrg { 177 1.1 mrg if (n >= 0 && post_update_rtx_index <= n) 178 1.1 mrg ++n; 179 1.1 mrg else if (n < 0 && post_update_rtx_index >= n + n_elems) 180 1.1 mrg --n; 181 1.1 mrg } 182 1.1 mrg 183 1.1 mrg return parallel_element (insn, n); 184 1.1 mrg } 185 1.1 mrg 186 1.1 mrg /* Returns the register operated by the nth load/store operation in the real 187 1.1 mrg micro-operation accessing order. This function assumes INSN must be a 188 1.1 mrg multiple-word load/store insn. */ 189 1.1 mrg rtx 190 1.1 mrg extract_nth_lmsw_access_reg (rtx_insn *insn, int n) 191 1.1 mrg { 192 1.1 mrg rtx nth_rtx = extract_nth_access_rtx (insn, n); 193 1.1 mrg 194 1.1 mrg if (nth_rtx == NULL_RTX) 195 1.1 mrg return NULL_RTX; 196 1.1 mrg 197 1.1 mrg switch (get_attr_type (insn)) 198 1.1 mrg { 199 1.1 mrg case TYPE_LOAD_MULTIPLE: 200 1.1 mrg return SET_DEST (nth_rtx); 201 1.1 mrg 202 1.1 mrg case TYPE_STORE_MULTIPLE: 203 1.1 mrg return SET_SRC (nth_rtx); 204 1.1 mrg 205 1.1 mrg default: 206 1.1 mrg gcc_unreachable (); 207 1.1 mrg } 208 1.1 mrg } 209 1.1 mrg 210 1.1 mrg /* Returns the register operated by the nth load/store operation in the real 211 1.1 mrg micro-operation accessing order. This function assumes INSN must be a 212 1.1 mrg double-word load/store insn. */ 213 1.1 mrg rtx 214 1.1 mrg extract_nth_ls2_access_reg (rtx_insn *insn, int n) 215 1.1 mrg { 216 1.1 mrg rtx reg; 217 1.1 mrg machine_mode mode; 218 1.1 mrg 219 1.1 mrg if (post_update_insn_p (insn)) 220 1.1 mrg { 221 1.1 mrg memory_access_direction direction = determine_access_direction (insn); 222 1.1 mrg gcc_assert (direction != MEM_ACCESS_DIR_UNKNOWN); 223 1.1 mrg 224 1.1 mrg /* Reverse the order if the direction negative. */ 225 1.1 mrg if (direction == MEM_ACCESS_DIR_NEG) 226 1.1 mrg n = -1 * n - 1; 227 1.1 mrg } 228 1.1 mrg 229 1.1 mrg /* Handle the out-of-range case. */ 230 1.1 mrg if (n < -2 || n > 1) 231 1.1 mrg return NULL_RTX; 232 1.1 mrg 233 1.1 mrg /* Convert the index to a positive one. */ 234 1.1 mrg if (n < 0) 235 1.1 mrg n = 2 + n; 236 1.1 mrg 237 1.1 mrg switch (get_attr_type (insn)) 238 1.1 mrg { 239 1.1 mrg case TYPE_LOAD: 240 1.1 mrg reg = SET_DEST (PATTERN (insn)); 241 1.1 mrg break; 242 1.1 mrg 243 1.1 mrg case TYPE_STORE: 244 1.1 mrg reg = SET_SRC (PATTERN (insn)); 245 1.1 mrg break; 246 1.1 mrg 247 1.1 mrg default: 248 1.1 mrg gcc_unreachable (); 249 1.1 mrg } 250 1.1 mrg 251 1.1 mrg gcc_assert (REG_P (reg) || GET_CODE (reg) == SUBREG); 252 1.1 mrg 253 1.1 mrg switch (GET_MODE (reg)) 254 1.1 mrg { 255 1.1 mrg case E_DImode: 256 1.1 mrg mode = SImode; 257 1.1 mrg break; 258 1.1 mrg 259 1.1 mrg case E_DFmode: 260 1.1 mrg mode = SFmode; 261 1.1 mrg break; 262 1.1 mrg 263 1.1 mrg default: 264 1.1 mrg gcc_unreachable (); 265 1.1 mrg } 266 1.1 mrg 267 1.1 mrg if (n == 0) 268 1.1 mrg return gen_lowpart (mode, reg); 269 1.1 mrg else 270 1.1 mrg return gen_highpart (mode, reg); 271 1.1 mrg } 272 1.1 mrg 273 1.1 mrg /* Returns the register operated by the nth load/store operation in the real 274 1.1 mrg micro-operation accessing order. */ 275 1.1 mrg rtx 276 1.1 mrg extract_nth_access_reg (rtx_insn *insn, int index) 277 1.1 mrg { 278 1.1 mrg switch (GET_CODE (PATTERN (insn))) 279 1.1 mrg { 280 1.1 mrg case PARALLEL: 281 1.1 mrg return extract_nth_lmsw_access_reg (insn, index); 282 1.1 mrg 283 1.1 mrg case SET: 284 1.1 mrg return extract_nth_ls2_access_reg (insn, index); 285 1.1 mrg 286 1.1 mrg default: 287 1.1 mrg gcc_unreachable (); 288 1.1 mrg } 289 1.1 mrg } 290 1.1 mrg 291 1.1 mrg /* Determine if the latency is occured when the consumer PBSADA_INSN uses the 292 1.1 mrg value of DEF_REG in its Ra or Rb fields. */ 293 1.1 mrg bool 294 1.1 mrg pbsada_insn_ra_rb_dep_reg_p (rtx pbsada_insn, rtx def_reg) 295 1.1 mrg { 296 1.1 mrg rtx unspec_rtx = SET_SRC (PATTERN (pbsada_insn)); 297 1.1 mrg gcc_assert (GET_CODE (unspec_rtx) == UNSPEC); 298 1.1 mrg 299 1.1 mrg rtx pbsada_ra = XVECEXP (unspec_rtx, 0, 0); 300 1.1 mrg rtx pbsada_rb = XVECEXP (unspec_rtx, 0, 1); 301 1.1 mrg 302 1.1 mrg if (rtx_equal_p (def_reg, pbsada_ra) 303 1.1 mrg || rtx_equal_p (def_reg, pbsada_rb)) 304 1.1 mrg return true; 305 1.1 mrg 306 1.1 mrg return false; 307 1.1 mrg } 308 1.1 mrg 309 1.1 mrg /* Determine if the latency is occured when the consumer PBSADA_INSN uses the 310 1.1 mrg value of DEF_REG in its Rt field. */ 311 1.1 mrg bool 312 1.1 mrg pbsada_insn_rt_dep_reg_p (rtx pbsada_insn, rtx def_reg) 313 1.1 mrg { 314 1.1 mrg rtx pbsada_rt = SET_DEST (PATTERN (pbsada_insn)); 315 1.1 mrg 316 1.1 mrg if (rtx_equal_p (def_reg, pbsada_rt)) 317 1.1 mrg return true; 318 1.1 mrg 319 1.1 mrg return false; 320 1.1 mrg } 321 1.1 mrg 322 1.1 mrg /* Check if INSN is a movd44 insn consuming DEF_REG. */ 323 1.1 mrg bool 324 1.1 mrg movd44_even_dep_p (rtx_insn *insn, rtx def_reg) 325 1.1 mrg { 326 1.1 mrg if (!movd44_insn_p (insn)) 327 1.1 mrg return false; 328 1.1 mrg 329 1.1 mrg rtx use_rtx = SET_SRC (PATTERN (insn)); 330 1.1 mrg 331 1.1 mrg if (REG_P (def_reg)) 332 1.1 mrg { 333 1.1 mrg return rtx_equal_p (def_reg, use_rtx); 334 1.1 mrg } 335 1.1 mrg else if (GET_CODE (def_reg) == SUBREG 336 1.1 mrg && GET_MODE (def_reg) == SImode 337 1.1 mrg && rtx_equal_p (SUBREG_REG (def_reg), use_rtx)) 338 1.1 mrg { 339 1.1 mrg if (TARGET_BIG_ENDIAN && SUBREG_BYTE (def_reg) == 4) 340 1.1 mrg return true; 341 1.1 mrg 342 1.1 mrg if (!TARGET_BIG_ENDIAN && SUBREG_BYTE (def_reg) == 0) 343 1.1 mrg return true; 344 1.1 mrg 345 1.1 mrg return false; 346 1.1 mrg } 347 1.1 mrg 348 1.1 mrg return false; 349 1.1 mrg } 350 1.1 mrg 351 1.1 mrg /* Check if INSN is a wext insn consuming DEF_REG. */ 352 1.1 mrg bool 353 1.1 mrg wext_odd_dep_p (rtx insn, rtx def_reg) 354 1.1 mrg { 355 1.1 mrg rtx shift_rtx = XEXP (SET_SRC (PATTERN (insn)), 0); 356 1.1 mrg rtx use_reg = XEXP (shift_rtx, 0); 357 1.1 mrg rtx pos_rtx = XEXP (shift_rtx, 1); 358 1.1 mrg 359 1.1 mrg if (REG_P (pos_rtx) && reg_overlap_p (def_reg, pos_rtx)) 360 1.1 mrg return true; 361 1.1 mrg 362 1.1 mrg if (GET_MODE (def_reg) == DImode) 363 1.1 mrg return reg_overlap_p (def_reg, use_reg); 364 1.1 mrg 365 1.1 mrg gcc_assert (REG_P (def_reg) || GET_CODE (def_reg) == SUBREG); 366 1.1 mrg gcc_assert (REG_P (use_reg) || GET_CODE (use_reg) == SUBREG); 367 1.1 mrg 368 1.1 mrg if (REG_P (def_reg)) 369 1.1 mrg { 370 1.1 mrg if REG_P (use_reg) 371 1.1 mrg { 372 1.1 mrg if (!TARGET_BIG_ENDIAN) 373 1.1 mrg return REGNO (def_reg) == REGNO (use_reg) + 1; 374 1.1 mrg else 375 1.1 mrg return REGNO (def_reg) == REGNO (use_reg); 376 1.1 mrg } 377 1.1 mrg else 378 1.1 mrg return true; 379 1.1 mrg } 380 1.1 mrg 381 1.1 mrg if (GET_CODE (def_reg) == SUBREG) 382 1.1 mrg { 383 1.1 mrg if (!reg_overlap_p (def_reg, use_reg)) 384 1.1 mrg return false; 385 1.1 mrg 386 1.1 mrg if (GET_CODE (use_reg) == SUBREG) 387 1.1 mrg return true; 388 1.1 mrg 389 1.1 mrg if (!TARGET_BIG_ENDIAN) 390 1.1 mrg return SUBREG_BYTE (def_reg) == 4; 391 1.1 mrg else 392 1.1 mrg return SUBREG_BYTE (def_reg) == 0; 393 1.1 mrg } 394 1.1 mrg 395 1.1 mrg return false; 396 1.1 mrg } 397 1.1 mrg 398 1.1 mrg /* Check if INSN is a bpick insn consuming DEF_REG. */ 399 1.1 mrg bool 400 1.1 mrg bpick_ra_rb_dep_p (rtx insn, rtx def_reg) 401 1.1 mrg { 402 1.1 mrg rtx ior_rtx = SET_SRC (PATTERN (insn)); 403 1.1 mrg rtx and1_rtx = XEXP (ior_rtx, 0); 404 1.1 mrg rtx and2_rtx = XEXP (ior_rtx, 1); 405 1.1 mrg rtx reg1_0 = XEXP (and1_rtx, 0); 406 1.1 mrg rtx reg1_1 = XEXP (and1_rtx, 1); 407 1.1 mrg rtx reg2_0 = XEXP (and2_rtx, 0); 408 1.1 mrg rtx reg2_1 = XEXP (and2_rtx, 1); 409 1.1 mrg 410 1.1 mrg if (GET_CODE (reg1_0) == NOT) 411 1.1 mrg { 412 1.1 mrg if (rtx_equal_p (reg1_0, reg2_0)) 413 1.1 mrg return reg_overlap_p (def_reg, reg1_1) 414 1.1 mrg || reg_overlap_p (def_reg, reg2_1); 415 1.1 mrg 416 1.1 mrg if (rtx_equal_p (reg1_0, reg2_1)) 417 1.1 mrg return reg_overlap_p (def_reg, reg1_1) 418 1.1 mrg || reg_overlap_p (def_reg, reg2_0); 419 1.1 mrg } 420 1.1 mrg 421 1.1 mrg if (GET_CODE (reg1_1) == NOT) 422 1.1 mrg { 423 1.1 mrg if (rtx_equal_p (reg1_1, reg2_0)) 424 1.1 mrg return reg_overlap_p (def_reg, reg1_0) 425 1.1 mrg || reg_overlap_p (def_reg, reg2_1); 426 1.1 mrg 427 1.1 mrg if (rtx_equal_p (reg1_1, reg2_1)) 428 1.1 mrg return reg_overlap_p (def_reg, reg1_0) 429 1.1 mrg || reg_overlap_p (def_reg, reg2_0); 430 1.1 mrg } 431 1.1 mrg 432 1.1 mrg if (GET_CODE (reg2_0) == NOT) 433 1.1 mrg { 434 1.1 mrg if (rtx_equal_p (reg2_0, reg1_0)) 435 1.1 mrg return reg_overlap_p (def_reg, reg2_1) 436 1.1 mrg || reg_overlap_p (def_reg, reg1_1); 437 1.1 mrg 438 1.1 mrg if (rtx_equal_p (reg2_0, reg1_1)) 439 1.1 mrg return reg_overlap_p (def_reg, reg2_1) 440 1.1 mrg || reg_overlap_p (def_reg, reg1_0); 441 1.1 mrg } 442 1.1 mrg 443 1.1 mrg if (GET_CODE (reg2_1) == NOT) 444 1.1 mrg { 445 1.1 mrg if (rtx_equal_p (reg2_1, reg1_0)) 446 1.1 mrg return reg_overlap_p (def_reg, reg2_0) 447 1.1 mrg || reg_overlap_p (def_reg, reg1_1); 448 1.1 mrg 449 1.1 mrg if (rtx_equal_p (reg2_1, reg1_1)) 450 1.1 mrg return reg_overlap_p (def_reg, reg2_0) 451 1.1 mrg || reg_overlap_p (def_reg, reg1_0); 452 1.1 mrg } 453 1.1 mrg 454 1.1 mrg gcc_unreachable (); 455 1.1 mrg } 456 1.1 mrg } // namespace scheduling 457 1.1 mrg } // namespace nds32 458 1.1 mrg 459 1.1 mrg /* ------------------------------------------------------------------------ */ 460 1.1 mrg 461 1.1 mrg using namespace nds32; 462 1.1 mrg using namespace nds32::scheduling; 463 1.1 mrg 464 1.1 mrg namespace { // anonymous namespace 465 1.1 mrg 466 1.1 mrg /* Check the dependency between the producer defining DEF_REG and CONSUMER 467 1.1 mrg requiring input operand at II. */ 468 1.1 mrg bool 469 1.1 mrg n7_consumed_by_ii_dep_p (rtx_insn *consumer, rtx def_reg) 470 1.1 mrg { 471 1.1 mrg rtx use_rtx; 472 1.1 mrg 473 1.1 mrg switch (get_attr_type (consumer)) 474 1.1 mrg { 475 1.1 mrg /* MOVD44_E */ 476 1.1 mrg case TYPE_ALU: 477 1.1 mrg if (movd44_even_dep_p (consumer, def_reg)) 478 1.1 mrg return true; 479 1.1 mrg 480 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer)); 481 1.1 mrg break; 482 1.1 mrg 483 1.1 mrg case TYPE_MUL: 484 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer)); 485 1.1 mrg break; 486 1.1 mrg 487 1.1 mrg case TYPE_MAC: 488 1.1 mrg use_rtx = extract_mac_non_acc_rtx (consumer); 489 1.1 mrg break; 490 1.1 mrg 491 1.1 mrg /* Some special instructions, divmodsi4 and udivmodsi4, produce two 492 1.1 mrg results, the quotient and the remainder. It requires two micro- 493 1.1 mrg operations in order to write two registers. We have to check the 494 1.1 mrg dependency from the producer to the first micro-operation. */ 495 1.1 mrg case TYPE_DIV: 496 1.1 mrg if (divmod_p (consumer)) 497 1.1 mrg use_rtx = SET_SRC (parallel_element (consumer, 0)); 498 1.1 mrg else 499 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer)); 500 1.1 mrg break; 501 1.1 mrg 502 1.1 mrg case TYPE_LOAD: 503 1.1 mrg /* ADDR_IN_bi_Ra, ADDR_IN_!bi */ 504 1.1 mrg if (post_update_insn_p (consumer)) 505 1.1 mrg use_rtx = extract_base_reg (consumer); 506 1.1 mrg else 507 1.1 mrg use_rtx = extract_mem_rtx (consumer); 508 1.1 mrg break; 509 1.1 mrg 510 1.1 mrg case TYPE_STORE: 511 1.1 mrg /* ADDR_IN_bi_Ra, ADDR_IN_!bi */ 512 1.1 mrg if (post_update_insn_p (consumer)) 513 1.1 mrg use_rtx = extract_base_reg (consumer); 514 1.1 mrg else 515 1.1 mrg use_rtx = extract_mem_rtx (consumer); 516 1.1 mrg 517 1.1 mrg if (reg_overlap_p (def_reg, use_rtx)) 518 1.1 mrg return true; 519 1.1 mrg 520 1.1 mrg /* ST_bi, ST_!bi_RI */ 521 1.1 mrg if (!post_update_insn_p (consumer) 522 1.1 mrg && !immed_offset_p (extract_mem_rtx (consumer))) 523 1.1 mrg return false; 524 1.1 mrg 525 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer)); 526 1.1 mrg break; 527 1.1 mrg 528 1.1 mrg case TYPE_LOAD_MULTIPLE: 529 1.1 mrg use_rtx = extract_base_reg (consumer); 530 1.1 mrg break; 531 1.1 mrg 532 1.1 mrg case TYPE_STORE_MULTIPLE: 533 1.1 mrg /* ADDR_IN */ 534 1.1 mrg use_rtx = extract_base_reg (consumer); 535 1.1 mrg if (reg_overlap_p (def_reg, use_rtx)) 536 1.1 mrg return true; 537 1.1 mrg 538 1.1 mrg /* SMW (N, 1) */ 539 1.1 mrg use_rtx = extract_nth_access_rtx (consumer, 0); 540 1.1 mrg break; 541 1.1 mrg 542 1.1 mrg case TYPE_BRANCH: 543 1.1 mrg use_rtx = PATTERN (consumer); 544 1.1 mrg break; 545 1.1 mrg 546 1.1 mrg default: 547 1.1 mrg gcc_unreachable (); 548 1.1 mrg } 549 1.1 mrg 550 1.1 mrg if (reg_overlap_p (def_reg, use_rtx)) 551 1.1 mrg return true; 552 1.1 mrg 553 1.1 mrg return false; 554 1.1 mrg } 555 1.1 mrg 556 1.1 mrg /* Check the dependency between the producer defining DEF_REG and CONSUMER 557 1.1 mrg requiring input operand at AG (II). */ 558 1.1 mrg bool 559 1.1 mrg n8_consumed_by_addr_in_p (rtx_insn *consumer, rtx def_reg) 560 1.1 mrg { 561 1.1 mrg rtx use_rtx; 562 1.1 mrg 563 1.1 mrg switch (get_attr_type (consumer)) 564 1.1 mrg { 565 1.1 mrg case TYPE_BRANCH: 566 1.1 mrg use_rtx = extract_branch_target_rtx (consumer); 567 1.1 mrg break; 568 1.1 mrg 569 1.1 mrg case TYPE_LOAD: 570 1.1 mrg if (load_single_p (consumer)) 571 1.1 mrg use_rtx = extract_mem_rtx (consumer); 572 1.1 mrg else 573 1.1 mrg use_rtx = extract_base_reg (consumer); 574 1.1 mrg break; 575 1.1 mrg 576 1.1 mrg case TYPE_STORE: 577 1.1 mrg if (store_single_p (consumer) 578 1.1 mrg && (!post_update_insn_p (consumer) 579 1.1 mrg || immed_offset_p (extract_mem_rtx (consumer)))) 580 1.1 mrg use_rtx = extract_mem_rtx (consumer); 581 1.1 mrg else 582 1.1 mrg use_rtx = extract_base_reg (consumer); 583 1.1 mrg break; 584 1.1 mrg 585 1.1 mrg case TYPE_LOAD_MULTIPLE: 586 1.1 mrg case TYPE_STORE_MULTIPLE: 587 1.1 mrg use_rtx = extract_base_reg (consumer); 588 1.1 mrg break; 589 1.1 mrg 590 1.1 mrg default: 591 1.1 mrg gcc_unreachable (); 592 1.1 mrg } 593 1.1 mrg 594 1.1 mrg return reg_overlap_p (def_reg, use_rtx); 595 1.1 mrg } 596 1.1 mrg 597 1.1 mrg /* Check the dependency between the producer defining DEF_REG and CONSUMER 598 1.1 mrg requiring input operand at EX. */ 599 1.1 mrg bool 600 1.1 mrg n8_consumed_by_ex_p (rtx_insn *consumer, rtx def_reg) 601 1.1 mrg { 602 1.1 mrg rtx use_rtx; 603 1.1 mrg 604 1.1 mrg switch (get_attr_type (consumer)) 605 1.1 mrg { 606 1.1 mrg case TYPE_ALU: 607 1.1 mrg if (movd44_even_dep_p (consumer, def_reg)) 608 1.1 mrg return true; 609 1.1 mrg 610 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer)); 611 1.1 mrg break; 612 1.1 mrg 613 1.1 mrg case TYPE_MUL: 614 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer)); 615 1.1 mrg break; 616 1.1 mrg 617 1.1 mrg case TYPE_MAC: 618 1.1 mrg use_rtx = extract_mac_non_acc_rtx (consumer); 619 1.1 mrg break; 620 1.1 mrg 621 1.1 mrg /* Some special instructions, divmodsi4 and udivmodsi4, produce two 622 1.1 mrg results, the quotient and the remainder. It requires two micro- 623 1.1 mrg operations in order to write two registers. We have to check the 624 1.1 mrg dependency from the producer to the first micro-operation. */ 625 1.1 mrg case TYPE_DIV: 626 1.1 mrg if (divmod_p (consumer)) 627 1.1 mrg use_rtx = SET_SRC (parallel_element (consumer, 0)); 628 1.1 mrg else 629 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer)); 630 1.1 mrg break; 631 1.1 mrg 632 1.1 mrg case TYPE_BRANCH: 633 1.1 mrg use_rtx = extract_branch_condition_rtx (consumer); 634 1.1 mrg break; 635 1.1 mrg 636 1.1 mrg case TYPE_STORE: 637 1.1 mrg /* exclude ST_!bi_RR */ 638 1.1 mrg if (!post_update_insn_p (consumer) 639 1.1 mrg && !immed_offset_p (extract_mem_rtx (consumer))) 640 1.1 mrg return false; 641 1.1 mrg 642 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer)); 643 1.1 mrg break; 644 1.1 mrg 645 1.1 mrg case TYPE_STORE_MULTIPLE: 646 1.1 mrg use_rtx = extract_nth_access_rtx (consumer, 0); 647 1.1 mrg break; 648 1.1 mrg 649 1.1 mrg default: 650 1.1 mrg gcc_unreachable (); 651 1.1 mrg } 652 1.1 mrg 653 1.1 mrg return reg_overlap_p (def_reg, use_rtx); 654 1.1 mrg } 655 1.1 mrg 656 1.1 mrg /* Check the dependency between the producer defining DEF_REG and CONSUMER 657 1.1 mrg requiring input operand at AG (II). */ 658 1.1 mrg bool 659 1.1 mrg e8_consumed_by_addr_in_p (rtx_insn *consumer, rtx def_reg) 660 1.1 mrg { 661 1.1 mrg return n8_consumed_by_addr_in_p (consumer, def_reg); 662 1.1 mrg } 663 1.1 mrg 664 1.1 mrg /* Check the dependency between the producer defining DEF_REG and CONSUMER 665 1.1 mrg requiring input operand at EX. */ 666 1.1 mrg bool 667 1.1 mrg e8_consumed_by_ex_p (rtx_insn *consumer, rtx def_reg) 668 1.1 mrg { 669 1.1 mrg rtx use_rtx; 670 1.1 mrg 671 1.1 mrg switch (get_attr_type (consumer)) 672 1.1 mrg { 673 1.1 mrg case TYPE_ALU: 674 1.1 mrg case TYPE_STORE: 675 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer)); 676 1.1 mrg break; 677 1.1 mrg 678 1.1 mrg case TYPE_MUL: 679 1.1 mrg case TYPE_MAC: 680 1.1 mrg case TYPE_DIV: 681 1.1 mrg case TYPE_BRANCH: 682 1.1 mrg case TYPE_STORE_MULTIPLE: 683 1.1 mrg return n8_consumed_by_ex_p (consumer, def_reg); 684 1.1 mrg 685 1.1 mrg default: 686 1.1 mrg gcc_unreachable (); 687 1.1 mrg } 688 1.1 mrg 689 1.1 mrg return reg_overlap_p (def_reg, use_rtx); 690 1.1 mrg } 691 1.1 mrg 692 1.1 mrg /* Check the dependency between the producer defining DEF_REG and CONSUMER 693 1.1 mrg requiring input operand at EX. */ 694 1.1 mrg bool 695 1.1 mrg n9_2r1w_consumed_by_ex_dep_p (rtx_insn *consumer, rtx def_reg) 696 1.1 mrg { 697 1.1 mrg rtx use_rtx; 698 1.1 mrg 699 1.1 mrg switch (get_attr_type (consumer)) 700 1.1 mrg { 701 1.1 mrg case TYPE_ALU: 702 1.1 mrg if (movd44_even_dep_p (consumer, def_reg)) 703 1.1 mrg return true; 704 1.1 mrg 705 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer)); 706 1.1 mrg break; 707 1.1 mrg 708 1.1 mrg case TYPE_PBSAD: 709 1.1 mrg case TYPE_MUL: 710 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer)); 711 1.1 mrg break; 712 1.1 mrg 713 1.1 mrg case TYPE_ALU_SHIFT: 714 1.1 mrg use_rtx = extract_shift_reg (consumer); 715 1.1 mrg break; 716 1.1 mrg 717 1.1 mrg case TYPE_PBSADA: 718 1.1 mrg return pbsada_insn_ra_rb_dep_reg_p (consumer, def_reg); 719 1.1 mrg 720 1.1 mrg case TYPE_MAC: 721 1.1 mrg use_rtx = PATTERN (consumer); 722 1.1 mrg break; 723 1.1 mrg 724 1.1 mrg case TYPE_DIV: 725 1.1 mrg if (divmod_p (consumer)) 726 1.1 mrg use_rtx = SET_SRC (parallel_element (consumer, 0)); 727 1.1 mrg else 728 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer)); 729 1.1 mrg break; 730 1.1 mrg 731 1.1 mrg case TYPE_MMU: 732 1.1 mrg if (GET_CODE (PATTERN (consumer)) == SET) 733 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer)); 734 1.1 mrg else 735 1.1 mrg return true; 736 1.1 mrg break; 737 1.1 mrg 738 1.1 mrg case TYPE_LOAD: 739 1.1 mrg /* ADDR_IN_bi_Ra, ADDR_IN_!bi */ 740 1.1 mrg if (post_update_insn_p (consumer)) 741 1.1 mrg use_rtx = extract_base_reg (consumer); 742 1.1 mrg else 743 1.1 mrg use_rtx = extract_mem_rtx (consumer); 744 1.1 mrg break; 745 1.1 mrg 746 1.1 mrg case TYPE_STORE: 747 1.1 mrg /* ADDR_IN_bi_Ra, ADDR_IN_!bi */ 748 1.1 mrg if (post_update_insn_p (consumer)) 749 1.1 mrg use_rtx = extract_base_reg (consumer); 750 1.1 mrg else 751 1.1 mrg use_rtx = extract_mem_rtx (consumer); 752 1.1 mrg 753 1.1 mrg if (reg_overlap_p (def_reg, use_rtx)) 754 1.1 mrg return true; 755 1.1 mrg 756 1.1 mrg /* exclude ST_!bi_RR */ 757 1.1 mrg if (!post_update_insn_p (consumer) 758 1.1 mrg && !immed_offset_p (extract_mem_rtx (consumer))) 759 1.1 mrg return false; 760 1.1 mrg 761 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer)); 762 1.1 mrg break; 763 1.1 mrg 764 1.1 mrg case TYPE_LOAD_MULTIPLE: 765 1.1 mrg use_rtx = extract_base_reg (consumer); 766 1.1 mrg break; 767 1.1 mrg 768 1.1 mrg case TYPE_STORE_MULTIPLE: 769 1.1 mrg /* ADDR_IN */ 770 1.1 mrg use_rtx = extract_base_reg (consumer); 771 1.1 mrg if (reg_overlap_p (def_reg, use_rtx)) 772 1.1 mrg return true; 773 1.1 mrg 774 1.1 mrg /* SMW (N, 1) */ 775 1.1 mrg use_rtx = extract_nth_access_rtx (consumer, 0); 776 1.1 mrg break; 777 1.1 mrg 778 1.1 mrg case TYPE_BRANCH: 779 1.1 mrg use_rtx = PATTERN (consumer); 780 1.1 mrg break; 781 1.1 mrg 782 1.1 mrg default: 783 1.1 mrg gcc_unreachable (); 784 1.1 mrg } 785 1.1 mrg 786 1.1 mrg if (reg_overlap_p (def_reg, use_rtx)) 787 1.1 mrg return true; 788 1.1 mrg 789 1.1 mrg return false; 790 1.1 mrg } 791 1.1 mrg 792 1.1 mrg /* Check the dependency between the producer defining DEF_REG and CONSUMER 793 1.1 mrg requiring input operand at EX. */ 794 1.1 mrg bool 795 1.1 mrg n9_3r2w_consumed_by_ex_dep_p (rtx_insn *consumer, rtx def_reg) 796 1.1 mrg { 797 1.1 mrg rtx use_rtx; 798 1.1 mrg 799 1.1 mrg switch (get_attr_type (consumer)) 800 1.1 mrg { 801 1.1 mrg case TYPE_ALU: 802 1.1 mrg case TYPE_PBSAD: 803 1.1 mrg case TYPE_MUL: 804 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer)); 805 1.1 mrg break; 806 1.1 mrg 807 1.1 mrg case TYPE_ALU_SHIFT: 808 1.1 mrg use_rtx = extract_shift_reg (consumer); 809 1.1 mrg break; 810 1.1 mrg 811 1.1 mrg case TYPE_PBSADA: 812 1.1 mrg return pbsada_insn_ra_rb_dep_reg_p (consumer, def_reg); 813 1.1 mrg 814 1.1 mrg case TYPE_MAC: 815 1.1 mrg use_rtx = extract_mac_non_acc_rtx (consumer); 816 1.1 mrg break; 817 1.1 mrg 818 1.1 mrg /* Some special instructions, divmodsi4 and udivmodsi4, produce two 819 1.1 mrg results, the quotient and the remainder. In 2R1W configuration, 820 1.1 mrg it requires two micro-operations in order to write two registers. 821 1.1 mrg We have to check the dependency from the producer to the first 822 1.1 mrg micro-operation. */ 823 1.1 mrg case TYPE_DIV: 824 1.1 mrg if (divmod_p (consumer)) 825 1.1 mrg use_rtx = SET_SRC (parallel_element (consumer, 0)); 826 1.1 mrg else 827 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer)); 828 1.1 mrg break; 829 1.1 mrg 830 1.1 mrg case TYPE_MMU: 831 1.1 mrg if (GET_CODE (PATTERN (consumer)) == SET) 832 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer)); 833 1.1 mrg else 834 1.1 mrg return true; 835 1.1 mrg break; 836 1.1 mrg 837 1.1 mrg case TYPE_LOAD: 838 1.1 mrg case TYPE_STORE: 839 1.1 mrg use_rtx = extract_mem_rtx (consumer); 840 1.1 mrg break; 841 1.1 mrg 842 1.1 mrg case TYPE_LOAD_MULTIPLE: 843 1.1 mrg case TYPE_STORE_MULTIPLE: 844 1.1 mrg use_rtx = extract_base_reg (consumer); 845 1.1 mrg break; 846 1.1 mrg 847 1.1 mrg case TYPE_BRANCH: 848 1.1 mrg use_rtx = PATTERN (consumer); 849 1.1 mrg break; 850 1.1 mrg 851 1.1 mrg default: 852 1.1 mrg gcc_unreachable (); 853 1.1 mrg } 854 1.1 mrg 855 1.1 mrg if (reg_overlap_p (def_reg, use_rtx)) 856 1.1 mrg return true; 857 1.1 mrg 858 1.1 mrg return false; 859 1.1 mrg } 860 1.1 mrg 861 1.1 mrg /* Check the dependency between the producer defining DEF_REG and CONSUMER 862 1.1 mrg requiring input operand at EX. */ 863 1.1 mrg bool 864 1.1 mrg n10_consumed_by_ex_dep_p (rtx_insn *consumer, rtx def_reg) 865 1.1 mrg { 866 1.1 mrg rtx use_rtx; 867 1.1 mrg 868 1.1 mrg switch (get_attr_type (consumer)) 869 1.1 mrg { 870 1.1 mrg case TYPE_ALU: 871 1.1 mrg case TYPE_PBSAD: 872 1.1 mrg case TYPE_MUL: 873 1.1 mrg case TYPE_DALU: 874 1.1 mrg case TYPE_DALU64: 875 1.1 mrg case TYPE_DMUL: 876 1.1 mrg case TYPE_DPACK: 877 1.1 mrg case TYPE_DINSB: 878 1.1 mrg case TYPE_DCMP: 879 1.1 mrg case TYPE_DCLIP: 880 1.1 mrg case TYPE_DALUROUND: 881 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer)); 882 1.1 mrg break; 883 1.1 mrg 884 1.1 mrg case TYPE_ALU_SHIFT: 885 1.1 mrg use_rtx = extract_shift_reg (consumer); 886 1.1 mrg break; 887 1.1 mrg 888 1.1 mrg case TYPE_PBSADA: 889 1.1 mrg return pbsada_insn_ra_rb_dep_reg_p (consumer, def_reg); 890 1.1 mrg 891 1.1 mrg case TYPE_MAC: 892 1.1 mrg case TYPE_DMAC: 893 1.1 mrg use_rtx = extract_mac_non_acc_rtx (consumer); 894 1.1 mrg break; 895 1.1 mrg 896 1.1 mrg /* Some special instructions, divmodsi4 and udivmodsi4, produce two 897 1.1 mrg results, the quotient and the remainder. */ 898 1.1 mrg case TYPE_DIV: 899 1.1 mrg if (divmod_p (consumer)) 900 1.1 mrg use_rtx = SET_SRC (parallel_element (consumer, 0)); 901 1.1 mrg else 902 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer)); 903 1.1 mrg break; 904 1.1 mrg 905 1.1 mrg case TYPE_DWEXT: 906 1.1 mrg return wext_odd_dep_p (consumer, def_reg); 907 1.1 mrg 908 1.1 mrg case TYPE_DBPICK: 909 1.1 mrg return bpick_ra_rb_dep_p (consumer, def_reg); 910 1.1 mrg 911 1.1 mrg case TYPE_MMU: 912 1.1 mrg if (GET_CODE (PATTERN (consumer)) == SET) 913 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer)); 914 1.1 mrg else 915 1.1 mrg return true; 916 1.1 mrg break; 917 1.1 mrg 918 1.1 mrg case TYPE_LOAD: 919 1.1 mrg case TYPE_STORE: 920 1.1 mrg use_rtx = extract_mem_rtx (consumer); 921 1.1 mrg break; 922 1.1 mrg 923 1.1 mrg case TYPE_LOAD_MULTIPLE: 924 1.1 mrg case TYPE_STORE_MULTIPLE: 925 1.1 mrg use_rtx = extract_base_reg (consumer); 926 1.1 mrg break; 927 1.1 mrg 928 1.1 mrg case TYPE_BRANCH: 929 1.1 mrg use_rtx = PATTERN (consumer); 930 1.1 mrg break; 931 1.1 mrg 932 1.1 mrg default: 933 1.1 mrg gcc_unreachable (); 934 1.1 mrg } 935 1.1 mrg 936 1.1 mrg if (reg_overlap_p (def_reg, use_rtx)) 937 1.1 mrg return true; 938 1.1 mrg 939 1.1 mrg return false; 940 1.1 mrg } 941 1.1 mrg 942 1.1 mrg /* Check the dependency between the producer defining DEF_REG and CONSUMER 943 1.1 mrg requiring input operand at EX. */ 944 1.1 mrg bool 945 1.1 mrg gw_consumed_by_ex_dep_p (rtx_insn *consumer, rtx def_reg) 946 1.1 mrg { 947 1.1 mrg rtx use_rtx; 948 1.1 mrg 949 1.1 mrg switch (get_attr_type (consumer)) 950 1.1 mrg { 951 1.1 mrg case TYPE_ALU: 952 1.1 mrg case TYPE_PBSAD: 953 1.1 mrg case TYPE_MUL: 954 1.1 mrg case TYPE_DALU: 955 1.1 mrg case TYPE_DALU64: 956 1.1 mrg case TYPE_DMUL: 957 1.1 mrg case TYPE_DPACK: 958 1.1 mrg case TYPE_DINSB: 959 1.1 mrg case TYPE_DCMP: 960 1.1 mrg case TYPE_DCLIP: 961 1.1 mrg case TYPE_DALUROUND: 962 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer)); 963 1.1 mrg break; 964 1.1 mrg 965 1.1 mrg case TYPE_ALU_SHIFT: 966 1.1 mrg use_rtx = extract_shift_reg (consumer); 967 1.1 mrg break; 968 1.1 mrg 969 1.1 mrg case TYPE_PBSADA: 970 1.1 mrg return pbsada_insn_ra_rb_dep_reg_p (consumer, def_reg); 971 1.1 mrg 972 1.1 mrg case TYPE_MAC: 973 1.1 mrg case TYPE_DMAC: 974 1.1 mrg use_rtx = extract_mac_non_acc_rtx (consumer); 975 1.1 mrg break; 976 1.1 mrg 977 1.1 mrg /* Some special instructions, divmodsi4 and udivmodsi4, produce two 978 1.1 mrg results, the quotient and the remainder. We have to check the 979 1.1 mrg dependency from the producer to the first micro-operation. */ 980 1.1 mrg case TYPE_DIV: 981 1.1 mrg if (divmod_p (consumer)) 982 1.1 mrg use_rtx = SET_SRC (parallel_element (consumer, 0)); 983 1.1 mrg else 984 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer)); 985 1.1 mrg break; 986 1.1 mrg 987 1.1 mrg case TYPE_DWEXT: 988 1.1 mrg return wext_odd_dep_p (consumer, def_reg); 989 1.1 mrg 990 1.1 mrg case TYPE_DBPICK: 991 1.1 mrg return bpick_ra_rb_dep_p (consumer, def_reg); 992 1.1 mrg 993 1.1 mrg case TYPE_MMU: 994 1.1 mrg if (GET_CODE (PATTERN (consumer)) == SET) 995 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer)); 996 1.1 mrg else 997 1.1 mrg return true; 998 1.1 mrg break; 999 1.1 mrg 1000 1.1 mrg case TYPE_LOAD: 1001 1.1 mrg case TYPE_STORE: 1002 1.1 mrg use_rtx = extract_mem_rtx (consumer); 1003 1.1 mrg break; 1004 1.1 mrg 1005 1.1 mrg case TYPE_LOAD_MULTIPLE: 1006 1.1 mrg case TYPE_STORE_MULTIPLE: 1007 1.1 mrg use_rtx = extract_base_reg (consumer); 1008 1.1 mrg break; 1009 1.1 mrg 1010 1.1 mrg case TYPE_BRANCH: 1011 1.1 mrg use_rtx = PATTERN (consumer); 1012 1.1 mrg break; 1013 1.1 mrg 1014 1.1 mrg default: 1015 1.1 mrg gcc_unreachable (); 1016 1.1 mrg } 1017 1.1 mrg 1018 1.1 mrg if (reg_overlap_p (def_reg, use_rtx)) 1019 1.1 mrg return true; 1020 1.1 mrg 1021 1.1 mrg return false; 1022 1.1 mrg } 1023 1.1 mrg 1024 1.1 mrg /* Check dependencies from any stages to ALU_E1 (E1). This is a helper 1025 1.1 mrg function of n13_consumed_by_e1_dep_p (). */ 1026 1.1 mrg bool 1027 1.1 mrg n13_alu_e1_insn_dep_reg_p (rtx_insn *alu_e1_insn, rtx def_reg) 1028 1.1 mrg { 1029 1.1 mrg rtx unspec_rtx, operand_ra, operand_rb; 1030 1.1 mrg rtx src_rtx, dst_rtx; 1031 1.1 mrg 1032 1.1 mrg switch (INSN_CODE (alu_e1_insn)) 1033 1.1 mrg { 1034 1.1 mrg /* BSP and BSE are supported by built-in functions, the corresponding 1035 1.1 mrg patterns are formed by UNSPEC RTXs. We have to handle them 1036 1.1 mrg individually. */ 1037 1.1 mrg case CODE_FOR_unspec_bsp: 1038 1.1 mrg case CODE_FOR_unspec_bse: 1039 1.1 mrg unspec_rtx = SET_SRC (parallel_element (alu_e1_insn, 0)); 1040 1.1 mrg gcc_assert (GET_CODE (unspec_rtx) == UNSPEC); 1041 1.1 mrg 1042 1.1 mrg operand_ra = XVECEXP (unspec_rtx, 0, 0); 1043 1.1 mrg operand_rb = XVECEXP (unspec_rtx, 0, 1); 1044 1.1 mrg 1045 1.1 mrg if (rtx_equal_p (def_reg, operand_ra) 1046 1.1 mrg || rtx_equal_p (def_reg, operand_rb)) 1047 1.1 mrg return true; 1048 1.1 mrg 1049 1.1 mrg return false; 1050 1.1 mrg 1051 1.1 mrg /* Unlink general ALU instructions, MOVD44 requires operands at E1. */ 1052 1.1 mrg case CODE_FOR_move_di: 1053 1.1 mrg case CODE_FOR_move_df: 1054 1.1 mrg src_rtx = SET_SRC (PATTERN (alu_e1_insn)); 1055 1.1 mrg dst_rtx = SET_DEST (PATTERN (alu_e1_insn)); 1056 1.1 mrg 1057 1.1 mrg if (REG_P (dst_rtx) && REG_P (src_rtx) 1058 1.1 mrg && rtx_equal_p (src_rtx, def_reg)) 1059 1.1 mrg return true; 1060 1.1 mrg 1061 1.1 mrg return false; 1062 1.1 mrg 1063 1.1 mrg default: 1064 1.1 mrg return false; 1065 1.1 mrg } 1066 1.1 mrg } 1067 1.1 mrg 1068 1.1 mrg /* Check the dependency between the producer defining DEF_REG and CONSUMER 1069 1.1 mrg requiring input operand at E1. Because the address generation unti is 1070 1.1 mrg at E1, the address input should be ready at E1. Note that the branch 1071 1.1 mrg target is also a kind of addresses, so we have to check it. */ 1072 1.1 mrg bool 1073 1.1 mrg n13_consumed_by_e1_dep_p (rtx_insn *consumer, rtx def_reg) 1074 1.1 mrg { 1075 1.1 mrg rtx use_rtx; 1076 1.1 mrg 1077 1.1 mrg switch (get_attr_type (consumer)) 1078 1.1 mrg { 1079 1.1 mrg /* ALU_E1 */ 1080 1.1 mrg case TYPE_ALU: 1081 1.1 mrg return n13_alu_e1_insn_dep_reg_p (consumer, def_reg); 1082 1.1 mrg 1083 1.1 mrg case TYPE_PBSADA: 1084 1.1 mrg return pbsada_insn_ra_rb_dep_reg_p (consumer, def_reg); 1085 1.1 mrg 1086 1.1 mrg case TYPE_PBSAD: 1087 1.1 mrg case TYPE_MUL: 1088 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer)); 1089 1.1 mrg break; 1090 1.1 mrg 1091 1.1 mrg case TYPE_MAC: 1092 1.1 mrg use_rtx = extract_mac_non_acc_rtx (consumer); 1093 1.1 mrg break; 1094 1.1 mrg 1095 1.1 mrg case TYPE_DIV: 1096 1.1 mrg if (divmod_p (consumer)) 1097 1.1 mrg use_rtx = SET_SRC (parallel_element (consumer, 0)); 1098 1.1 mrg else 1099 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer)); 1100 1.1 mrg break; 1101 1.1 mrg 1102 1.1 mrg case TYPE_MMU: 1103 1.1 mrg if (GET_CODE (PATTERN (consumer)) == SET) 1104 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer)); 1105 1.1 mrg else 1106 1.1 mrg return true; 1107 1.1 mrg break; 1108 1.1 mrg 1109 1.1 mrg case TYPE_BRANCH: 1110 1.1 mrg use_rtx = extract_branch_target_rtx (consumer); 1111 1.1 mrg break; 1112 1.1 mrg 1113 1.1 mrg case TYPE_LOAD: 1114 1.1 mrg case TYPE_STORE: 1115 1.1 mrg use_rtx = extract_mem_rtx (consumer); 1116 1.1 mrg break; 1117 1.1 mrg 1118 1.1 mrg case TYPE_LOAD_MULTIPLE: 1119 1.1 mrg case TYPE_STORE_MULTIPLE: 1120 1.1 mrg use_rtx = extract_base_reg (consumer); 1121 1.1 mrg break; 1122 1.1 mrg 1123 1.1 mrg default: 1124 1.1 mrg return false; 1125 1.1 mrg } 1126 1.1 mrg 1127 1.1 mrg if (reg_overlap_p (def_reg, use_rtx)) 1128 1.1 mrg return true; 1129 1.1 mrg 1130 1.1 mrg return false; 1131 1.1 mrg } 1132 1.1 mrg 1133 1.1 mrg /* Check the dependency between the producer defining DEF_REG and CONSUMER 1134 1.1 mrg requiring input operand at E2. */ 1135 1.1 mrg bool 1136 1.1 mrg n13_consumed_by_e2_dep_p (rtx_insn *consumer, rtx def_reg) 1137 1.1 mrg { 1138 1.1 mrg rtx use_rtx; 1139 1.1 mrg 1140 1.1 mrg switch (get_attr_type (consumer)) 1141 1.1 mrg { 1142 1.1 mrg case TYPE_ALU: 1143 1.1 mrg case TYPE_STORE: 1144 1.1 mrg use_rtx = SET_SRC (PATTERN (consumer)); 1145 1.1 mrg break; 1146 1.1 mrg 1147 1.1 mrg case TYPE_ALU_SHIFT: 1148 1.1 mrg use_rtx = extract_shift_reg (consumer); 1149 1.1 mrg break; 1150 1.1 mrg 1151 1.1 mrg case TYPE_PBSADA: 1152 1.1 mrg return pbsada_insn_rt_dep_reg_p (consumer, def_reg); 1153 1.1 mrg 1154 1.1 mrg case TYPE_STORE_MULTIPLE: 1155 1.1 mrg use_rtx = extract_nth_access_rtx (consumer, 0); 1156 1.1 mrg break; 1157 1.1 mrg 1158 1.1 mrg case TYPE_BRANCH: 1159 1.1 mrg use_rtx = extract_branch_condition_rtx (consumer); 1160 1.1 mrg break; 1161 1.1 mrg 1162 1.1 mrg default: 1163 1.1 mrg gcc_unreachable(); 1164 1.1 mrg } 1165 1.1 mrg 1166 1.1 mrg if (reg_overlap_p (def_reg, use_rtx)) 1167 1.1 mrg return true; 1168 1.1 mrg 1169 1.1 mrg return false; 1170 1.1 mrg } 1171 1.1 mrg } // anonymous namespace 1172 1.1 mrg 1173 1.1 mrg /* ------------------------------------------------------------------------ */ 1174 1.1 mrg 1175 1.1 mrg /* Guard functions for N7 core. */ 1176 1.1 mrg 1177 1.1 mrg bool 1178 1.1 mrg nds32_n7_load_to_ii_p (rtx_insn *producer, rtx_insn *consumer) 1179 1.1 mrg { 1180 1.1 mrg if (post_update_insn_p (producer)) 1181 1.1 mrg return false; 1182 1.1 mrg 1183 1.1 mrg rtx def_reg = SET_DEST (PATTERN (producer)); 1184 1.1 mrg 1185 1.1 mrg return n7_consumed_by_ii_dep_p (consumer, def_reg); 1186 1.1 mrg } 1187 1.1 mrg 1188 1.1 mrg bool 1189 1.1 mrg nds32_n7_last_load_to_ii_p (rtx_insn *producer, rtx_insn *consumer) 1190 1.1 mrg { 1191 1.1 mrg /* If PRODUCER is a post-update LMW insn, the last micro-operation updates 1192 1.1 mrg the base register and the result is ready in II stage, so we don't need 1193 1.1 mrg to handle that case in this guard function and the corresponding bypass 1194 1.1 mrg rule. */ 1195 1.1 mrg if (post_update_insn_p (producer)) 1196 1.1 mrg return false; 1197 1.1 mrg 1198 1.1 mrg rtx last_def_reg = extract_nth_access_reg (producer, -1); 1199 1.1 mrg 1200 1.1 mrg if (last_def_reg == NULL_RTX) 1201 1.1 mrg return false; 1202 1.1 mrg 1203 1.1 mrg gcc_assert (REG_P (last_def_reg) || GET_CODE (last_def_reg) == SUBREG); 1204 1.1 mrg 1205 1.1 mrg return n7_consumed_by_ii_dep_p (consumer, last_def_reg); 1206 1.1 mrg } 1207 1.1 mrg 1208 1.1 mrg /* Guard functions for N8 core. */ 1209 1.1 mrg 1210 1.1 mrg bool 1211 1.1 mrg nds32_n8_load_to_ii_p (rtx_insn *producer, rtx_insn *consumer) 1212 1.1 mrg { 1213 1.1 mrg if (post_update_insn_p (producer)) 1214 1.1 mrg return false; 1215 1.1 mrg 1216 1.1 mrg rtx def_reg = SET_DEST (PATTERN (producer)); 1217 1.1 mrg 1218 1.1 mrg return n8_consumed_by_addr_in_p (consumer, def_reg); 1219 1.1 mrg } 1220 1.1 mrg 1221 1.1 mrg bool 1222 1.1 mrg nds32_n8_load_bi_to_ii_p (rtx_insn *producer, rtx_insn *consumer) 1223 1.1 mrg { 1224 1.1 mrg if (!post_update_insn_p (producer)) 1225 1.1 mrg return false; 1226 1.1 mrg 1227 1.1 mrg rtx def_reg = SET_DEST (PATTERN (producer)); 1228 1.1 mrg 1229 1.1 mrg return n8_consumed_by_addr_in_p (consumer, def_reg); 1230 1.1 mrg } 1231 1.1 mrg 1232 1.1 mrg bool 1233 1.1 mrg nds32_n8_load_to_ex_p (rtx_insn *producer, rtx_insn *consumer) 1234 1.1 mrg { 1235 1.1 mrg if (post_update_insn_p (producer)) 1236 1.1 mrg return false; 1237 1.1 mrg 1238 1.1 mrg rtx def_reg = SET_DEST (PATTERN (producer)); 1239 1.1 mrg 1240 1.1 mrg return n8_consumed_by_ex_p (consumer, def_reg); 1241 1.1 mrg } 1242 1.1 mrg 1243 1.1 mrg bool 1244 1.1 mrg nds32_n8_ex_to_ii_p (rtx_insn *producer, rtx_insn *consumer) 1245 1.1 mrg { 1246 1.1 mrg rtx def_reg; 1247 1.1 mrg 1248 1.1 mrg switch (get_attr_type (producer)) 1249 1.1 mrg { 1250 1.1 mrg case TYPE_ALU: 1251 1.1 mrg if (movd44_insn_p (producer)) 1252 1.1 mrg def_reg = extract_movd44_odd_reg (producer); 1253 1.1 mrg else 1254 1.1 mrg def_reg = SET_DEST (PATTERN (producer)); 1255 1.1 mrg break; 1256 1.1 mrg 1257 1.1 mrg case TYPE_MUL: 1258 1.1 mrg case TYPE_MAC: 1259 1.1 mrg def_reg = SET_DEST (PATTERN (producer)); 1260 1.1 mrg break; 1261 1.1 mrg 1262 1.1 mrg case TYPE_DIV: 1263 1.1 mrg if (divmod_p (producer)) 1264 1.1 mrg def_reg = SET_DEST (parallel_element (producer, 1)); 1265 1.1 mrg else 1266 1.1 mrg def_reg = SET_DEST (PATTERN (producer)); 1267 1.1 mrg break; 1268 1.1 mrg 1269 1.1 mrg case TYPE_LOAD: 1270 1.1 mrg case TYPE_STORE: 1271 1.1 mrg case TYPE_LOAD_MULTIPLE: 1272 1.1 mrg case TYPE_STORE_MULTIPLE: 1273 1.1 mrg if (!post_update_insn_p (producer)) 1274 1.1 mrg return false; 1275 1.1 mrg 1276 1.1 mrg def_reg = extract_base_reg (producer); 1277 1.1 mrg break; 1278 1.1 mrg 1279 1.1 mrg default: 1280 1.1 mrg gcc_unreachable (); 1281 1.1 mrg } 1282 1.1 mrg 1283 1.1 mrg return n8_consumed_by_addr_in_p (consumer, def_reg); 1284 1.1 mrg } 1285 1.1 mrg 1286 1.1 mrg bool 1287 1.1 mrg nds32_n8_last_load_to_ii_p (rtx_insn *producer, rtx_insn *consumer) 1288 1.1 mrg { 1289 1.1 mrg /* If PRODUCER is a post-update LMW insn, the last micro-operation updates 1290 1.1 mrg the base register and the result is ready in EX stage, so we don't need 1291 1.1 mrg to handle that case in this guard function and the corresponding bypass 1292 1.1 mrg rule. */ 1293 1.1 mrg if (post_update_insn_p (producer)) 1294 1.1 mrg return false; 1295 1.1 mrg 1296 1.1 mrg rtx last_def_reg = extract_nth_access_reg (producer, -1); 1297 1.1 mrg 1298 1.1 mrg if (last_def_reg == NULL_RTX) 1299 1.1 mrg return false; 1300 1.1 mrg 1301 1.1 mrg gcc_assert (REG_P (last_def_reg) || GET_CODE (last_def_reg) == SUBREG); 1302 1.1 mrg 1303 1.1 mrg return n8_consumed_by_addr_in_p (consumer, last_def_reg); 1304 1.1 mrg } 1305 1.1 mrg 1306 1.1 mrg bool 1307 1.1 mrg nds32_n8_last_load_two_to_ii_p (rtx_insn *producer, rtx_insn *consumer) 1308 1.1 mrg { 1309 1.1 mrg int index = -2; 1310 1.1 mrg 1311 1.1 mrg /* If PRODUCER is a post-update insn, there is an additional one micro- 1312 1.1 mrg operation inserted in the end, so the last memory access operation should 1313 1.1 mrg be handled by this guard function and the corresponding bypass rule. */ 1314 1.1 mrg if (post_update_insn_p (producer)) 1315 1.1 mrg index = -1; 1316 1.1 mrg 1317 1.1 mrg rtx last_two_def_reg = extract_nth_access_reg (producer, index); 1318 1.1 mrg 1319 1.1 mrg if (last_two_def_reg == NULL_RTX) 1320 1.1 mrg return false; 1321 1.1 mrg 1322 1.1 mrg gcc_assert (REG_P (last_two_def_reg) 1323 1.1 mrg || GET_CODE (last_two_def_reg) == SUBREG); 1324 1.1 mrg 1325 1.1 mrg return n8_consumed_by_addr_in_p (consumer, last_two_def_reg); 1326 1.1 mrg } 1327 1.1 mrg 1328 1.1 mrg bool 1329 1.1 mrg nds32_n8_last_load_to_ex_p (rtx_insn *producer, rtx_insn *consumer) 1330 1.1 mrg { 1331 1.1 mrg /* If PRODUCER is a post-update LMW insn, the last micro-operation updates 1332 1.1 mrg the base register and the result is ready in EX stage, so we don't need 1333 1.1 mrg to handle that case in this guard function and the corresponding bypass 1334 1.1 mrg rule. */ 1335 1.1 mrg if (post_update_insn_p (producer)) 1336 1.1 mrg return false; 1337 1.1 mrg 1338 1.1 mrg rtx last_def_reg = extract_nth_access_reg (producer, -1); 1339 1.1 mrg 1340 1.1 mrg if (last_def_reg == NULL_RTX) 1341 1.1 mrg return false; 1342 1.1 mrg 1343 1.1 mrg gcc_assert (REG_P (last_def_reg) || GET_CODE (last_def_reg) == SUBREG); 1344 1.1 mrg 1345 1.1 mrg return n8_consumed_by_ex_p (consumer, last_def_reg); 1346 1.1 mrg } 1347 1.1 mrg 1348 1.1 mrg /* Guard functions for E8 cores. */ 1349 1.1 mrg 1350 1.1 mrg bool 1351 1.1 mrg nds32_e8_load_to_ii_p (rtx_insn *producer, rtx_insn *consumer) 1352 1.1 mrg { 1353 1.1 mrg rtx def_reg = SET_DEST (PATTERN (producer)); 1354 1.1 mrg 1355 1.1 mrg return e8_consumed_by_addr_in_p (consumer, def_reg); 1356 1.1 mrg } 1357 1.1 mrg 1358 1.1 mrg bool 1359 1.1 mrg nds32_e8_load_to_ex_p (rtx_insn *producer, rtx_insn *consumer) 1360 1.1 mrg { 1361 1.1 mrg rtx def_reg = SET_DEST (PATTERN (producer)); 1362 1.1 mrg 1363 1.1 mrg return e8_consumed_by_ex_p (consumer, def_reg); 1364 1.1 mrg } 1365 1.1 mrg 1366 1.1 mrg bool 1367 1.1 mrg nds32_e8_ex_to_ii_p (rtx_insn *producer, rtx_insn *consumer) 1368 1.1 mrg { 1369 1.1 mrg rtx def_reg; 1370 1.1 mrg 1371 1.1 mrg switch (get_attr_type (producer)) 1372 1.1 mrg { 1373 1.1 mrg case TYPE_ALU: 1374 1.1 mrg /* No data hazards if AGEN's input is produced by MOVI or SETHI. */ 1375 1.1 mrg if (GET_CODE (PATTERN (producer)) == SET) 1376 1.1 mrg { 1377 1.1 mrg rtx dest = SET_DEST (PATTERN (producer)); 1378 1.1 mrg rtx src = SET_SRC (PATTERN (producer)); 1379 1.1 mrg 1380 1.1 mrg if ((REG_P (dest) || GET_CODE (dest) == SUBREG) 1381 1.1 mrg && (GET_CODE (src) == CONST_INT || GET_CODE (src) == HIGH)) 1382 1.1 mrg return false; 1383 1.1 mrg } 1384 1.1 mrg 1385 1.1 mrg def_reg = SET_DEST (PATTERN (producer)); 1386 1.1 mrg break; 1387 1.1 mrg 1388 1.1 mrg case TYPE_MUL: 1389 1.1 mrg case TYPE_MAC: 1390 1.1 mrg def_reg = SET_DEST (PATTERN (producer)); 1391 1.1 mrg break; 1392 1.1 mrg 1393 1.1 mrg case TYPE_DIV: 1394 1.1 mrg if (divmod_p (producer)) 1395 1.1 mrg { 1396 1.1 mrg rtx def_reg1 = SET_DEST (parallel_element (producer, 0)); 1397 1.1 mrg rtx def_reg2 = SET_DEST (parallel_element (producer, 1)); 1398 1.1 mrg 1399 1.1 mrg return (e8_consumed_by_addr_in_p (consumer, def_reg1) 1400 1.1 mrg || e8_consumed_by_addr_in_p (consumer, def_reg2)); 1401 1.1 mrg } 1402 1.1 mrg 1403 1.1 mrg def_reg = SET_DEST (PATTERN (producer)); 1404 1.1 mrg break; 1405 1.1 mrg 1406 1.1 mrg case TYPE_LOAD: 1407 1.1 mrg case TYPE_STORE: 1408 1.1 mrg case TYPE_LOAD_MULTIPLE: 1409 1.1 mrg case TYPE_STORE_MULTIPLE: 1410 1.1 mrg if (!post_update_insn_p (producer)) 1411 1.1 mrg return false; 1412 1.1 mrg 1413 1.1 mrg def_reg = extract_base_reg (producer); 1414 1.1 mrg break; 1415 1.1 mrg 1416 1.1 mrg default: 1417 1.1 mrg gcc_unreachable (); 1418 1.1 mrg } 1419 1.1 mrg 1420 1.1 mrg return e8_consumed_by_addr_in_p (consumer, def_reg); 1421 1.1 mrg } 1422 1.1 mrg 1423 1.1 mrg bool 1424 1.1 mrg nds32_e8_last_load_to_ii_p (rtx_insn *producer, rtx_insn *consumer) 1425 1.1 mrg { 1426 1.1 mrg rtx last_def_reg = extract_nth_access_reg (producer, -1); 1427 1.1 mrg 1428 1.1 mrg if (last_def_reg == NULL_RTX) 1429 1.1 mrg return false; 1430 1.1 mrg 1431 1.1 mrg gcc_assert (REG_P (last_def_reg) || GET_CODE (last_def_reg) == SUBREG); 1432 1.1 mrg 1433 1.1 mrg return e8_consumed_by_addr_in_p (consumer, last_def_reg); 1434 1.1 mrg } 1435 1.1 mrg 1436 1.1 mrg bool 1437 1.1 mrg nds32_e8_last_load_to_ex_p (rtx_insn *producer, rtx_insn *consumer) 1438 1.1 mrg { 1439 1.1 mrg rtx last_def_reg = extract_nth_access_reg (producer, -1); 1440 1.1 mrg 1441 1.1 mrg if (last_def_reg == NULL_RTX) 1442 1.1 mrg return false; 1443 1.1 mrg 1444 1.1 mrg gcc_assert (REG_P (last_def_reg) || GET_CODE (last_def_reg) == SUBREG); 1445 1.1 mrg 1446 1.1 mrg return e8_consumed_by_ex_p (consumer, last_def_reg); 1447 1.1 mrg } 1448 1.1 mrg 1449 1.1 mrg /* Guard functions for N9 cores. */ 1450 1.1 mrg 1451 1.1 mrg /* Check dependencies from MM to EX. */ 1452 1.1 mrg bool 1453 1.1 mrg nds32_n9_2r1w_mm_to_ex_p (rtx_insn *producer, rtx_insn *consumer) 1454 1.1 mrg { 1455 1.1 mrg rtx def_reg; 1456 1.1 mrg 1457 1.1 mrg switch (get_attr_type (producer)) 1458 1.1 mrg { 1459 1.1 mrg /* LD_!bi */ 1460 1.1 mrg case TYPE_LOAD: 1461 1.1 mrg if (post_update_insn_p (producer)) 1462 1.1 mrg return false; 1463 1.1 mrg 1464 1.1 mrg def_reg = SET_DEST (PATTERN (producer)); 1465 1.1 mrg break; 1466 1.1 mrg 1467 1.1 mrg case TYPE_MUL: 1468 1.1 mrg case TYPE_MAC: 1469 1.1 mrg def_reg = SET_DEST (PATTERN (producer)); 1470 1.1 mrg break; 1471 1.1 mrg 1472 1.1 mrg default: 1473 1.1 mrg gcc_unreachable (); 1474 1.1 mrg } 1475 1.1 mrg 1476 1.1 mrg return n9_2r1w_consumed_by_ex_dep_p (consumer, def_reg); 1477 1.1 mrg } 1478 1.1 mrg 1479 1.1 mrg /* Check dependencies from MM to EX. */ 1480 1.1 mrg bool 1481 1.1 mrg nds32_n9_3r2w_mm_to_ex_p (rtx_insn *producer, rtx_insn *consumer) 1482 1.1 mrg { 1483 1.1 mrg rtx def_reg; 1484 1.1 mrg 1485 1.1 mrg switch (get_attr_type (producer)) 1486 1.1 mrg { 1487 1.1 mrg case TYPE_LOAD: 1488 1.1 mrg case TYPE_MUL: 1489 1.1 mrg case TYPE_MAC: 1490 1.1 mrg def_reg = SET_DEST (PATTERN (producer)); 1491 1.1 mrg break; 1492 1.1 mrg 1493 1.1 mrg /* Some special instructions, divmodsi4 and udivmodsi4, produce two 1494 1.1 mrg results, the quotient and the remainder. We have to handle them 1495 1.1 mrg individually. */ 1496 1.1 mrg case TYPE_DIV: 1497 1.1 mrg if (divmod_p (producer)) 1498 1.1 mrg { 1499 1.1 mrg rtx def_reg1 = SET_DEST (parallel_element (producer, 0)); 1500 1.1 mrg rtx def_reg2 = SET_DEST (parallel_element (producer, 1)); 1501 1.1 mrg 1502 1.1 mrg return (n9_3r2w_consumed_by_ex_dep_p (consumer, def_reg1) 1503 1.1 mrg || n9_3r2w_consumed_by_ex_dep_p (consumer, def_reg2)); 1504 1.1 mrg } 1505 1.1 mrg 1506 1.1 mrg def_reg = SET_DEST (PATTERN (producer)); 1507 1.1 mrg break; 1508 1.1 mrg 1509 1.1 mrg default: 1510 1.1 mrg gcc_unreachable (); 1511 1.1 mrg } 1512 1.1 mrg 1513 1.1 mrg return n9_3r2w_consumed_by_ex_dep_p (consumer, def_reg); 1514 1.1 mrg } 1515 1.1 mrg 1516 1.1 mrg /* Check dependencies from LMW(N, N) to EX. */ 1517 1.1 mrg bool 1518 1.1 mrg nds32_n9_last_load_to_ex_p (rtx_insn *producer, rtx_insn *consumer) 1519 1.1 mrg { 1520 1.1 mrg rtx last_def_reg = extract_nth_access_reg (producer, -1); 1521 1.1 mrg 1522 1.1 mrg if (nds32_register_ports_config == REG_PORT_2R1W) 1523 1.1 mrg { 1524 1.1 mrg /* The base-update micro operation occupies the last cycle. */ 1525 1.1 mrg if (post_update_insn_p (producer)) 1526 1.1 mrg return false; 1527 1.1 mrg 1528 1.1 mrg /* When the base register is in the list of a load multiple insn and the 1529 1.1 mrg access order of the base register is not the last one, we need an 1530 1.1 mrg additional micro operation to commit the load result to the base 1531 1.1 mrg register -- we can treat the base register as the last defined 1532 1.1 mrg register. */ 1533 1.1 mrg size_t i; 1534 1.1 mrg size_t n_elems = parallel_elements (producer); 1535 1.1 mrg rtx base_reg = extract_base_reg (producer); 1536 1.1 mrg 1537 1.1 mrg for (i = 0; i < n_elems; ++i) 1538 1.1 mrg { 1539 1.1 mrg rtx load_rtx = extract_nth_access_rtx (producer, i); 1540 1.1 mrg rtx list_element = SET_DEST (load_rtx); 1541 1.1 mrg 1542 1.1 mrg if (rtx_equal_p (base_reg, list_element) && i != n_elems - 1) 1543 1.1 mrg { 1544 1.1 mrg last_def_reg = base_reg; 1545 1.1 mrg break; 1546 1.1 mrg } 1547 1.1 mrg } 1548 1.1 mrg 1549 1.1 mrg return n9_2r1w_consumed_by_ex_dep_p (consumer, last_def_reg); 1550 1.1 mrg } 1551 1.1 mrg else 1552 1.1 mrg return n9_3r2w_consumed_by_ex_dep_p (consumer, last_def_reg); 1553 1.1 mrg } 1554 1.1 mrg 1555 1.1 mrg /* Guard functions for N10 cores. */ 1556 1.1 mrg 1557 1.1 mrg /* Check dependencies from EX to EX (ADDR_OUT -> ADDR_IN). */ 1558 1.1 mrg bool 1559 1.1 mrg nds32_n10_ex_to_ex_p (rtx_insn *producer, rtx_insn *consumer) 1560 1.1 mrg { 1561 1.1 mrg gcc_assert (get_attr_type (producer) == TYPE_FLOAD 1562 1.1 mrg || get_attr_type (producer) == TYPE_FSTORE); 1563 1.1 mrg gcc_assert (get_attr_type (consumer) == TYPE_FLOAD 1564 1.1 mrg || get_attr_type (consumer) == TYPE_FSTORE); 1565 1.1 mrg 1566 1.1 mrg if (!post_update_insn_p (producer)) 1567 1.1 mrg return false; 1568 1.1 mrg 1569 1.1 mrg return reg_overlap_p (extract_base_reg (producer), 1570 1.1 mrg extract_mem_rtx (consumer)); 1571 1.1 mrg } 1572 1.1 mrg 1573 1.1 mrg /* Check dependencies from MM to EX. */ 1574 1.1 mrg bool 1575 1.1 mrg nds32_n10_mm_to_ex_p (rtx_insn *producer, rtx_insn *consumer) 1576 1.1 mrg { 1577 1.1 mrg rtx def_reg; 1578 1.1 mrg 1579 1.1 mrg switch (get_attr_type (producer)) 1580 1.1 mrg { 1581 1.1 mrg case TYPE_LOAD: 1582 1.1 mrg case TYPE_MUL: 1583 1.1 mrg case TYPE_MAC: 1584 1.1 mrg case TYPE_DALU64: 1585 1.1 mrg case TYPE_DMUL: 1586 1.1 mrg case TYPE_DMAC: 1587 1.1 mrg case TYPE_DALUROUND: 1588 1.1 mrg case TYPE_DBPICK: 1589 1.1 mrg case TYPE_DWEXT: 1590 1.1 mrg def_reg = SET_DEST (PATTERN (producer)); 1591 1.1 mrg break; 1592 1.1 mrg 1593 1.1 mrg /* Some special instructions, divmodsi4 and udivmodsi4, produce two 1594 1.1 mrg results, the quotient and the remainder. We have to handle them 1595 1.1 mrg individually. */ 1596 1.1 mrg case TYPE_DIV: 1597 1.1 mrg if (divmod_p (producer)) 1598 1.1 mrg { 1599 1.1 mrg rtx def_reg1 = SET_DEST (parallel_element (producer, 0)); 1600 1.1 mrg rtx def_reg2 = SET_DEST (parallel_element (producer, 1)); 1601 1.1 mrg 1602 1.1 mrg return (n10_consumed_by_ex_dep_p (consumer, def_reg1) 1603 1.1 mrg || n10_consumed_by_ex_dep_p (consumer, def_reg2)); 1604 1.1 mrg } 1605 1.1 mrg 1606 1.1 mrg def_reg = SET_DEST (PATTERN (producer)); 1607 1.1 mrg break; 1608 1.1 mrg 1609 1.1 mrg default: 1610 1.1 mrg gcc_unreachable (); 1611 1.1 mrg } 1612 1.1 mrg 1613 1.1 mrg return n10_consumed_by_ex_dep_p (consumer, def_reg); 1614 1.1 mrg } 1615 1.1 mrg 1616 1.1 mrg /* Check dependencies from LMW(N, N) to EX. */ 1617 1.1 mrg bool 1618 1.1 mrg nds32_n10_last_load_to_ex_p (rtx_insn *producer, rtx_insn *consumer) 1619 1.1 mrg { 1620 1.1 mrg rtx last_def_reg = extract_nth_access_reg (producer, -1); 1621 1.1 mrg 1622 1.1 mrg return n10_consumed_by_ex_dep_p (consumer, last_def_reg); 1623 1.1 mrg } 1624 1.1 mrg 1625 1.1 mrg /* Guard functions for Graywolf cores. */ 1626 1.1 mrg 1627 1.1 mrg /* Check dependencies from EX to EX (ADDR_OUT -> ADDR_IN). */ 1628 1.1 mrg bool 1629 1.1 mrg nds32_gw_ex_to_ex_p (rtx_insn *producer, rtx_insn *consumer) 1630 1.1 mrg { 1631 1.1 mrg return nds32_n10_ex_to_ex_p (producer, consumer); 1632 1.1 mrg } 1633 1.1 mrg 1634 1.1 mrg /* Check dependencies from MM to EX. */ 1635 1.1 mrg bool 1636 1.1 mrg nds32_gw_mm_to_ex_p (rtx_insn *producer, rtx_insn *consumer) 1637 1.1 mrg { 1638 1.1 mrg rtx def_reg; 1639 1.1 mrg 1640 1.1 mrg switch (get_attr_type (producer)) 1641 1.1 mrg { 1642 1.1 mrg case TYPE_LOAD: 1643 1.1 mrg case TYPE_MUL: 1644 1.1 mrg case TYPE_MAC: 1645 1.1 mrg case TYPE_DALU64: 1646 1.1 mrg case TYPE_DMUL: 1647 1.1 mrg case TYPE_DMAC: 1648 1.1 mrg case TYPE_DALUROUND: 1649 1.1 mrg case TYPE_DBPICK: 1650 1.1 mrg case TYPE_DWEXT: 1651 1.1 mrg def_reg = SET_DEST (PATTERN (producer)); 1652 1.1 mrg break; 1653 1.1 mrg 1654 1.1 mrg /* Some special instructions, divmodsi4 and udivmodsi4, produce two 1655 1.1 mrg results, the quotient and the remainder. We have to handle them 1656 1.1 mrg individually. */ 1657 1.1 mrg case TYPE_DIV: 1658 1.1 mrg if (divmod_p (producer)) 1659 1.1 mrg { 1660 1.1 mrg rtx def_reg1 = SET_DEST (parallel_element (producer, 0)); 1661 1.1 mrg rtx def_reg2 = SET_DEST (parallel_element (producer, 1)); 1662 1.1 mrg 1663 1.1 mrg return (gw_consumed_by_ex_dep_p (consumer, def_reg1) 1664 1.1 mrg || gw_consumed_by_ex_dep_p (consumer, def_reg2)); 1665 1.1 mrg } 1666 1.1 mrg 1667 1.1 mrg def_reg = SET_DEST (PATTERN (producer)); 1668 1.1 mrg break; 1669 1.1 mrg 1670 1.1 mrg default: 1671 1.1 mrg gcc_unreachable (); 1672 1.1 mrg } 1673 1.1 mrg 1674 1.1 mrg return gw_consumed_by_ex_dep_p (consumer, def_reg); 1675 1.1 mrg } 1676 1.1 mrg 1677 1.1 mrg /* Check dependencies from LMW(N, N) to EX. */ 1678 1.1 mrg bool 1679 1.1 mrg nds32_gw_last_load_to_ex_p (rtx_insn *producer, rtx_insn *consumer) 1680 1.1 mrg { 1681 1.1 mrg rtx last_def_reg = extract_nth_access_reg (producer, -1); 1682 1.1 mrg 1683 1.1 mrg return gw_consumed_by_ex_dep_p (consumer, last_def_reg); 1684 1.1 mrg } 1685 1.1 mrg 1686 1.1 mrg /* Guard functions for N12/N13 cores. */ 1687 1.1 mrg 1688 1.1 mrg /* Check dependencies from E2 to E1. */ 1689 1.1 mrg bool 1690 1.1 mrg nds32_n13_e2_to_e1_p (rtx_insn *producer, rtx_insn *consumer) 1691 1.1 mrg { 1692 1.1 mrg rtx def_reg; 1693 1.1 mrg 1694 1.1 mrg switch (get_attr_type (producer)) 1695 1.1 mrg { 1696 1.1 mrg /* Only post-update load/store instructions are considered. These 1697 1.1 mrg instructions produces address output at E2. */ 1698 1.1 mrg case TYPE_LOAD: 1699 1.1 mrg case TYPE_STORE: 1700 1.1 mrg case TYPE_LOAD_MULTIPLE: 1701 1.1 mrg case TYPE_STORE_MULTIPLE: 1702 1.1 mrg if (!post_update_insn_p (producer)) 1703 1.1 mrg return false; 1704 1.1 mrg 1705 1.1 mrg def_reg = extract_base_reg (producer); 1706 1.1 mrg break; 1707 1.1 mrg 1708 1.1 mrg case TYPE_ALU: 1709 1.1 mrg case TYPE_ALU_SHIFT: 1710 1.1 mrg case TYPE_PBSAD: 1711 1.1 mrg case TYPE_PBSADA: 1712 1.1 mrg case TYPE_MUL: 1713 1.1 mrg case TYPE_MAC: 1714 1.1 mrg def_reg = SET_DEST (PATTERN (producer)); 1715 1.1 mrg break; 1716 1.1 mrg 1717 1.1 mrg case TYPE_BRANCH: 1718 1.1 mrg return true; 1719 1.1 mrg 1720 1.1 mrg case TYPE_DIV: 1721 1.1 mrg /* Some special instructions, divmodsi4 and udivmodsi4, produce two 1722 1.1 mrg results, the quotient and the remainder. We have to handle them 1723 1.1 mrg individually. */ 1724 1.1 mrg if (divmod_p (producer)) 1725 1.1 mrg { 1726 1.1 mrg rtx def_reg1 = SET_DEST (parallel_element (producer, 0)); 1727 1.1 mrg rtx def_reg2 = SET_DEST (parallel_element (producer, 1)); 1728 1.1 mrg 1729 1.1 mrg return (n13_consumed_by_e1_dep_p (consumer, def_reg1) 1730 1.1 mrg || n13_consumed_by_e1_dep_p (consumer, def_reg2)); 1731 1.1 mrg } 1732 1.1 mrg 1733 1.1 mrg def_reg = SET_DEST (PATTERN (producer)); 1734 1.1 mrg break; 1735 1.1 mrg 1736 1.1 mrg default: 1737 1.1 mrg gcc_unreachable (); 1738 1.1 mrg } 1739 1.1 mrg 1740 1.1 mrg return n13_consumed_by_e1_dep_p (consumer, def_reg); 1741 1.1 mrg } 1742 1.1 mrg 1743 1.1 mrg /* Check dependencies from Load-Store Unit (E3) to E1. */ 1744 1.1 mrg bool 1745 1.1 mrg nds32_n13_load_to_e1_p (rtx_insn *producer, rtx_insn *consumer) 1746 1.1 mrg { 1747 1.1 mrg rtx def_reg = SET_DEST (PATTERN (producer)); 1748 1.1 mrg 1749 1.1 mrg gcc_assert (get_attr_type (producer) == TYPE_LOAD); 1750 1.1 mrg gcc_assert (REG_P (def_reg) || GET_CODE (def_reg) == SUBREG); 1751 1.1 mrg 1752 1.1 mrg return n13_consumed_by_e1_dep_p (consumer, def_reg); 1753 1.1 mrg } 1754 1.1 mrg 1755 1.1 mrg /* Check dependencies from Load-Store Unit (E3) to E2. */ 1756 1.1 mrg bool 1757 1.1 mrg nds32_n13_load_to_e2_p (rtx_insn *producer, rtx_insn *consumer) 1758 1.1 mrg { 1759 1.1 mrg rtx def_reg = SET_DEST (PATTERN (producer)); 1760 1.1 mrg 1761 1.1 mrg gcc_assert (get_attr_type (producer) == TYPE_LOAD); 1762 1.1 mrg gcc_assert (REG_P (def_reg) || GET_CODE (def_reg) == SUBREG); 1763 1.1 mrg 1764 1.1 mrg return n13_consumed_by_e2_dep_p (consumer, def_reg); 1765 1.1 mrg } 1766 1.1 mrg 1767 1.1 mrg /* Check dependencies from LMW(N, N) to E1. */ 1768 1.1 mrg bool 1769 1.1 mrg nds32_n13_last_load_to_e1_p (rtx_insn *producer, rtx_insn *consumer) 1770 1.1 mrg { 1771 1.1 mrg rtx last_def_reg = extract_nth_access_reg (producer, -1); 1772 1.1 mrg 1773 1.1 mrg return n13_consumed_by_e1_dep_p (consumer, last_def_reg); 1774 1.1 mrg } 1775 1.1 mrg 1776 1.1 mrg /* Check dependencies from LMW(N, N) to E2. */ 1777 1.1 mrg bool 1778 1.1 mrg nds32_n13_last_load_to_e2_p (rtx_insn *producer, rtx_insn *consumer) 1779 1.1 mrg { 1780 1.1 mrg rtx last_def_reg = extract_nth_access_reg (producer, -1); 1781 1.1 mrg 1782 1.1 mrg return n13_consumed_by_e2_dep_p (consumer, last_def_reg); 1783 1.1 mrg } 1784 1.1 mrg 1785 1.1 mrg /* Check dependencies from LMW(N, N-1) to E2. */ 1786 1.1 mrg bool 1787 1.1 mrg nds32_n13_last_two_load_to_e1_p (rtx_insn *producer, rtx_insn *consumer) 1788 1.1 mrg { 1789 1.1 mrg rtx last_two_def_reg = extract_nth_access_reg (producer, -2); 1790 1.1 mrg 1791 1.1 mrg if (last_two_def_reg == NULL_RTX) 1792 1.1 mrg return false; 1793 1.1 mrg 1794 1.1 mrg return n13_consumed_by_e1_dep_p (consumer, last_two_def_reg); 1795 1.1 mrg } 1796 1.1 mrg /* ------------------------------------------------------------------------ */ 1797