diff options
-rw-r--r-- | gas/ChangeLog | 4 | ||||
-rw-r--r-- | gas/config/tc-xtensa.c | 7 | ||||
-rw-r--r-- | gas/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gas/testsuite/gas/xtensa/all.exp | 4 | ||||
-rw-r--r-- | gas/testsuite/gas/xtensa/short_branch_offset.d | 34 | ||||
-rw-r--r-- | gas/testsuite/gas/xtensa/short_branch_offset.s | 24 |
6 files changed, 75 insertions, 4 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index 1c74fa6..c2ade55 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,7 @@ +2004-11-11 Bob Wilson <bob.wilson@acm.org> + + * config/tc-xtensa.c (MAX_IMMED6): Change value to 65. + 2004-11-10 Bob Wilson <bob.wilson@acm.org> * config/tc-xtensa.c (update_next_frag_state): Always add a NOP if diff --git a/gas/config/tc-xtensa.c b/gas/config/tc-xtensa.c index 11bd872..8f36230 100644 --- a/gas/config/tc-xtensa.c +++ b/gas/config/tc-xtensa.c @@ -7242,8 +7242,11 @@ xtensa_mark_narrow_branches (void) use for alignment narrow branches that definitely will not expand to a jump and a branch. These functions find and mark these cases. */ -/* the range in bytes of a bnez.n and beqz.n */ -#define MAX_IMMED6 68 +/* The range in bytes of BNEZ.N and BEQZ.N. The target operand is encoded + as PC + 4 + imm6, where imm6 is a 6-bit immediate ranging from 0 to 63. + We start counting beginning with the frag after the 2-byte branch, so the + maximum offset is (4 - 2) + 63 = 65. */ +#define MAX_IMMED6 65 static size_t unrelaxed_frag_max_size (fragS *); diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index fe960ea..b5c94fc 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2004-11-11 Bob Wilson <bob.wilson@acm.org> + + * gas/xtensa/short_branch_offset.s: New. + * gas/xtensa/short_branch_offset.d: New. + * gas/xtensa/all.exp: Run new test. + 2004-11-10 Alan Modra <amodra@bigpond.net.au> * gas/i386/opcode.s: Pad section. diff --git a/gas/testsuite/gas/xtensa/all.exp b/gas/testsuite/gas/xtensa/all.exp index 2077301..89b3cdf 100644 --- a/gas/testsuite/gas/xtensa/all.exp +++ b/gas/testsuite/gas/xtensa/all.exp @@ -78,9 +78,9 @@ if [istarget xtensa*-*-*] then { objdump_finish if [all_ones $x1] then { pass $testname } else { fail $testname } - + run_dump_test "short_branch_offset" } if [info exists errorInfo] then { unset errorInfo - } +} diff --git a/gas/testsuite/gas/xtensa/short_branch_offset.d b/gas/testsuite/gas/xtensa/short_branch_offset.d new file mode 100644 index 0000000..0d95a7c --- /dev/null +++ b/gas/testsuite/gas/xtensa/short_branch_offset.d @@ -0,0 +1,34 @@ +# as: --no-target-align +# objdump: -d + +# Test that a short branch with a target just barely out of range does +# not crash the assembler. + +.*: +file format elf32-xtensa-.* + +Disassembly of section .text: + +00000000 <.text>: + 0: .* bnez a2, 0x45 + 3: .* nop + 6: .* nop + 9: .* nop + c: .* nop + f: .* nop + 12: .* nop + 15: .* nop + 18: .* nop + 1b: .* nop + 1e: .* nop + 21: .* nop + 24: .* nop + 27: .* nop + 2a: .* nop + 2d: .* nop + 30: .* nop + 33: .* nop + 36: .* nop + 39: .* nop + 3c: .* nop + 3f: .* nop + 42: .* nop diff --git a/gas/testsuite/gas/xtensa/short_branch_offset.s b/gas/testsuite/gas/xtensa/short_branch_offset.s new file mode 100644 index 0000000..df2489f --- /dev/null +++ b/gas/testsuite/gas/xtensa/short_branch_offset.s @@ -0,0 +1,24 @@ + bnez.n a2, .Lplus68 + _nop + _nop + _nop + _nop + _nop + _nop + _nop + _nop + _nop + _nop + _nop + _nop + _nop + _nop + _nop + _nop + _nop + _nop + _nop + _nop + _nop + _nop +.Lplus68: |