2012/2/25 Georg-Johann Lay <a...@gjlay.de>: [...] > The pattern for the address spaces is now as simple as > > ;; $0 : Address Space > ;; $1 : RAMPZ RAM address > ;; R24 : #bytes and loop register > ;; R23:Z : 24-bit source address > ;; R26 : 16-bit destination address > > ;; "movmemx_qi" > ;; "movmemx_hi" > (define_insn "movmemx_<mode>" > [(set (mem:BLK (reg:HI REG_X)) > (mem:BLK (lo_sum:PSI (reg:QI 23) > (reg:HI REG_Z)))) > (unspec [(match_operand:QI 0 "const_int_operand" "n")] > UNSPEC_MOVMEM) > (use (reg:QIHI 24)) > (clobber (reg:HI REG_X)) > (clobber (reg:HI REG_Z)) > (clobber (reg:QI LPM_REGNO)) > (clobber (reg:HI 24)) > (clobber (reg:QI 23)) > (clobber (mem:QI (match_operand:QI 1 "io_address_operand" "n")))] > "" > "%~call __movmemx_<mode>" > [(set_attr "type" "xcall")
Thanks for explanation. This technique similar to mulhi3, mulhi3_call ... IMHO this is a better solution then very strict constraint 'x' or 'y' or 'z'. I.e. better to have (at least from reload's point of view): mov r26, "r" mov r27, "r" r30,r31 = do-something-with r26, r27 mov "r", r30 mov "r", r31 Than: "z" = do-something-with "x" Denis.