Accumulator based machines
Georg-Johann Lay
avr@gjlay.de
Fri May 22 14:56:00 GMT 2009
Michael Hope schrieb:
> The problem is when I have to clobber ACC such as when moving between
> registers. The output should be:
> LOADACC, R10; STOREACC, R11 (equivalent to ACC = R10; R11 = ACC)
>
> I've tried a parallel clobber like:
> (define_insn "movsi"
> [(set (match_operand:SI 0 "nonimmediate_operand" "=b, dam,dam")
> (match_operand:SI 1 "general_operand" "dami,b, dam"))
> (clobber (reg:SI TREG_ACC))
>
> but this causes trouble when setting up ACC for the likes of the add
> above. The compiler runs but the code is incorrect
>
> I've tried a parallel with a match_scratch like:
> (define_insn "movsi"
> [(set (match_operand:SI 0 "nonimmediate_operand" "=b, rm,rm")
> (match_operand:SI 1 "general_operand" "rmi,b, rm"))
> (clobber (match_scratch:SI 2 "=X,X,b"))
> ]
> ""
> "@
> LOADACC, %1
> STOREACC, %0
> LOADACC, %1\;STOREACC, %0"
>
> This uses a 'b' constraint to put the scratch into ACC when moving
> between registers and a 'X' constraint to ignore the scratch when
> moving to or from ACC directly.
You will have to introduce secondary reloads for that purpose, see
TARGET_SECONDARY_RELOAD et al.
You must not clobber regs in movM insns.
Georg-Johann
More information about the Gcc
mailing list