Hello Rask, On Friday 02 June 2006 09:24, Rask Ingemann Lambertsen wrote: > There may be a faster way of seeing if the modification is going to > work for the DS at all. I noticed from the output template > "swp%?b\\t%1, %1, [%M0]" that "swp" takes three operands. I don't > know ARM assembler, but you may be able to choose to always clobber a > specific register. Make it a fixed register (see FIXED_REGISTERS), > refer to this register directly in the output template and don't add > a clobber to the movqi patterns. IMHO, that's an acceptable hack at > an experimental stage. If the resulting code runs correctly on the > DS, you can then undo the FIXED_REGISTERS change and add the clobber > statements.
I have tried this. No luck. Problem is the lack of addressing modes for the swp instruction. Only a simple pointer in a register (no offset, no auto-increment is allowed). After reading most of the gcc rtl documentation (and forgetting way too much..) I came up to the following conclusion: Splitting the insn (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"))] into 4 different insns: (define_insn "*arm_movqi_insn" [(set (match_operand:QI 0 "register_operand" "") (match_operand:QI 1 "register_operand" ""))] (define_insn "*arm_movnqi_insn" [(set (match_operand:QI 0 "register_operand" "") (match_operand:QI 1 "constant_operand" ""))] (define_insn "*arm_loadqi_insn" [(set (match_operand:QI 0 "register_operand" "") (match_operand:QI 1 "memory_operand" ""))] (define_insn "*arm_storeqi_insn" [(set (match_operand:QI 0 "memory_operand" "") (match_operand:QI 1 "register_operand" ""))] This should give the same function as before, but I then I can do (define_insn "*arm_storeqi_insn" [(set (match_operand:QI 0 "simple_memory_operand" "") (match_operand:QI 1 "register_operand" ""))] etc to limit the addressing modes of the store insn to the limits of the swpb instruction. And then I can recode the (define_expand "movqi" [(set (match_operand:QI 0 "general_operand" "") (match_operand:QI 1 "general_operand" ""))] to cope with the movqi requirements defined in the gcc manual. Hmmm... wondering who all these xxx_operand functions are defined, and where they are documented... Is this the right way to go? regards Wolfgang -- We're back to the times when men were men and wrote their own device drivers. (Linus Torvalds)