Ralf Baechle wrote: > Below little test case demonstrates a gas bug that results in swapping > of the two branch instructions and use of bogus destination addresses > for the first of the two branches. > > [ralf@lappi tmp]$ cat s.s > 1: beqzl $2, 1b > beq $4, $5, 1b > [ralf@lappi tmp]$ mips-linux-as -mips2 -o s.o s.s > [ralf@lappi tmp]$ mips-linux-objdump -d s.o > > s.o: file format elf32-tradbigmips > > Disassembly of section .text: > > 00000000 <.text>: > 0: 1085ffff beq a0,a1,0x0 > 4: 00000000 nop > 8: 50400000 beqzl v0,0xc > c: 00000000 nop I applied the appended patch. Daniel, I think this should also go in the branch. Thiemo /gas/ChangeLog 2004-08-18 Thiemo Seufer <seufer@xxxxxxxxxxxxxxxxxxxxxxxx> * config/tc-mips.c (append_insn): Handle delay slots in branch likely correctly. /gas/testsuite/ChangeLog 2004-08-18 Thiemo Seufer <seufer@xxxxxxxxxxxxxxxxxxxxxxxx> * gas/mips/branch-swap.s: New testcase. * gas/mips/branch-swap.d: New testcase. * gas/mips/mips.exp: Run the testcase. --- gas/config/tc-mips.c.old 2004-05-17 21:36:10.000000000 +0200 +++ gas/config/tc-mips.c 2004-08-17 20:00:43.000000000 +0200 @@ -2708,6 +2708,7 @@ append_insn (struct mips_cl_insn *ip, ex prev_insn_reloc_type[1] = BFD_RELOC_UNUSED; prev_insn_reloc_type[2] = BFD_RELOC_UNUSED; prev_insn_extended = 0; + prev_insn_is_delay_slot = 1; } else { --- gas/testsuite/gas/mips/mips.exp.old 2004-08-17 22:50:38.000000000 +0200 +++ gas/testsuite/gas/mips/mips.exp 2004-08-18 14:53:43.000000000 +0200 @@ -429,6 +429,7 @@ if { [istarget mips*-*-*] } then { run_dump_test_arches "branch-misc-1" [mips_arch_list_matching mips1] run_list_test_arches "branch-misc-2" "-32 -non_shared" [mips_arch_list_matching mips1] run_list_test_arches "branch-misc-2pic" "-32 -call_shared" [mips_arch_list_matching mips1] + run_dump_test "branch-swap" if $ilocks { run_dump_test "div-ilocks" --- gas/testsuite/gas/mips/branch-swap.s.old 1970-01-01 01:00:00.000000000 +0100 +++ gas/testsuite/gas/mips/branch-swap.s 2004-08-17 22:52:50.000000000 +0200 @@ -0,0 +1,9 @@ + .set push + .set mips2 +1: beqzl $2, 1b + b 1b +foo: beqzl $2, foo + b foo + + .set pop + .space 8 --- gas/testsuite/gas/mips/branch-swap.d.old 1970-01-01 01:00:00.000000000 +0100 +++ gas/testsuite/gas/mips/branch-swap.d 2004-08-17 22:57:36.000000000 +0200 @@ -0,0 +1,20 @@ +#as: -march=mips2 +#objdump: -dr +#name: MIPS branch-swap + +.*: file format .*mips.* + +Disassembly of section \.text: + +00000000 <foo-0x10>: + 0: 5040ffff beqzl v0,0 <foo-0x10> + 4: 00000000 nop + 8: 1000fffd b 0 <foo-0x10> + c: 00000000 nop + +00000010 <foo>: + 10: 5040ffff beqzl v0,10 <foo> + 14: 00000000 nop + 18: 1000fffd b 10 <foo> + 1c: 00000000 nop + \.\.\.