Apply leaf procedure optimization to pseg_set (again).

This commit is contained in:
martin 2003-01-31 22:19:33 +00:00
parent 0566c52cec
commit 3b0f844b5d
1 changed files with 91 additions and 94 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: locore.s,v 1.165 2003/01/31 19:05:56 martin Exp $ */
/* $NetBSD: locore.s,v 1.166 2003/01/31 22:19:33 martin Exp $ */
/*
* Copyright (c) 1996-2002 Eduardo Horvath
@ -8808,138 +8808,135 @@ ENTRY(pseg_get)
* running!
*/
ENTRY(pseg_set)
#ifdef _LP64
save %sp, -CC64FSZ, %sp
#else
save %sp, -CCFSZ, %sp
sllx %i4, 32, %i4 ! Put args into 64-bit format
sllx %i2, 32, %i2 ! Shift to high 32-bits
clruw %i3 ! Zero extend
clruw %i5
clruw %i1
or %i2, %i3, %i2
or %i4, %i5, %i3
#ifndef _LP64
sllx %o4, 32, %o4 ! Put args into 64-bit format
sllx %o2, 32, %o2 ! Shift to high 32-bits
clruw %o3 ! Zero extend
clruw %o5
clruw %o1
or %o2, %o3, %o2
or %o4, %o5, %o3
#endif
!!
!! However we managed to get here we now have:
!!
!! %i0 = *pmap
!! %i1 = addr
!! %i2 = tte
!! %i3 = paddr of spare page
!! %o0 = *pmap
!! %o1 = addr
!! %o2 = tte
!! %o3 = paddr of spare page
!!
srax %i1, HOLESHIFT, %i4 ! Check for valid address
brz,pt %i4, 0f ! Should be zero or -1
inc %i4 ! Make -1 -> 0
brz,pt %i4, 0f
srax %o1, HOLESHIFT, %o4 ! Check for valid address
brz,pt %o4, 0f ! Should be zero or -1
inc %o4 ! Make -1 -> 0
brz,pt %o4, 0f
nop
#ifdef DEBUG
ta 1 ! Break into debugger
#endif
ret
restore %g0, -2, %o0 ! Error -- in hole!
retl
mov -2, %o0 ! Error -- in hole!
0:
ldx [%i0 + PM_PHYS], %i4 ! pmap->pm_segs
clr %o0
srlx %i1, STSHIFT, %i5
and %i5, STMASK, %i5
sll %i5, 3, %i5
add %i4, %i5, %i4
ldx [%o0 + PM_PHYS], %o4 ! pmap->pm_segs
clr %g1
srlx %o1, STSHIFT, %o5
and %o5, STMASK, %o5
sll %o5, 3, %o5
add %o4, %o5, %o4
0:
DLFLUSH(%i4,%g1)
ldxa [%i4] ASI_PHYS_CACHED, %i5 ! Load page directory pointer
DLFLUSH2(%g1)
DLFLUSH(%o4,%g6)
ldxa [%o4] ASI_PHYS_CACHED, %o5 ! Load page directory pointer
DLFLUSH2(%g6)
brnz,a,pt %i5, 0f ! Null pointer?
mov %i5, %i4
brz,pn %i3, 9f ! Have a spare?
mov %i3, %i5
casxa [%i4] ASI_PHYS_CACHED, %g0, %i5
brnz,pn %i5, 0b ! Something changed?
DLFLUSH(%i4, %i5)
mov %i3, %i4
mov 2, %o0 ! record spare used for L2
clr %i3 ! and not available for L3
brnz,a,pt %o5, 0f ! Null pointer?
mov %o5, %o4
brz,pn %o3, 9f ! Have a spare?
mov %o3, %o5
casxa [%o4] ASI_PHYS_CACHED, %g0, %o5
brnz,pn %o5, 0b ! Something changed?
DLFLUSH(%o4, %o5)
mov %o3, %o4
mov 2, %g1 ! record spare used for L2
clr %o3 ! and not available for L3
0:
srlx %i1, PDSHIFT, %i5
and %i5, PDMASK, %i5
sll %i5, 3, %i5
add %i4, %i5, %i4
srlx %o1, PDSHIFT, %o5
and %o5, PDMASK, %o5
sll %o5, 3, %o5
add %o4, %o5, %o4
0:
DLFLUSH(%i4,%g1)
ldxa [%i4] ASI_PHYS_CACHED, %i5 ! Load table directory pointer
DLFLUSH2(%g1)
DLFLUSH(%o4,%g6)
ldxa [%o4] ASI_PHYS_CACHED, %o5 ! Load table directory pointer
DLFLUSH2(%g6)
brnz,a,pt %i5, 0f ! Null pointer?
mov %i5, %i4
brz,pn %i3, 9f ! Have a spare?
mov %i3, %i5
casxa [%i4] ASI_PHYS_CACHED, %g0, %i5
brnz,pn %i5, 0b ! Something changed?
DLFLUSH(%i4, %i4)
mov %i3, %i4
mov 4, %o0 ! record spare used for L3
brnz,a,pt %o5, 0f ! Null pointer?
mov %o5, %o4
brz,pn %o3, 9f ! Have a spare?
mov %o3, %o5
casxa [%o4] ASI_PHYS_CACHED, %g0, %o5
brnz,pn %o5, 0b ! Something changed?
DLFLUSH(%o4, %o4)
mov %o3, %o4
mov 4, %g1 ! record spare used for L3
0:
srlx %i1, PTSHIFT, %i5 ! Convert to ptab offset
and %i5, PTMASK, %i5
sll %i5, 3, %i5
add %i5, %i4, %i4
srlx %o1, PTSHIFT, %o5 ! Convert to ptab offset
and %o5, PTMASK, %o5
sll %o5, 3, %o5
add %o5, %o4, %o4
DLFLUSH(%i4,%g1)
ldxa [%i4] ASI_PHYS_CACHED, %o2 ! save old value in %o2
stxa %i2, [%i4] ASI_PHYS_CACHED ! Easier than shift+or
DLFLUSH2(%g1)
DLFLUSH(%o4,%g6)
ldxa [%o4] ASI_PHYS_CACHED, %g4 ! save old value in %g4
stxa %o2, [%o4] ASI_PHYS_CACHED ! Easier than shift+or
DLFLUSH2(%g6)
!! at this point we have:
!! %o0 = return value
!! %i0 = struct pmap * (where the counts are)
!! %i2 = new TTE
!! %o2 = old TTE
!! %g1 = return value
!! %o0 = struct pmap * (where the counts are)
!! %o2 = new TTE
!! %g4 = old TTE
!! see if stats needs an update
set A_TLB_TSB_LOCK, %l4
xor %i2, %o2, %l3 ! %l3 - what changed
set A_TLB_TSB_LOCK, %g5
xor %o2, %g4, %o3 ! %o3 - what changed
brgez,pn %l3, 5f ! has resident changed? (we predict it has)
btst %l4, %l3 ! has wired changed?
brgez,pn %o3, 5f ! has resident changed? (we predict it has)
btst %g5, %o3 ! has wired changed?
#ifdef _LP64
ldx [%i0 + PM_RESIDENT], %l6 ! gonna update resident count
ldx [%o0 + PM_RESIDENT], %g6 ! gonna update resident count
#else
ld [%i0 + PM_RESIDENT], %l6
ld [%o0 + PM_RESIDENT], %g6
#endif
brlz %i2, 0f
mov 1, %l7
neg %l7 ! new is not resident -> decrement
0: add %l6, %l7, %l6
brlz %o2, 0f
mov 1, %o4
neg %o4 ! new is not resident -> decrement
0: add %g6, %o4, %g6
#ifdef _LP64
stx %l6, [%i0 + PM_RESIDENT]
stx %g6, [%o0 + PM_RESIDENT]
#else
st %l6, [%i0 + PM_RESIDENT]
st %g6, [%o0 + PM_RESIDENT]
#endif
btst %l4, %l3 ! has wired changed?
btst %g5, %o3 ! has wired changed?
5: bz,pt %xcc, 8f ! we predict it's not
btst %l4, %i2 ! don't waste delay slot, check if new one is wired
btst %g5, %o2 ! don't waste delay slot, check if new one is wired
#ifdef _LP64
ldx [%i0 + PM_WIRED], %l6 ! gonna update wired count
ldx [%o0 + PM_WIRED], %g6 ! gonna update wired count
#else
ld [%i0 + PM_WIRED], %l6
ld [%o0 + PM_WIRED], %g6
#endif
bnz,pt %xcc, 0f ! if wired changes, we predict it increments
mov 1, %l7
neg %l7 ! new is not wired -> decrement
0: add %l6, %l7, %l6
mov 1, %o4
neg %o4 ! new is not wired -> decrement
0: add %g6, %o4, %g6
#ifdef _LP64
stx %l6, [%i0 + PM_WIRED]
stx %g6, [%o0 + PM_WIRED]
#else
st %l6, [%i0 + PM_WIRED]
st %g6, [%o0 + PM_WIRED]
#endif
8: ret
restore %g0, %o0, %o0 ! return %o0
8: retl
mov %g1, %o0 ! return %g1
9: ret
restore %g0, 1, %o0 ! spare needed, return 1
9: retl
mov 1, %o0 ! spare needed, return 1
/*