Blackfin: dpmc: optimize hibernate/resume path
authorMike Frysinger <vapier@gentoo.org>
Mon, 27 Jun 2011 03:11:19 +0000 (23:11 -0400)
committerMike Frysinger <vapier@gentoo.org>
Sat, 23 Jul 2011 05:18:29 +0000 (01:18 -0400)
commiteed7b8365807549c67613ea7d9a451262050ba3e
tree784d91e216a393904d5bb74bfcb00a878c159d10
parentd7228e7eb9bd9d65ddb5338fc9574f34ea6d53e1
Blackfin: dpmc: optimize hibernate/resume path

The current save logic used in hibernation is to do a MMR load (base +
offset) into a register, and then push that onto the stack.  Then when
restoring, pop off the stack into a register followed by a MMR store
(base + offset).  These use plenty of 32bit insns rather than 16bit,
are pretty long winded, and full of pipeline bubbles.

So, by taking advantage of MMRs that are contiguous, the multi-register
push/pop insn, and register abuse, we can shrink this code considerably.

When saving, the new logic does a lot of loads into the data and pointer
registers before executing a single multi-register push insn.  Then when
restoring, we do a single multi-register pop insn followed by a lot of
stores.  Overall, this allows us to cut the insn count by ~30%, the code
size by ~45%, and drastically reduce the register hazards that trigger
bubbles in the pipeline.

Signed-off-by: Mike Frysinger <vapier@gentoo.org>
arch/blackfin/include/asm/dpmc.h
arch/blackfin/mach-common/dpmc_modes.S