forked from Imagelibrary/rtems
SPARC: window overflow optimization
I see no need for waiting the 3 instruction delay for wim to be written in this case, since the STD after does not depend on WIM
This commit is contained in:
@@ -41,6 +41,15 @@
|
||||
jmp %l4+%lo(_handler); \
|
||||
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
|
||||
|
||||
@@ -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,29 +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
|
||||
nop; nop; nop ! 3 slot delay
|
||||
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.
|
||||
|
||||
Reference in New Issue
Block a user