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