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