/* PUBLIC FUNCTIONS ***********************************************************/
+#if defined (__GNUC__)
+ #define CountLeadingZeros64(x) __builtin_clzll(x)
+
+/*
+#elif (_MSC_VER >= 1500) && defined(_WIN64)
+ #define CountLeadingZeros64(x) __lzcnt64(x)
+#elif (_MSC_VER >= 1500)
+ #define CountLeadingZeros64(x) ((x) > 0xFFFFFFFFULL) ? __lzcnt((x) >> 32) \
+ : (__lzcnt(x) + 32)
+*/
+
+#else
+ FORCEINLINE
+ ULONG
+ CountLeadingZeros64(ULONGLONG Value)
+ {
+ ULONG Count = 0;
+ Value = ~Value;
+ while ((LONGLONG)Value < 0)
+ {
+ Count++;
+ Value <<= 1;
+ }
+ return Count;
+ }
+#endif
+
FORCEINLINE
INT
+FASTCALL
Fast486GetCurrentPrivLevel(PFAST486_STATE State)
{
/* Return the CPL, or 3 if we're in virtual 8086 mode */
FORCEINLINE
ULONG
+FASTCALL
Fast486GetPageTableEntry(PFAST486_STATE State,
ULONG VirtualAddress,
BOOLEAN MarkAsDirty)
FORCEINLINE
BOOLEAN
+FASTCALL
Fast486ReadLinearMemory(PFAST486_STATE State,
ULONG LinearAddress,
PVOID Buffer,
FORCEINLINE
BOOLEAN
+FASTCALL
Fast486WriteLinearMemory(PFAST486_STATE State,
ULONG LinearAddress,
PVOID Buffer,
FORCEINLINE
VOID
+FASTCALL
Fast486Exception(PFAST486_STATE State,
FAST486_EXCEPTIONS ExceptionCode)
{
FORCEINLINE
BOOLEAN
+FASTCALL
Fast486StackPush(PFAST486_STATE State,
ULONG Value)
{
FORCEINLINE
BOOLEAN
+FASTCALL
Fast486StackPop(PFAST486_STATE State,
PULONG Value)
{
FORCEINLINE
BOOLEAN
+FASTCALL
Fast486LoadSegment(PFAST486_STATE State,
FAST486_SEG_REGS Segment,
USHORT Selector)
FORCEINLINE
BOOLEAN
+FASTCALL
Fast486FetchByte(PFAST486_STATE State,
PUCHAR Data)
{
FORCEINLINE
BOOLEAN
+FASTCALL
Fast486FetchWord(PFAST486_STATE State,
PUSHORT Data)
{
FORCEINLINE
BOOLEAN
+FASTCALL
Fast486FetchDword(PFAST486_STATE State,
PULONG Data)
{
FORCEINLINE
BOOLEAN
-Fast486GetIntVector(PFAST486_STATE State,
- UCHAR Number,
- PFAST486_IDT_ENTRY IdtEntry)
-{
- ULONG FarPointer;
-
- /* Check for protected mode */
- if (State->ControlRegisters[FAST486_REG_CR0] & FAST486_CR0_PE)
- {
- /* Read from the IDT */
- if (!Fast486ReadLinearMemory(State,
- State->Idtr.Address
- + Number * sizeof(*IdtEntry),
- IdtEntry,
- sizeof(*IdtEntry)))
- {
- /* Exception occurred */
- return FALSE;
- }
- }
- else
- {
- /* Read from the real-mode IVT */
-
- /* Paging is always disabled in real mode */
- State->MemReadCallback(State,
- State->Idtr.Address
- + Number * sizeof(FarPointer),
- &FarPointer,
- sizeof(FarPointer));
-
- /* Fill a fake IDT entry */
- IdtEntry->Offset = LOWORD(FarPointer);
- IdtEntry->Selector = HIWORD(FarPointer);
- IdtEntry->Zero = 0;
- IdtEntry->Type = FAST486_IDT_INT_GATE;
- IdtEntry->Storage = FALSE;
- IdtEntry->Dpl = 0;
- IdtEntry->Present = TRUE;
- IdtEntry->OffsetHigh = 0;
- }
-
- return TRUE;
-}
-
-FORCEINLINE
-BOOLEAN
+FASTCALL
Fast486CalculateParity(UCHAR Number)
{
// See http://graphics.stanford.edu/~seander/bithacks.html#ParityLookupTable too...
FORCEINLINE
BOOLEAN
+FASTCALL
Fast486ParseModRegRm(PFAST486_STATE State,
BOOLEAN AddressSize,
PFAST486_MOD_REG_RM ModRegRm)
FORCEINLINE
BOOLEAN
+FASTCALL
Fast486ReadModrmByteOperands(PFAST486_STATE State,
PFAST486_MOD_REG_RM ModRegRm,
PUCHAR RegValue,
FORCEINLINE
BOOLEAN
+FASTCALL
Fast486ReadModrmWordOperands(PFAST486_STATE State,
PFAST486_MOD_REG_RM ModRegRm,
PUSHORT RegValue,
FORCEINLINE
BOOLEAN
+FASTCALL
Fast486ReadModrmDwordOperands(PFAST486_STATE State,
PFAST486_MOD_REG_RM ModRegRm,
PULONG RegValue,
FORCEINLINE
BOOLEAN
+FASTCALL
Fast486WriteModrmByteOperands(PFAST486_STATE State,
PFAST486_MOD_REG_RM ModRegRm,
BOOLEAN WriteRegister,
FORCEINLINE
BOOLEAN
+FASTCALL
Fast486WriteModrmWordOperands(PFAST486_STATE State,
PFAST486_MOD_REG_RM ModRegRm,
BOOLEAN WriteRegister,
FORCEINLINE
BOOLEAN
+FASTCALL
Fast486WriteModrmDwordOperands(PFAST486_STATE State,
PFAST486_MOD_REG_RM ModRegRm,
BOOLEAN WriteRegister,
FORCEINLINE
VOID
-Fast486FpuNormalize(PFAST486_STATE State, PFAST486_FPU_DATA_REG Data)
+FASTCALL
+Fast486FpuNormalize(PFAST486_STATE State,
+ PFAST486_FPU_DATA_REG Data)
{
- UINT LeadingZeros = 0;
+ UINT LeadingZeros;
if (FPU_IS_NORMALIZED(Data)) return;
if (FPU_IS_ZERO(Data))
return;
}
- /* Count the leading zeros */
- while (!(Data->Mantissa & (1 << (63 - LeadingZeros)))) LeadingZeros++;
+ LeadingZeros = CountLeadingZeros64(Data->Mantissa);
if (LeadingZeros < Data->Exponent)
{
FORCEINLINE
USHORT
+FASTCALL
Fast486GetValueTag(PFAST486_FPU_DATA_REG Data)
{
if (FPU_IS_ZERO(Data)) return FPU_TAG_ZERO;
FORCEINLINE
VOID
+FASTCALL
Fast486FpuPush(PFAST486_STATE State,
PFAST486_FPU_DATA_REG Data)
{
FORCEINLINE
VOID
+FASTCALL
Fast486FpuPop(PFAST486_STATE State)
{
if (FPU_GET_TAG(0) != FPU_TAG_EMPTY)