Save five instructions on underflow handling.

By using an optimized trap entry we can move instructions from
the window underflow function into the trap entry vector. By
setting WIM=0 and using RESTORE it is possible to move the
new WIM register content from the trapped window into the
to-be-restored register window. It is then possible to avoid
the WIM write delay.
---
 c/src/lib/libbsp/sparc/shared/start/start.S |   11 ++++++++++-
 c/src/lib/libcpu/sparc/reg_win/window.S     |   14 ++++++--------
 2 files changed, 16 insertions(+), 9 deletions(-)

diff --git a/c/src/lib/libbsp/sparc/shared/start/start.S 
b/c/src/lib/libbsp/sparc/shared/start/start.S
index b7067b3..3e0e42e 100644
--- a/c/src/lib/libbsp/sparc/shared/start/start.S
+++ b/c/src/lib/libbsp/sparc/shared/start/start.S
@@ -51,6 +51,15 @@
   nop
 
 /*
+ * Window Underflow optimized trap table entry
+ */
+#define WUTRAP(_vector, _handler)  \
+  mov   %wim, %l3 ; \
+  sethi %hi(_handler), %l4 ; \
+  jmp   %l4+%lo(_handler); \
+   mov  %g0, %wim ! WIM = 0, so that we can restore regardless of WIM
+
+/*
  *  Software trap. Treat as BAD_TRAP for the time being...
  */
 
@@ -82,7 +91,7 @@ SYM(trap_table):
   BAD_TRAP;                                     ! 03 privileged instruction
   BAD_TRAP;                                     ! 04 fp disabled
   WOTRAP(5, SYM(window_overflow_trap_handler)); ! 05 window overflow
-  TRAP( 6, SYM(window_underflow_trap_handler) );! 06 window underflow
+  WUTRAP(6, SYM(window_underflow_trap_handler));! 06 window underflow
   BAD_TRAP;                                     ! 07 memory address not aligned
   BAD_TRAP;                                     ! 08 fp exception
   BAD_TRAP;                                     ! 09 data access exception
diff --git a/c/src/lib/libcpu/sparc/reg_win/window.S 
b/c/src/lib/libcpu/sparc/reg_win/window.S
index 535dc83..9e4158e 100644
--- a/c/src/lib/libcpu/sparc/reg_win/window.S
+++ b/c/src/lib/libcpu/sparc/reg_win/window.S
@@ -73,9 +73,9 @@ SYM(window_overflow_trap_handler):
          *
          *  On entry:
          *
-         *    l0 = psr (from trap table)
          *    l1 = pc
          *    l2 = npc
+         *    l3 = wim (from trap table)
          */
 
         PUBLIC(window_underflow_trap_handler)
@@ -95,17 +95,15 @@ SYM(window_underflow_trap_handler):
          *        register will result in the local register set changing.
          */
 
-        mov  %wim, %l3                  ! Calculate new WIM
+        ! In WIM 3 write instruction delay. since WIM<=0 from trap entry
         sll  %l3, 1, %l4                ! l4 = WIM << 1
         srl  %l3, SPARC_NUMBER_OF_REGISTER_WINDOWS-1, %l5
-                                        ! l5 = WIM >> (Number Windows-1)
-        or   %l5, %l4, %l5              ! l5 = (WIM << 1) |
+        or   %l5, %l4, %i5              ! %i5= (WIM << 1) |
                                         !      (WIM >> (Number Windows-1))
-        mov  %l5, %wim                  ! load the new WIM
-        nop; nop; nop
         restore                         ! Two restores to get into the
-        restore                         ! window to restore
+        restore %o5, %g0, %l7           ! window to restore. Carry along new 
WIM
         ldd  [%sp + 0x00], %l0          ! First the local register set
+        mov   %l7, %wim                 ! load the new WIM
         ldd  [%sp + 0x08], %l2
         ldd  [%sp + 0x10], %l4
         ldd  [%sp + 0x18], %l6
@@ -116,7 +114,7 @@ SYM(window_underflow_trap_handler):
         save                            ! Get back to the trap window.
         save
         jmp  %l1                        ! Re-execute restore.
-        rett  %l2
+         rett  %l2
 
         /*
          *  Flush All Windows trap handler.
-- 
1.7.0.4

_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel

Reply via email to