Hi!

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?

Thanks,
Boris

Reply via email to