Sandra Loosemore <san...@codesourcery.com> writes: > When I was trying to benchmark another patch (which I'll be sending > along shortly) with CSiBE for -mabi=64, I ran into an assembler error > like this: > > /tmp/ccJv2faG.s: Assembler messages: > /tmp/ccJv2faG.s:1605: Error: a destination register must be supplied > `jalr $31'
JALR patterns should have an explicit clobber of $31, which I thought was also supposed to stop $31 from being used as the call address. E.g.: int foo (void) { typedef void (*type) (void); register type fn asm ("$31"); asm ("foo %0" : "=r" (fn)); fn (); return 1; } gives the expected shuffle: #APP # 5 "/tmp/foo.c" 1 foo $31 # 0 "" 2 #NO_APP move $2,$31 jalr $2 If you change the asm to some other random register then the JALR uses it directly. Do you have a testcase? > Indeed, GCC is generating invalid code here; the single-operand JALR > instruction doesn't permit the use of $31 because it is already the > implicit destination register. The attached patch introduces a new > register class JALR_REGS to represent the valid set of registers for > this instruction, and modifies the "c" register constraint to use it. > > I had some difficulty in regression-testing this patch because of > unrelated problems on trunk in the past week -- at first I was getting > ICEs due to a null pointer dereference in tree code, then when I tried > again a couple days later trunk was not even building. Could you give more details? Thanks, Richard