diff options
author | Mike Frysinger <vapier@gentoo.org> | 2011-06-27 05:11:19 +0200 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2011-07-23 07:18:29 +0200 |
commit | eed7b8365807549c67613ea7d9a451262050ba3e (patch) | |
tree | 784d91e216a393904d5bb74bfcb00a878c159d10 /arch/blackfin/kernel/bfin_gpio.c | |
parent | Blackfin: dpmc: do not save/restore EVT0/EVT1/EVT4 when hibernating (diff) | |
download | linux-eed7b8365807549c67613ea7d9a451262050ba3e.tar.xz linux-eed7b8365807549c67613ea7d9a451262050ba3e.zip |
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>
Diffstat (limited to 'arch/blackfin/kernel/bfin_gpio.c')
0 files changed, 0 insertions, 0 deletions