Another thing to look at, since you have hand-written routines and may
be able to specify that e.g. only a subset of the normal call clobbered
registers are actually modified, is to leave the call as a "compare"
insn. Something like
(define_insn "*cmpsf"
[(set (reg:CC status-reg)
(compare:CC
(match_operand:SF 0 "register_operand" "R0")
(match_operand:SF 1 "register_operand" "R1")))
(clobber (reg:SI r2))
(clobber (reg:SI r3))]
""
"call __compareSF"
[(set_attr "type" "call")])
Where the R0 and R1 constraints resolve to the input registers for the
routine. Depending on your ISA and ABI, you may not even need to split
this pattern post-reload.
r~