mirror of
https://github.com/torvalds/linux.git
synced 2024-12-26 04:42:12 +00:00
eed7b83658
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_checks.c | ||
cache-c.c | ||
cache.S | ||
clocks-init.c | ||
cpufreq.c | ||
dpmc_modes.S | ||
dpmc.c | ||
entry.S | ||
head.S | ||
interrupt.S | ||
ints-priority.c | ||
Makefile | ||
pm.c | ||
smp.c |