replaced by loading a float argument from memory and using the "m" modifier
Unified · Split
| @@ -316,7 +316,10 @@ extern "C" { · 315 unmodified lines | ||
| 316 | 316 | |
| 317 | 317 | __CRT_INLINE int __cdecl __fpclassifyl (long double x){ |
| 318 | 318 | unsigned short sw; |
| 319 | − __asm__ ("fxam; fstsw %%ax;" : "=a" (sw): "t" (x)); | |
| 319 | + __asm__ ( | |
| 320 | + "fldt %1 \n" | |
| 321 | + "fxam \n" | |
| 322 | + "fstsw %0 \n" : "=a" (sw): "m" (x)); | |
| 320 | 323 | return sw & (FP_NAN | FP_NORMAL | FP_ZERO ); |
| 321 | 324 | } |
| 322 | 325 | |
| @@ -337,8 +340,11 @@ extern "C" { · 14 unmodified lines | ||
| 337 | 340 | __CRT_INLINE int __cdecl __isnan (double _x) |
| 338 | 341 | { |
| 339 | 342 | unsigned short sw; |
| 340 | − __asm__ ("fxam;" | |
| 341 | − "fstsw %%ax": "=a" (sw) : "t" (_x)); | |
| 343 | + __asm__ ( | |
| 344 | + "fldl %1 \n" | |
| 345 | + "fxam \n" | |
| 346 | + "fstsw %0 \n" : "=a" (sw) : "m" (_x)); | |
| 347 | + | |
| 342 | 348 | return (sw & (FP_NAN | FP_NORMAL | FP_INFINITE | FP_ZERO | FP_SUBNORMAL)) |
| 343 | 349 | == FP_NAN; |
| 344 | 350 | } |
| @@ -346,8 +352,11 @@ extern "C" { · 1 unmodified line | ||
| 346 | 352 | __CRT_INLINE int __cdecl __isnanf (float _x) |
| 347 | 353 | { |
| 348 | 354 | unsigned short sw; |
| 349 | − __asm__ ("fxam;" | |
| 350 | − "fstsw %%ax": "=a" (sw) : "t" (_x)); | |
| 355 | + __asm__ ( | |
| 356 | + "flds %1 \n" | |
| 357 | + "fxam \n" | |
| 358 | + "fstsw %0 \n" : "=a" (sw) : "m" (_x)); | |
| 359 | + | |
| 351 | 360 | return (sw & (FP_NAN | FP_NORMAL | FP_INFINITE | FP_ZERO | FP_SUBNORMAL)) |
| 352 | 361 | == FP_NAN; |
| 353 | 362 | } |
| @@ -355,8 +364,11 @@ extern "C" { · 1 unmodified line | ||
| 355 | 364 | __CRT_INLINE int __cdecl __isnanl (long double _x) |
| 356 | 365 | { |
| 357 | 366 | unsigned short sw; |
| 358 | − __asm__ ("fxam;" | |
| 359 | − "fstsw %%ax": "=a" (sw) : "t" (_x)); | |
| 367 | + __asm__ ( | |
| 368 | + "fldt %1 \n" | |
| 369 | + "fxam \n" | |
| 370 | + "fstsw %0 \n" : "=a" (sw) : "m" (_x)); | |
| 371 | + | |
| 360 | 372 | return (sw & (FP_NAN | FP_NORMAL | FP_INFINITE | FP_ZERO | FP_SUBNORMAL)) |
| 361 | 373 | == FP_NAN; |
| 362 | 374 | } |
| @@ -372,19 +384,28 @@ extern "C" { · 9 unmodified lines | ||
| 372 | 384 | /* 7.12.3.6 The signbit macro */ |
| 373 | 385 | __CRT_INLINE int __cdecl __signbit (double x) { |
| 374 | 386 | unsigned short stw; |
| 375 | − __asm__ ( "fxam; fstsw %%ax;": "=a" (stw) : "t" (x)); | |
| 387 | + __asm__ ( | |
| 388 | + "fldl %1 \n" | |
| 389 | + "fxam \n" | |
| 390 | + "fstsw %0 \n" : "=a" (stw) : "m" (x)); | |
| 376 | 391 | return stw & 0x0200; |
| 377 | 392 | } |
| 378 | 393 | |
| 379 | 394 | __CRT_INLINE int __cdecl __signbitf (float x) { |
| 380 | 395 | unsigned short stw; |
| 381 | − __asm__ ("fxam; fstsw %%ax;": "=a" (stw) : "t" (x)); | |
| 396 | + __asm__ ( | |
| 397 | + "flds %1 \n" | |
| 398 | + "fxam \n" | |
| 399 | + "fstsw %0 \n" : "=a" (stw) : "m" (x)); | |
| 382 | 400 | return stw & 0x0200; |
| 383 | 401 | } |
| 384 | 402 | |
| 385 | 403 | __CRT_INLINE int __cdecl __signbitl (long double x) { |
| 386 | 404 | unsigned short stw; |
| 387 | − __asm__ ("fxam; fstsw %%ax;": "=a" (stw) : "t" (x)); | |
| 405 | + __asm__ ( | |
| 406 | + "fldt %1 \n" | |
| 407 | + "fxam \n" | |
| 408 | + "fstsw %0 \n" : "=a" (stw) : "m" (x)); | |
| 388 | 409 | return stw & 0x0200; |
| 389 | 410 | } |
| 390 | 411 | |