Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

224 lines
5.9 KiB

// TITLE("Interlocked Increment and Decrement Support")
//++
//
// Copyright (c) 1991 Microsoft Corporation
//
// Module Name:
//
// critsect.s
//
// Abstract:
//
// This module implements Win32 functions to support user mode critical
// sections.
//
// Author:
//
// David N. Cutler 29-Apr-1992
//
// Environment:
//
// Any mode.
//
// Revision History:
//
//--
#include "ksmips.h"
SBTTL("Interlocked Decrement")
//++
//
// LONG
// InterlockedDecrement(
// IN PLONG Addend
// )
//
// Routine Description:
//
// This function performs an interlocked increment on the addend variable.
//
// This function and its companion are assuming that the count will never
// be incremented past 2**31 - 1.
//
// Arguments:
//
// Addend (a0) - Supplies a pointer to a variable whose value is to be
// incremented.
//
// Return Value:
//
// A negative value is returned if the updated value is less than zero,
// a zero value is returned if the updated value is zero, and a nonzero
// positive value is returned if the updated value is greater than zero.
//
//--
LEAF_ENTRY(InterlockedIncrement)
10: ll v0,0(a0) // get addend value
addu v0,v0,1 // increment addend value
move t0,v0 // copy updated value
sc t0,0(a0) // store conditionally
beq zero,t0,10b // if eq, store failed
j ra // return
.end InterlockedIncrement
SBTTL("InterlockedDecrement")
//++
//
// LONG
// InterlockedDecrement(
// IN PLONG Addend
// )
//
// Routine Description:
//
// This function performs an interlocked decrement on the addend variable.
//
// This function and its companion are assuming that the count will never
// be decremented past 2**31 - 1.
//
// Arguments:
//
// Addend (a0) - Supplies a pointer to a variable whose value is to be
// decrement.
//
// Return Value:
//
// A negative value is returned if the updated value is less than zero,
// a zero value is returned if the updated value is zero, and a nonzero
// positive value is returned if the updated value is greater than zero.
//
//--
LEAF_ENTRY(InterlockedDecrement)
10: ll v0,0(a0) // get addend value
subu v0,v0,1 // decrement addend value
move t0,v0 // copy updated value
sc t0,0(a0) // store conditionally
beq zero,t0,10b // if eq, store failed
j ra // return
.end InterlockedDecrement
SBTTL("Interlocked Exchange Long")
//++
//
// LONG
// InterlockedExchangeUlong (
// IN OUT LPLONG Target,
// IN LONG Value
// )
//
// Routine Description:
//
// This function performs an interlocked exchange of a longword value with
// a longword in memory and returns the memory value.
//
// Arguments:
//
// Target (a0) - Supplies a pointer to a variable whose value is to be
// exchanged.
//
// Value (a1) - Supplies the value to exchange with the source value.
//
// Return Value:
//
// The target value is returned as the function value.
//
//--
LEAF_ENTRY(InterlockedExchange)
10: ll v0,0(a0) // get current source value
move t1,a1 // set exchange value
sc t1,0(a0) // set new source value
beq zero,t1,10b // if eq, store conditional failed
j ra // return
.end InterlockedExchange
SBTTL("Interlocked Compare Exchange")
//++
//
// PVOID
// InterlockedCompareExchange (
// IN OUT PVOID *Destination,
// IN PVOID Exchange,
// IN PVOID Comperand
// )
//
// Routine Description:
//
// This function performs an interlocked compare of the destination
// value with the comperand value. If the destination value is equal
// to the comperand value, then the exchange value is stored in the
// destination. Otherwise, no opeation is performed.
//
// Arguments:
//
// Destination (a0) - Supplies a pointer to the destination value.
//
// Exchange (a1) - Supplies the exchange.
//
// Comperand (a2) - Supplies the comperand value.
//
// Return Value:
//
// The initial destination value is returned as the function value.
//
//--
LEAF_ENTRY(InterlockedCompareExchange)
10: ll v0,0(a0) // get current addend value
move t0,a1 // copy exchange value for store
bne v0,a2,20f // if ne, operands mismatch
sc t0,0(a0) // store updated addend value
beq zero,t0,10b // if eq, store conditional failed
20: j ra // return
.end InterlockedCompareExchange
SBTTL("Interlocked Exchange Add")
//++
//
// LONG
// InterlockedExchangeAdd (
// IN PLONG Addend,
// IN LONG Increment
// )
//
// Routine Description:
//
// This function performs an interlocked add of an increment value to an
// addend variable of type long. The initial value of the addend variable
// is returned as the function value.
//
// Arguments:
//
// Addend (a0) - Supplies a pointer to a variable whose value is to be
// adjusted by the increment value.
//
// Increment (a1) - Supplies the increment value to be added to the
// addend variable.
//
// Return Value:
//
// The initial value of the addend variable.
//
//--
LEAF_ENTRY(InterlockedExchangeAdd)
10: ll v0,0(a0) // get current addend value
addu v1,v0,a1 // add increment value
sc v1,0(a0) // store updated addend value
beq zero,v1,10b // if eq, store conditional failed
j ra // return
.end InterlockedExchangeAdd