Source code of Windows XP (NT5)
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.
|
|
/*++
Copyright (c) 1994 Microsoft Corporation
Module Name:
bitops.c
Abstract:
This module implements the code to emulate the bit opcodes.
Author:
David N. Cutler (davec) 12-Nov-1994
Environment:
Kernel mode only.
Revision History:
--*/
#include "nthal.h"
#include "emulate.h"
VOID XmBsfOp ( IN PRXM_CONTEXT P )
/*++
Routine Description:
This function emulates an bsf opcode.
Arguments:
P - Supplies a pointer to the emulation context structure.
Return Value:
None.
--*/
{
ULONG Result; ULONG Source;
//
// If the source operand is zero, then set ZF and set the destination
// to zero, Otherwise, find the first bit set scanning from right to
// left.
//
Result = 0; Source = P->SrcValue.Long; P->Eflags.EFLAG_ZF = 1; while (Source != 0) { if ((Source & 1) != 0) { P->Eflags.EFLAG_ZF = 0; break; }
Result += 1; Source >>= 1; };
XmStoreResult(P, Result); return; }
VOID XmBsrOp ( IN PRXM_CONTEXT P )
/*++
Routine Description:
This function emulates an bsr opcode.
Arguments:
P - Supplies a pointer to the emulation context structure.
Return Value:
None.
--*/
{
ULONG Result; ULONG Source;
//
// If the source operand is zero, then set ZF and set the destination
// to zero, Otherwise, find the first bit set scanning from left to
// right.
//
Result = ((P->DataType + 1) << 3) - 1; Source = P->SrcValue.Long; P->Eflags.EFLAG_ZF = 1; while (Source != 0) { if (((Source >> Result) & 1) != 0) { P->Eflags.EFLAG_ZF = 0; break; }
Result -= 1; };
XmStoreResult(P, Result); return; }
VOID XmBtOp ( IN PRXM_CONTEXT P )
/*++
Routine Description:
This function emulates an bt opcode.
Arguments:
P - Supplies a pointer to the emulation context structure.
Return Value:
None.
--*/
{
//
// Test the specified bit and store the bit in CF.
//
P->Eflags.EFLAG_CF = P->DstValue.Long >> P->SrcValue.Long; return; }
VOID XmBtsOp ( IN PRXM_CONTEXT P )
/*++
Routine Description:
This function emulates an bts opcode.
Arguments:
P - Supplies a pointer to the emulation context structure.
Return Value:
None.
--*/
{
//
// Test and set the specified bit and store the bit in CF.
//
//
P->Eflags.EFLAG_CF = P->DstValue.Long >> P->SrcValue.Long; P->DstValue.Long |= (1 << P->SrcValue.Long); XmStoreResult(P, P->DstValue.Long); return; }
VOID XmBtrOp ( IN PRXM_CONTEXT P )
/*++
Routine Description:
This function emulates an btr opcode.
Arguments:
P - Supplies a pointer to the emulation context structure.
Return Value:
None.
--*/
{
//
// Test and reset the specified bit and store the bit in CF.
//
//
P->Eflags.EFLAG_CF = P->DstValue.Long >> P->SrcValue.Long; P->DstValue.Long &= ~(1 << P->SrcValue.Long); XmStoreResult(P, P->DstValue.Long); return; }
VOID XmBtcOp ( IN PRXM_CONTEXT P )
/*++
Routine Description:
This function emulates an btc opcode.
Arguments:
P - Supplies a pointer to the emulation context structure.
Return Value:
None.
--*/
{
//
// Test and reset the specified bit and store the bit in CF.
//
//
P->Eflags.EFLAG_CF = P->DstValue.Long >> P->SrcValue.Long; P->DstValue.Long ^= (1 << P->SrcValue.Long); XmStoreResult(P, P->DstValue.Long); return; }
|