[FAST486]
[reactos.git] / reactos / lib / fast486 / common.inl
index 7a28f9d..57bf933 100644 (file)
 
 /* 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 */
@@ -34,6 +62,7 @@ Fast486GetCurrentPrivLevel(PFAST486_STATE State)
 
 FORCEINLINE
 ULONG
+FASTCALL
 Fast486GetPageTableEntry(PFAST486_STATE State,
                          ULONG VirtualAddress,
                          BOOLEAN MarkAsDirty)
@@ -118,6 +147,7 @@ Fast486GetPageTableEntry(PFAST486_STATE State,
 
 FORCEINLINE
 BOOLEAN
+FASTCALL
 Fast486ReadLinearMemory(PFAST486_STATE State,
                         ULONG LinearAddress,
                         PVOID Buffer,
@@ -184,6 +214,7 @@ Fast486ReadLinearMemory(PFAST486_STATE State,
 
 FORCEINLINE
 BOOLEAN
+FASTCALL
 Fast486WriteLinearMemory(PFAST486_STATE State,
                          ULONG LinearAddress,
                          PVOID Buffer,
@@ -252,6 +283,7 @@ Fast486WriteLinearMemory(PFAST486_STATE State,
 
 FORCEINLINE
 VOID
+FASTCALL
 Fast486Exception(PFAST486_STATE State,
                  FAST486_EXCEPTIONS ExceptionCode)
 {
@@ -261,6 +293,7 @@ Fast486Exception(PFAST486_STATE State,
 
 FORCEINLINE
 BOOLEAN
+FASTCALL
 Fast486StackPush(PFAST486_STATE State,
                  ULONG Value)
 {
@@ -317,6 +350,7 @@ Fast486StackPush(PFAST486_STATE State,
 
 FORCEINLINE
 BOOLEAN
+FASTCALL
 Fast486StackPop(PFAST486_STATE State,
                 PULONG Value)
 {
@@ -391,6 +425,7 @@ Fast486StackPop(PFAST486_STATE State,
 
 FORCEINLINE
 BOOLEAN
+FASTCALL
 Fast486LoadSegment(PFAST486_STATE State,
                    FAST486_SEG_REGS Segment,
                    USHORT Selector)
@@ -601,6 +636,7 @@ Fast486LoadSegment(PFAST486_STATE State,
 
 FORCEINLINE
 BOOLEAN
+FASTCALL
 Fast486FetchByte(PFAST486_STATE State,
                  PUCHAR Data)
 {
@@ -631,6 +667,7 @@ Fast486FetchByte(PFAST486_STATE State,
 
 FORCEINLINE
 BOOLEAN
+FASTCALL
 Fast486FetchWord(PFAST486_STATE State,
                  PUSHORT Data)
 {
@@ -662,6 +699,7 @@ Fast486FetchWord(PFAST486_STATE State,
 
 FORCEINLINE
 BOOLEAN
+FASTCALL
 Fast486FetchDword(PFAST486_STATE State,
                   PULONG Data)
 {
@@ -693,53 +731,7 @@ Fast486FetchDword(PFAST486_STATE State,
 
 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...
@@ -748,6 +740,7 @@ Fast486CalculateParity(UCHAR Number)
 
 FORCEINLINE
 BOOLEAN
+FASTCALL
 Fast486ParseModRegRm(PFAST486_STATE State,
                      BOOLEAN AddressSize,
                      PFAST486_MOD_REG_RM ModRegRm)
@@ -1015,6 +1008,7 @@ Fast486ParseModRegRm(PFAST486_STATE State,
 
 FORCEINLINE
 BOOLEAN
+FASTCALL
 Fast486ReadModrmByteOperands(PFAST486_STATE State,
                              PFAST486_MOD_REG_RM ModRegRm,
                              PUCHAR RegValue,
@@ -1081,6 +1075,7 @@ Fast486ReadModrmByteOperands(PFAST486_STATE State,
 
 FORCEINLINE
 BOOLEAN
+FASTCALL
 Fast486ReadModrmWordOperands(PFAST486_STATE State,
                              PFAST486_MOD_REG_RM ModRegRm,
                              PUSHORT RegValue,
@@ -1129,6 +1124,7 @@ Fast486ReadModrmWordOperands(PFAST486_STATE State,
 
 FORCEINLINE
 BOOLEAN
+FASTCALL
 Fast486ReadModrmDwordOperands(PFAST486_STATE State,
                               PFAST486_MOD_REG_RM ModRegRm,
                               PULONG RegValue,
@@ -1177,6 +1173,7 @@ Fast486ReadModrmDwordOperands(PFAST486_STATE State,
 
 FORCEINLINE
 BOOLEAN
+FASTCALL
 Fast486WriteModrmByteOperands(PFAST486_STATE State,
                               PFAST486_MOD_REG_RM ModRegRm,
                               BOOLEAN WriteRegister,
@@ -1241,6 +1238,7 @@ Fast486WriteModrmByteOperands(PFAST486_STATE State,
 
 FORCEINLINE
 BOOLEAN
+FASTCALL
 Fast486WriteModrmWordOperands(PFAST486_STATE State,
                               PFAST486_MOD_REG_RM ModRegRm,
                               BOOLEAN WriteRegister,
@@ -1287,6 +1285,7 @@ Fast486WriteModrmWordOperands(PFAST486_STATE State,
 
 FORCEINLINE
 BOOLEAN
+FASTCALL
 Fast486WriteModrmDwordOperands(PFAST486_STATE State,
                                PFAST486_MOD_REG_RM ModRegRm,
                                BOOLEAN WriteRegister,
@@ -1335,9 +1334,11 @@ Fast486WriteModrmDwordOperands(PFAST486_STATE State,
 
 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))
@@ -1346,8 +1347,7 @@ Fast486FpuNormalize(PFAST486_STATE State, PFAST486_FPU_DATA_REG Data)
         return;
     }
 
-    /* Count the leading zeros */
-    while (!(Data->Mantissa & (1 << (63 - LeadingZeros)))) LeadingZeros++;
+    LeadingZeros = CountLeadingZeros64(Data->Mantissa);
 
     if (LeadingZeros < Data->Exponent)
     {
@@ -1367,6 +1367,7 @@ Fast486FpuNormalize(PFAST486_STATE State, PFAST486_FPU_DATA_REG Data)
 
 FORCEINLINE
 USHORT
+FASTCALL
 Fast486GetValueTag(PFAST486_FPU_DATA_REG Data)
 {
     if (FPU_IS_ZERO(Data)) return FPU_TAG_ZERO;
@@ -1376,6 +1377,7 @@ Fast486GetValueTag(PFAST486_FPU_DATA_REG Data)
 
 FORCEINLINE
 VOID
+FASTCALL
 Fast486FpuPush(PFAST486_STATE State,
                PFAST486_FPU_DATA_REG Data)
 {
@@ -1391,6 +1393,7 @@ Fast486FpuPush(PFAST486_STATE State,
 
 FORCEINLINE
 VOID
+FASTCALL
 Fast486FpuPop(PFAST486_STATE State)
 {
     if (FPU_GET_TAG(0) != FPU_TAG_EMPTY)