diff options
| author | law <law@138bc75d-0d04-0410-961f-82ee72b054a4> | 1997-08-01 17:23:22 +0000 |
|---|---|---|
| committer | law <law@138bc75d-0d04-0410-961f-82ee72b054a4> | 1997-08-01 17:23:22 +0000 |
| commit | b41266d449203a4d8079e2ade5f4a0e98d22a1fd (patch) | |
| tree | b02e1ac8541971f29aa038e74a0a354e4a7e5ec9 | |
| parent | 003da05eab7f2bea269d80ed1c9007e75a683c32 (diff) | |
| download | ppe42-gcc-b41266d449203a4d8079e2ade5f4a0e98d22a1fd.tar.gz ppe42-gcc-b41266d449203a4d8079e2ade5f4a0e98d22a1fd.zip | |
* pa.c (pa_reorg): Explode ADDR_DIFF_VEC insns too.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@14577 138bc75d-0d04-0410-961f-82ee72b054a4
| -rw-r--r-- | gcc/config/pa/pa.c | 38 |
1 files changed, 26 insertions, 12 deletions
diff --git a/gcc/config/pa/pa.c b/gcc/config/pa/pa.c index db6c4957489..b1b9d9dc1bc 100644 --- a/gcc/config/pa/pa.c +++ b/gcc/config/pa/pa.c @@ -5809,16 +5809,17 @@ pa_reorg (insns) /* This is fairly cheap, so always run it if optimizing. */ if (optimize > 0 && !TARGET_BIG_SWITCH) { - /* Find and explode all ADDR_VEC insns. */ + /* Find and explode all ADDR_VEC or ADDR_DIFF_VEC insns. */ insns = get_insns (); for (insn = insns; insn; insn = NEXT_INSN (insn)) { rtx pattern, tmp, location; unsigned int length, i; - /* Find an ADDR_VEC insn to explode. */ + /* Find an ADDR_VEC or ADDR_DIFF_VEC insn to explode. */ if (GET_CODE (insn) != JUMP_INSN - || GET_CODE (PATTERN (insn)) != ADDR_VEC) + || (GET_CODE (PATTERN (insn)) != ADDR_VEC + && GET_CODE (PATTERN (insn)) != ADDR_DIFF_VEC)) continue; /* If needed, emit marker for the beginning of the branch table. */ @@ -5827,7 +5828,7 @@ pa_reorg (insns) pattern = PATTERN (insn); location = PREV_INSN (insn); - length = XVECLEN (pattern, 0); + length = XVECLEN (pattern, GET_CODE (pattern) == ADDR_DIFF_VEC); for (i = 0; i < length; i++) { @@ -5838,12 +5839,24 @@ pa_reorg (insns) emit_label_after (tmp, location); location = NEXT_INSN (location); - /* Emit the jump itself. */ - tmp = gen_switch_jump (XEXP (XVECEXP (pattern, 0, i), 0)); - tmp = emit_jump_insn_after (tmp, location); - JUMP_LABEL (tmp) = XEXP (XVECEXP (pattern, 0, i), 0); - LABEL_NUSES (JUMP_LABEL (tmp))++; - location = NEXT_INSN (location); + if (GET_CODE (pattern) == ADDR_VEC) + { + /* Emit the jump itself. */ + tmp = gen_switch_jump (XEXP (XVECEXP (pattern, 0, i), 0)); + tmp = emit_jump_insn_after (tmp, location); + JUMP_LABEL (tmp) = XEXP (XVECEXP (pattern, 0, i), 0); + LABEL_NUSES (JUMP_LABEL (tmp))++; + location = NEXT_INSN (location); + } + else + { + /* Emit the jump itself. */ + tmp = gen_switch_jump (XEXP (XVECEXP (pattern, 1, i), 0)); + tmp = emit_jump_insn_after (tmp, location); + JUMP_LABEL (tmp) = XEXP (XVECEXP (pattern, 1, i), 0); + LABEL_NUSES (JUMP_LABEL (tmp))++; + location = NEXT_INSN (location); + } /* Emit a BARRIER after the jump. */ emit_barrier_after (location); @@ -5858,7 +5871,7 @@ pa_reorg (insns) emit_barrier_after (location); } - /* Delete the ADDR_VEC. */ + /* Delete the ADDR_VEC or ADDR_DIFF_VEC. */ delete_insn (insn); } } @@ -5870,7 +5883,8 @@ pa_reorg (insns) { /* Find an ADDR_VEC insn. */ if (GET_CODE (insn) != JUMP_INSN - || GET_CODE (PATTERN (insn)) != ADDR_VEC) + || (GET_CODE (PATTERN (insn)) != ADDR_VEC + && GET_CODE (PATTERN (insn)) != ADDR_DIFF_VEC)) continue; /* Now generate markers for the beginning and end of the |

