diff options
author | Trevor Smigiel <Trevor_Smigiel@playstation.sony.com> | 2009-04-27 19:33:20 +0000 |
---|---|---|
committer | Trevor Smigiel <tsmigiel@gcc.gnu.org> | 2009-04-27 19:33:20 +0000 |
commit | 6e37f6d40e022a814b1a73fa1da5ec60435a507b (patch) | |
tree | 06553370944c941df2b625ed60790792443adf01 | |
parent | 060717fcc525d6efd6e7fcafc6bde59d5fa52e50 (diff) | |
download | gcc-6e37f6d40e022a814b1a73fa1da5ec60435a507b.zip gcc-6e37f6d40e022a814b1a73fa1da5ec60435a507b.tar.gz gcc-6e37f6d40e022a814b1a73fa1da5ec60435a507b.tar.bz2 |
spu.c (spu_machine_dependent_reorg): Make sure branch label on hint instruction is correct.
* spu.c (spu_machine_dependent_reorg): Make sure branch label on hint
instruction is correct.
From-SVN: r146852
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/spu/spu.c | 19 |
2 files changed, 25 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 013c0fc..b8d331b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 2009-04-27 Trevor Smigiel <trevor_smigiel@playstation.sony.com> + * spu.c (spu_machine_dependent_reorg): Make sure branch label on hint + instruction is correct. + + +2009-04-27 Trevor Smigiel <trevor_smigiel@playstation.sony.com> + Allow non-constant arguments to conversion intrinsics. * spu-protos.h (exp2_immediate_p, spu_gen_exp2): Declare. * predicates.md (spu_inv_exp2_operand, spu_exp2_operand): New. diff --git a/gcc/config/spu/spu.c b/gcc/config/spu/spu.c index 56abdf8..20d769e 100644 --- a/gcc/config/spu/spu.c +++ b/gcc/config/spu/spu.c @@ -2764,6 +2764,25 @@ spu_machine_dependent_reorg (void) pad_bb (); + for (insn = get_insns (); insn; insn = NEXT_INSN (insn)) + if (NONJUMP_INSN_P (insn) && INSN_CODE (insn) == CODE_FOR_hbr) + { + /* Adjust the LABEL_REF in a hint when we have inserted a nop + between its branch label and the branch . We don't move the + label because GCC expects it at the beginning of the block. */ + rtx unspec = SET_SRC (XVECEXP (PATTERN (insn), 0, 0)); + rtx label_ref = XVECEXP (unspec, 0, 0); + rtx label = XEXP (label_ref, 0); + rtx branch; + int offset = 0; + for (branch = NEXT_INSN (label); + !JUMP_P (branch) && !CALL_P (branch); + branch = NEXT_INSN (branch)) + if (NONJUMP_INSN_P (branch)) + offset += get_attr_length (branch); + if (offset > 0) + XVECEXP (unspec, 0, 0) = plus_constant (label_ref, offset); + } if (spu_flag_var_tracking) { |