Hello, my first little success...
in arm.h, I have changed > /* Output the address of an operand. */ > #define ARM_PRINT_OPERAND_ADDRESS(STREAM, X) \ > { \ > int is_minus = GET_CODE (X) == MINUS; > \ > \ > if (GET_CODE (X) == REG) \ > asm_fprintf (STREAM, "[%r, #0]", REGNO (X)); > \ into > /* Output the address of an operand. */ > #define ARM_PRINT_OPERAND_ADDRESS(STREAM, X) \ > { \ > int is_minus = GET_CODE (X) == MINUS; > \ > \ > if (GET_CODE (X) == REG) \ > asm_fprintf (STREAM, "[%r]", REGNO (X)); > \ I don't know why the form "[%r, #0]" was coded before, because the assembler understands "[%r]" very well for all instructions. The form "[%r]" has a wider usage because it covers swp too. On Sunday 04 June 2006 23:36, Rask Ingemann Lambertsen wrote: > On Wed, May 31, 2006 at 10:49:35PM +0200, Wolfgang Mües wrote: > > > (define_insn "*arm_movqi_insn" > > > [(set (match_operand:QI 0 "nonimmediate_operand" "=r,r,r,m") > > > (match_operand:QI 1 "general_operand" "rI,K,m,r"))] > I think you should go back to this (i.e. the unmodified version) and > only change the "m" into "Q" in the fourth alternative of operand 0. > See if that works, i.e. generates addresses that are valid for the > swp instruction. No, that doesn't work: > ../../../gcc-4.0.2/gcc/unwind-dw2-fde.c: In function > __register_frame_info_table_bases': > ../../../gcc-4.0.2/gcc/unwind-dw2-fde.c:146: error: insn does not > satisfy its constraints: (insn 63 28 29 0 > ../../../gcc-4.0.2/gcc/unwind-dw2-fde.c:136 (set (mem/s/j:QI (plus:SI > (reg/v/f:SI 1 r1 [orig:102 ob ] [102]) (const_int 16 [0x10])) [0 S1 > A32]) > (reg:QI 12 ip)) 155 {*arm_movqi_insn} (nil) > (nil)) > ../../../gcc-4.0.2/gcc/unwind-dw2-fde.c:146: internal compiler error: > in reload_ cse_simplify_operands, at postreload.c:391 Also, I wonder what the "Q" constraint really means: from the GCC manual: > Q > A memory reference where the exact address is in a single register > (``m'' is preferable for asm statements) but in arm.h: > /* For the ARM, `Q' means that this is a memory operand that is just > an offset from a register. > #define EXTRA_CONSTRAINT_STR_ARM(OP, C, STR) \ > ((C) == 'Q') ? (GET_CODE (OP) == MEM > \ > && GET_CODE (XEXP (OP, 0)) == REG) : \ Obviously, GCC tries to implement REG+CONSTANT with Q. Maybe I must define a new constraint? regards Wolfgang -- We're back to the times when men were men and wrote their own device drivers. (Linus Torvalds)