1898{
1900 BOOLEAN OperandSize, AddressSize;
1901
1902 OperandSize = AddressSize =
State->SegmentRegs[FAST486_REG_CS].Size;
1905
1906
1907 if (!Fast486ParseModRegRm(
State, AddressSize, &ModRegRm))
1908 {
1909
1910 return;
1911 }
1912
1914
1915#ifndef FAST486_NO_FPU
1916
1918 {
1920 {
1921
1922 case 0:
1923 {
1925 FAST486_FPU_DATA_REG MemoryData;
1926
1927 Fast486FpuExceptionCheck(
State);
1930
1931 if (!Fast486ReadModrmDwordOperands(
State, &ModRegRm,
NULL, &
Value))
1932 {
1933
1934 return;
1935 }
1936
1938 Fast486FpuPush(
State, &MemoryData);
1939
1940 break;
1941 }
1942
1943
1944 case 2:
1945
1946 case 3:
1947 {
1949
1950 Fast486FpuExceptionCheck(
State);
1953
1955 {
1956
1958
1959 if (!
State->FpuControl.Im)
1960 {
1961 return;
1962 }
1963 }
1965 {
1966
1967 return;
1968 }
1969
1971 {
1972
1973 return;
1974 }
1975
1977 break;
1978 }
1979
1980
1981 case 4:
1982 {
1985 ?
State->SegmentOverride : FAST486_REG_DS,
1987 OperandSize);
1988 break;
1989 }
1990
1991
1992 case 5:
1993 {
1994 Fast486ReadModrmWordOperands(
State, &ModRegRm,
NULL, &
State->FpuControl.Value);
1995 break;
1996 }
1997
1998
1999 case 6:
2000 {
2003 ?
State->SegmentOverride : FAST486_REG_DS,
2005 OperandSize);
2006 break;
2007 }
2008
2009
2010 case 7:
2011 {
2012 Fast486WriteModrmWordOperands(
State, &ModRegRm,
FALSE,
State->FpuControl.Value);
2013 break;
2014 }
2015
2016
2017 default:
2018 {
2019 Fast486Exception(
State, FAST486_EXCEPTION_UD);
2020 return;
2021 }
2022 }
2023 }
2024 else
2025 {
2027 {
2028
2029 case 0x00:
2030 case 0x01:
2031 case 0x02:
2032 case 0x03:
2033 case 0x04:
2034 case 0x05:
2035 case 0x06:
2036 case 0x07:
2037 {
2038 Fast486FpuExceptionCheck(
State);
2040
2042 {
2043
2045
2046 if (!
State->FpuControl.Im)
2047 {
2048 return;
2049 }
2050 }
2051
2053 break;
2054 }
2055
2056
2057 case 0x08:
2058 case 0x09:
2059 case 0x0A:
2060 case 0x0B:
2061 case 0x0C:
2062 case 0x0D:
2063 case 0x0E:
2064 case 0x0F:
2065 {
2066 FAST486_FPU_DATA_REG Temp;
2067
2068 Fast486FpuExceptionCheck(
State);
2070
2073 {
2075 break;
2076 }
2077
2078
2082
2085
2086 break;
2087 }
2088
2089
2090 case 0x10:
2091 {
2092
2093 break;
2094 }
2095
2096
2097 case 0x18:
2098 case 0x19:
2099 case 0x1A:
2100 case 0x1B:
2101 case 0x1C:
2102 case 0x1D:
2103 case 0x1E:
2104 case 0x1F:
2105 {
2106 Fast486FpuExceptionCheck(
State);
2108
2111
2112 Fast486FpuPop(
State);
2113 break;
2114 }
2115
2116
2117 case 0x20:
2118 {
2119 Fast486FpuExceptionCheck(
State);
2121
2123 {
2125 break;
2126 }
2127
2128
2130
2131 break;
2132 }
2133
2134
2135 case 0x21:
2136 {
2137 Fast486FpuExceptionCheck(
State);
2139
2141 {
2143 break;
2144 }
2145
2146
2148
2149 break;
2150 }
2151
2152
2153 case 0x24:
2154 {
2155 Fast486FpuExceptionCheck(
State);
2157
2159 break;
2160 }
2161
2162
2163 case 0x25:
2164 {
2165 Fast486FpuExceptionCheck(
State);
2167
2168
2170
2172 {
2173 State->FpuStatus.Code0 = 1;
2174 State->FpuStatus.Code2 = 0;
2175 State->FpuStatus.Code3 = 1;
2176 }
2178 {
2180 {
2181 State->FpuStatus.Code0 = 1;
2182 State->FpuStatus.Code2 = 1;
2183 State->FpuStatus.Code3 = 0;
2184 }
2185 else
2186 {
2187 State->FpuStatus.Code0 = 1;
2188 State->FpuStatus.Code2 = 0;
2189 State->FpuStatus.Code3 = 0;
2190 }
2191 }
2193 {
2194 State->FpuStatus.Code0 = 0;
2195 State->FpuStatus.Code2 = 0;
2196 State->FpuStatus.Code3 = 1;
2197 }
2198 else
2199 {
2201 {
2202 State->FpuStatus.Code0 = 0;
2203 State->FpuStatus.Code2 = 1;
2204 State->FpuStatus.Code3 = 0;
2205 }
2206 else
2207 {
2208 State->FpuStatus.Code0 = 0;
2209 State->FpuStatus.Code2 = 1;
2210 State->FpuStatus.Code3 = 1;
2211 }
2212 }
2213
2214 break;
2215 }
2216
2217
2218 case 0x28:
2219
2220 case 0x29:
2221
2222 case 0x2A:
2223
2224 case 0x2B:
2225
2226 case 0x2C:
2227
2228 case 0x2D:
2229
2230 case 0x2E:
2231 {
2232 PCFAST486_FPU_DATA_REG Constants[] =
2233 {
2241 };
2242
2243 Fast486FpuExceptionCheck(
State);
2245
2247 break;
2248 }
2249
2250
2251 case 0x30:
2252 {
2253 Fast486FpuExceptionCheck(
State);
2255
2257 {
2259 break;
2260 }
2261
2263 {
2265
2266 if (!
State->FpuControl.Dm)
2267 {
2268 break;
2269 }
2270 }
2271
2274
2275 break;
2276 }
2277
2278
2279 case 0x31:
2280 {
2281 FAST486_FPU_DATA_REG Logarithm;
2282
2283 Fast486FpuExceptionCheck(
State);
2285
2287 {
2289 break;
2290 }
2291
2293 {
2294
2295 break;
2296 }
2297
2299 {
2300
2301 break;
2302 }
2303
2304
2305 Fast486FpuPop(
State);
2307
2308 break;
2309 }
2310
2311
2312 case 0x32:
2313 {
2314 FAST486_FPU_DATA_REG Sine;
2315 FAST486_FPU_DATA_REG Cosine;
2317
2318 Fast486FpuExceptionCheck(
State);
2320
2321
2323
2324
2331 {
2332 break;
2333 }
2334
2335
2336 Quadrant &= 3;
2337
2338
2342
2343
2344 if (Quadrant == 1 || Quadrant == 2) Cosine.Sign =
TRUE;
2345
2346
2349
2350
2352 break;
2353 }
2354
2355
2356 case 0x33:
2357 {
2358 Fast486FpuExceptionCheck(
State);
2360
2365 {
2366 break;
2367 }
2368
2370
2371 Fast486FpuPop(
State);
2372 break;
2373 }
2374
2375
2376 case 0x34:
2377 {
2379
2380 Fast486FpuExceptionCheck(
State);
2382
2384 {
2387 break;
2388 }
2389
2391 {
2392
2396 }
2398 {
2399
2403 }
2404 else
2405 {
2406
2410 }
2411
2412
2415
2416 break;
2417 }
2418
2419
2420 case 0x35:
2421
2422 case 0x38:
2423 {
2425
2426 Fast486FpuExceptionCheck(
State);
2428
2430 {
2432 break;
2433 }
2434
2440 &Quotient))
2441 {
2443
2444
2445 State->FpuStatus.Code1 = Quotient & 1;
2446 State->FpuStatus.Code3 = (Quotient >> 1) & 1;
2447 State->FpuStatus.Code0 = (Quotient >> 2) & 1;
2448 }
2449
2450 break;
2451 }
2452
2453
2454 case 0x36:
2455 {
2456 State->FpuStatus.Top--;
2457 break;
2458 }
2459
2460
2461 case 0x37:
2462 {
2463 State->FpuStatus.Top++;
2464 break;
2465 }
2466
2467
2468 case 0x39:
2469 {
2470 FAST486_FPU_DATA_REG
Value, Logarithm;
2471
2472 Fast486FpuExceptionCheck(
State);
2474
2476 {
2478 break;
2479 }
2480
2482 {
2483
2484 break;
2485 }
2486
2488 {
2489
2490 break;
2491 }
2492
2494 {
2495
2496 break;
2497 }
2498
2499
2500 Fast486FpuPop(
State);
2502
2503 break;
2504 }
2505
2506
2507 case 0x3A:
2508 {
2509 Fast486FpuExceptionCheck(
State);
2511
2514
2515 break;
2516 }
2517
2518
2519 case 0x3B:
2520 {
2522
2523 Fast486FpuExceptionCheck(
State);
2525
2527 {
2529 break;
2530 }
2531
2533 {
2535
2536 if (!
State->FpuControl.Dm)
2537 {
2538 break;
2539 }
2540 }
2541
2542
2545
2546
2549
2550 break;
2551 }
2552
2553
2554 case 0x3C:
2555 {
2557
2558 Fast486FpuExceptionCheck(
State);
2560
2562 {
2564 break;
2565 }
2566
2568 {
2570
2571 if (!
State->FpuControl.Dm)
2572 {
2573 break;
2574 }
2575 }
2576
2577
2579
2580
2583
2585 break;
2586 }
2587
2588
2589 case 0x3D:
2590 {
2593 INT OldRoundingMode =
State->FpuControl.Rc;
2594
2595 Fast486FpuExceptionCheck(
State);
2597
2599 {
2601 break;
2602 }
2603
2605 {
2607
2608 if (!
State->FpuControl.Dm)
2609 {
2610 break;
2611 }
2612 }
2613
2615
2617 {
2618
2619 State->FpuControl.Rc = OldRoundingMode;
2620 break;
2621 }
2622
2623 State->FpuControl.Rc = OldRoundingMode;
2624
2625
2626 UnbiasedExp += Scale;
2627
2628
2629 if (UnbiasedExp < -1023)
2630 {
2631
2633
2634 if (
State->FpuControl.Um)
2635 {
2636
2639 }
2640
2641 break;
2642 }
2643
2644
2645 if (UnbiasedExp > 1023)
2646 {
2647
2649
2650 if (
State->FpuControl.Om)
2651 {
2652
2656 }
2657
2658 break;
2659 }
2660
2663
2664 break;
2665 }
2666
2667
2668 case 0x3E:
2669 {
2670 Fast486FpuExceptionCheck(
State);
2672
2674 {
2676 break;
2677 }
2678
2680 {
2682
2683 if (!
State->FpuControl.Dm)
2684 {
2685 break;
2686 }
2687 }
2688
2691
2692 break;
2693 }
2694
2695
2696 case 0x3F:
2697 {
2698 Fast486FpuExceptionCheck(
State);
2700
2702 {
2704 break;
2705 }
2706
2708 {
2710
2711 if (!
State->FpuControl.Dm)
2712 {
2713 break;
2714 }
2715 }
2716
2719
2720 break;
2721 }
2722
2723
2724 default:
2725 {
2726 Fast486Exception(
State, FAST486_EXCEPTION_UD);
2727 return;
2728 }
2729 }
2730 }
2731
2732#endif
2733}
static BOOLEAN FASTCALL Fast486FpuAdd(PFAST486_STATE State, PCFAST486_FPU_DATA_REG FirstOperand, PCFAST486_FPU_DATA_REG SecondOperand, PFAST486_FPU_DATA_REG Result)
static BOOLEAN FASTCALL Fast486FpuMultiply(PFAST486_STATE State, PCFAST486_FPU_DATA_REG FirstOperand, PCFAST486_FPU_DATA_REG SecondOperand, PFAST486_FPU_DATA_REG Result)
static BOOLEAN FASTCALL Fast486FpuToSingleReal(PFAST486_STATE State, PCFAST486_FPU_DATA_REG Value, PULONG Result)
static const FAST486_FPU_DATA_REG FpuOne
static BOOLEAN FASTCALL Fast486FpuCalculateSine(PFAST486_STATE State, PCFAST486_FPU_DATA_REG Operand, PFAST486_FPU_DATA_REG Result)
static const FAST486_FPU_DATA_REG FpuLgTwo
static BOOLEAN FASTCALL Fast486FpuCalculateSquareRoot(PFAST486_STATE State, PCFAST486_FPU_DATA_REG Operand, PFAST486_FPU_DATA_REG Result)
static BOOLEAN FASTCALL Fast486FpuCalculateCosine(PFAST486_STATE State, PCFAST486_FPU_DATA_REG Operand, PFAST486_FPU_DATA_REG Result)
static VOID FASTCALL Fast486FpuCompare(PFAST486_STATE State, PCFAST486_FPU_DATA_REG FirstOperand, PCFAST486_FPU_DATA_REG SecondOperand)
static const FAST486_FPU_DATA_REG FpuZero
static BOOLEAN FASTCALL Fast486FpuCalculateArcTangent(PFAST486_STATE State, PCFAST486_FPU_DATA_REG Numerator, PCFAST486_FPU_DATA_REG Denominator, PFAST486_FPU_DATA_REG Result)
static VOID FASTCALL Fast486FpuCalculateTwoPowerMinusOne(PFAST486_STATE State, PCFAST486_FPU_DATA_REG Operand, PFAST486_FPU_DATA_REG Result)
static const FAST486_FPU_DATA_REG FpuL2E
static BOOLEAN FASTCALL Fast486FpuCalculateLogBase2(PFAST486_STATE State, PCFAST486_FPU_DATA_REG Operand, PFAST486_FPU_DATA_REG Result)
static const FAST486_FPU_DATA_REG FpuLnTwo
static BOOLEAN FASTCALL Fast486FpuLoadEnvironment(PFAST486_STATE State, INT Segment, ULONG Address, BOOLEAN Size)
static BOOLEAN FASTCALL Fast486FpuRemainder(PFAST486_STATE State, PCFAST486_FPU_DATA_REG FirstOperand, PCFAST486_FPU_DATA_REG SecondOperand, BOOLEAN RoundToNearest, PFAST486_FPU_DATA_REG Result OPTIONAL, PLONGLONG Quotient OPTIONAL)
static BOOLEAN FASTCALL Fast486FpuToInteger(PFAST486_STATE State, PCFAST486_FPU_DATA_REG Value, PLONGLONG Result)
static VOID FASTCALL Fast486FpuFromInteger(PFAST486_STATE State, LONGLONG Value, PFAST486_FPU_DATA_REG Result)
static const FAST486_FPU_DATA_REG FpuL2Ten
static BOOLEAN FASTCALL Fast486FpuSubtract(PFAST486_STATE State, PCFAST486_FPU_DATA_REG FirstOperand, PCFAST486_FPU_DATA_REG SecondOperand, PFAST486_FPU_DATA_REG Result)
static BOOLEAN FASTCALL Fast486FpuDivide(PFAST486_STATE State, PCFAST486_FPU_DATA_REG FirstOperand, PCFAST486_FPU_DATA_REG SecondOperand, PFAST486_FPU_DATA_REG Result)
static const FAST486_FPU_DATA_REG FpuHalfPi
static BOOLEAN FASTCALL Fast486FpuSaveEnvironment(PFAST486_STATE State, INT Segment, ULONG Address, BOOLEAN Size)
static const FAST486_FPU_DATA_REG FpuPi
#define FPU_REAL4_INDEFINITE
#define FPU_UPDATE_TAG(i)
#define FPU_IS_NORMALIZED(x)
#define FPU_IS_INDEFINITE(x)
#define FPU_IS_INFINITY(x)
#define FPU_MANTISSA_HIGH_BIT
__GNU_EXTENSION typedef __int64 * PLONGLONG
_In_opt_ PENTER_STATE_SYSTEM_HANDLER _In_opt_ PVOID _In_ LONG _In_opt_ LONG volatile * Number
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO