Boris Boesler <[EMAIL PROTECTED]> writes: > I'm trying to allocate a scratch register: write immediate constant > into scratch register r, write register r into memory > > ;; write imm into memory > (define_insn_and_split "mov<mode>_imm_by_store" > [(set (match_operand:I8I16 0 "memory_operand" "=m") > (match_operand:I8I16 1 "immediate_operand" " i")) > (clobber (match_scratch:I8I16 2 "=r"))] > "" > "#" > "" > [(parallel > [(set (match_dup 2) (match_dup 1)) > (set (match_dup 0) (match_dup 2))])] > "" > ) > > I found that in a mips back-end. But this pattern is not recognized > during code-generation [char c1; c1 = 1;]: > simple-memory.c:19: error: unrecognizable insn: > (insn 12 11 14 3 (set (mem/c/i:QI (reg/f:SI 105) [0 c1+0 S8]) > (const_int 1 [0x1])) -1 (nil) > (nil)) > > If I remove the clobber command and replace (match_dup 2) by > (reg:I8I16 A15_REGNUM) code will be generated (but not as wanted). > > What is wrong with the code above?
There is nothing wrong with that code, but nothing is going to make the compiler use it. Moves are special. If you need a scratch register to do a move, then you need to look at the TARGET_SECONDARY_RELOAD hook. But if the problem is only that you need a register to store a constant into memory, then you should be able to do that using register constraints on your mov<mode> insn. Ian