summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Hellstrom <daniel@gaisler.com>2014-05-28 10:29:37 +0200
committerDaniel Hellstrom <daniel@gaisler.com>2014-11-19 16:29:58 +0100
commit6dcd275550347d878c1f7c8ee39b87d56c9af742 (patch)
tree5e292c7da8973b06ad511b384a120cd9a55db9ae
parentde4b74fd8478a569780e4565f864678f2014a6bc (diff)
SPARC: optimize window overflow trap entry
By using a optimized trap entry we can move instructions from the window overflow function into the trap entry vector. By using the saved locals instead of g1 we don't need to save that register temporarily. Also spead out non store instructions inbetween stores to use the write buffer better.
-rw-r--r--c/src/lib/libbsp/sparc/shared/start/start.S11
-rw-r--r--c/src/lib/libcpu/sparc/reg_win/window.S24
2 files changed, 19 insertions, 16 deletions
diff --git a/c/src/lib/libbsp/sparc/shared/start/start.S b/c/src/lib/libbsp/sparc/shared/start/start.S
index eb8e3c43a4..b7067b32bd 100644
--- a/c/src/lib/libbsp/sparc/shared/start/start.S
+++ b/c/src/lib/libbsp/sparc/shared/start/start.S
@@ -42,6 +42,15 @@
subcc %g1, 3, %g0; ! prepare for syscall 3 check
/*
+ * Window Overflow optimized trap table entry
+ */
+#define WOTRAP(_vector, _handler) \
+ sethi %hi(_handler), %l4; \
+ jmp %l4+%lo(_handler); \
+ save; \
+ nop
+
+/*
* Software trap. Treat as BAD_TRAP for the time being...
*/
@@ -72,7 +81,7 @@ SYM(trap_table):
BAD_TRAP; ! 02 illegal instruction
BAD_TRAP; ! 03 privileged instruction
BAD_TRAP; ! 04 fp disabled
- TRAP( 5, SYM(window_overflow_trap_handler) ); ! 05 window overflow
+ WOTRAP(5, SYM(window_overflow_trap_handler)); ! 05 window overflow
TRAP( 6, SYM(window_underflow_trap_handler) );! 06 window underflow
BAD_TRAP; ! 07 memory address not aligned
BAD_TRAP; ! 08 fp exception
diff --git a/c/src/lib/libcpu/sparc/reg_win/window.S b/c/src/lib/libcpu/sparc/reg_win/window.S
index 453cc74ce4..535dc83105 100644
--- a/c/src/lib/libcpu/sparc/reg_win/window.S
+++ b/c/src/lib/libcpu/sparc/reg_win/window.S
@@ -29,9 +29,8 @@
*
* On entry:
*
- * l0 = psr (from trap table)
- * l1 = pc
- * l2 = npc
+ * prev regwin l1 = pc
+ * prev regwin l2 = npc
*/
PUBLIC(window_overflow_trap_handler)
@@ -51,28 +50,23 @@ SYM(window_overflow_trap_handler):
* register will result in the local register set changing.
*/
- mov %wim, %l3 ! l3 = WIM
- mov %g1, %l7 ! save g1
- srl %l3, 1, %g1 ! g1 = WIM >> 1
- sll %l3, SPARC_NUMBER_OF_REGISTER_WINDOWS-1 , %l4
- ! l4 = WIM << (Number Windows - 1)
- or %l4, %g1, %g1 ! g1 = (WIM >> 1) |
- ! (WIM << (Number Windows - 1))
-
- save ! Get into window to be saved.
- mov %g1, %wim ! load new WIM
std %l0, [%sp + 0x00] ! save local register set
std %l2, [%sp + 0x08]
+ mov %wim, %l3
+ sll %l3, SPARC_NUMBER_OF_REGISTER_WINDOWS-1 , %l2
+ ! l2 = WIM << (Number Windows - 1)
std %l4, [%sp + 0x10]
std %l6, [%sp + 0x18]
+ srl %l3, 1, %l3 ! l3 = WIM >> 1
+ wr %l3, %l2, %wim ! WIM = (WIM >> 1) ^
+ ! (WIM << (Number Windows - 1))
std %i0, [%sp + 0x20] ! save input register set
std %i2, [%sp + 0x28]
std %i4, [%sp + 0x30]
std %i6, [%sp + 0x38]
restore ! Go back to trap window.
- mov %l7, %g1 ! restore g1
jmp %l1 ! Re-execute save.
- rett %l2
+ rett %l2
/*
* Window underflow trap handler.