248 lines
3.3 KiB
C
248 lines
3.3 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1994 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
logops.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
This module implements the code to emulate the and, or, test, xor,
|
|||
|
and not opcodes.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
David N. Cutler (davec) 12-Sep-1994
|
|||
|
|
|||
|
Environment:
|
|||
|
|
|||
|
Kernel mode only.
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#include "nthal.h"
|
|||
|
#include "emulate.h"
|
|||
|
|
|||
|
//
|
|||
|
// Define forward referenced prototypes.
|
|||
|
//
|
|||
|
|
|||
|
VOID
|
|||
|
XmSetLogicalResult (
|
|||
|
IN PRXM_CONTEXT P,
|
|||
|
IN ULONG Result
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
XmAndOp (
|
|||
|
IN PRXM_CONTEXT P
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This function emulates an and opcode.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
P - Supplies a pointer to the emulation context structure.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
|
|||
|
//
|
|||
|
// And operands and store result.
|
|||
|
//
|
|||
|
|
|||
|
XmSetLogicalResult(P, P->DstValue.Long & P->SrcValue.Long);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
VOID
|
|||
|
XmOrOp (
|
|||
|
IN PRXM_CONTEXT P
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This function emulates an or opcode.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
P - Supplies a pointer to the emulation context structure.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
|
|||
|
//
|
|||
|
// Or operands and store result.
|
|||
|
//
|
|||
|
|
|||
|
XmSetLogicalResult(P, P->DstValue.Long | P->SrcValue.Long);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
VOID
|
|||
|
XmTestOp (
|
|||
|
IN PRXM_CONTEXT P
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This function emulates a test opcode.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
P - Supplies a pointer to the emulation context structure.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
|
|||
|
//
|
|||
|
// And operands but don't store result.
|
|||
|
//
|
|||
|
|
|||
|
XmSetLogicalResult(P, P->DstValue.Long & P->SrcValue.Long);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
VOID
|
|||
|
XmXorOp (
|
|||
|
IN PRXM_CONTEXT P
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This function emulates a xor opcode.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
P - Supplies a pointer to the emulation context structure.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
|
|||
|
//
|
|||
|
// Xor operands and store result.
|
|||
|
//
|
|||
|
|
|||
|
XmSetLogicalResult(P, P->DstValue.Long ^ P->SrcValue.Long);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
VOID
|
|||
|
XmNotOp (
|
|||
|
IN PRXM_CONTEXT P
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This function emulates a not opcode.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
P - Supplies a pointer to the emulation context structure.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
|
|||
|
ULONG Mask;
|
|||
|
ULONG Shift;
|
|||
|
|
|||
|
//
|
|||
|
// Complement operand and store result.
|
|||
|
//
|
|||
|
|
|||
|
Shift = Shift = ((P->DataType + 1) << 3) - 1;
|
|||
|
Mask = ((1 << Shift) - 1) | (1 << Shift);
|
|||
|
XmStoreResult(P, ~P->DstValue.Long & Mask);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
VOID
|
|||
|
XmSetLogicalResult (
|
|||
|
IN PRXM_CONTEXT P,
|
|||
|
IN ULONG Result
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This function conditionally stores the result of a logical operation
|
|||
|
and computes the resultant condtion codes.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
P - Supplies a pointer to the emulation context structure.
|
|||
|
|
|||
|
Result - Supplies the result value (note that the result is always
|
|||
|
zero extended to a long with no carry bits into the zero extended
|
|||
|
part).
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
|
|||
|
ULONG Shift;
|
|||
|
|
|||
|
//
|
|||
|
// Store the result and compute auxilary carry flag, parity flag, sign
|
|||
|
// and zero flags.
|
|||
|
//
|
|||
|
|
|||
|
if (P->FunctionIndex != X86_TEST_OP) {
|
|||
|
XmStoreResult(P, Result);
|
|||
|
}
|
|||
|
|
|||
|
Shift = Shift = ((P->DataType + 1) << 3) - 1;
|
|||
|
P->Eflags.EFLAG_CF = 0;
|
|||
|
P->Eflags.EFLAG_PF = XmComputeParity(Result);
|
|||
|
P->Eflags.EFLAG_AF = 0;
|
|||
|
P->Eflags.EFLAG_ZF = (Result == 0);
|
|||
|
P->Eflags.EFLAG_SF = Result >> Shift;
|
|||
|
P->Eflags.EFLAG_OF = 0;
|
|||
|
return;
|
|||
|
}
|