diff options
author | Richard Sandiford <richard.sandiford@arm.com> | 2015-06-14 20:25:40 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2015-06-14 20:25:40 +0000 |
commit | 3beaff21f346c7f34bf45f7b56f2c1c880a91e31 (patch) | |
tree | 5c9473ab1cc9660cc825b2a8b95569ab4d1e7cc6 /gcc/rtl.c | |
parent | b25b4ed2b7010c0d36474b4caf3f7fe1a094095c (diff) | |
download | gcc-3beaff21f346c7f34bf45f7b56f2c1c880a91e31.zip gcc-3beaff21f346c7f34bf45f7b56f2c1c880a91e31.tar.gz gcc-3beaff21f346c7f34bf45f7b56f2c1c880a91e31.tar.bz2 |
rtl.h (classify_insn): Declare.
gcc/
* rtl.h (classify_insn): Declare.
* emit-rtl.c (classify_insn): Move to...
* rtl.c: ...here and add generator support.
* gensupport.h (get_emit_function, needs_barrier_p): Declare.
* gensupport.c (get_emit_function, needs_barrier_p): New functions.
* genemit.c (gen_emit_seq): New function.
(gen_expand, gen_split): Use it.
From-SVN: r224470
Diffstat (limited to 'gcc/rtl.c')
-rw-r--r-- | gcc/rtl.c | 48 |
1 files changed, 48 insertions, 0 deletions
@@ -657,6 +657,54 @@ rtx_equal_p (const_rtx x, const_rtx y) return 1; } +/* Return an indication of which type of insn should have X as a body. + In generator files, this can be UNKNOWN if the answer is only known + at (GCC) runtime. Otherwise the value is CODE_LABEL, INSN, CALL_INSN + or JUMP_INSN. */ + +enum rtx_code +classify_insn (rtx x) +{ + if (LABEL_P (x)) + return CODE_LABEL; + if (GET_CODE (x) == CALL) + return CALL_INSN; + if (ANY_RETURN_P (x)) + return JUMP_INSN; + if (GET_CODE (x) == SET) + { + if (GET_CODE (SET_DEST (x)) == PC) + return JUMP_INSN; + else if (GET_CODE (SET_SRC (x)) == CALL) + return CALL_INSN; + else + return INSN; + } + if (GET_CODE (x) == PARALLEL) + { + int j; + for (j = XVECLEN (x, 0) - 1; j >= 0; j--) + if (GET_CODE (XVECEXP (x, 0, j)) == CALL) + return CALL_INSN; + else if (GET_CODE (XVECEXP (x, 0, j)) == SET + && GET_CODE (SET_DEST (XVECEXP (x, 0, j))) == PC) + return JUMP_INSN; + else if (GET_CODE (XVECEXP (x, 0, j)) == SET + && GET_CODE (SET_SRC (XVECEXP (x, 0, j))) == CALL) + return CALL_INSN; + } +#ifdef GENERATOR_FILE + if (GET_CODE (x) == MATCH_OPERAND + || GET_CODE (x) == MATCH_OPERATOR + || GET_CODE (x) == MATCH_PARALLEL + || GET_CODE (x) == MATCH_OP_DUP + || GET_CODE (x) == MATCH_DUP + || GET_CODE (x) == PARALLEL) + return UNKNOWN; +#endif + return INSN; +} + void dump_rtx_statistics (void) { |