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.

Reply via email to