Sync to trunk head (r47736)
[reactos.git] / lib / sdk / crt / math / i386 / ldexp.c
index b240275..327e72a 100644 (file)
 
 #include <math.h>
 
-double ldexp (double __x, int __y);
-
-double ldexp (double __x, int __y)
+double ldexp (double value, int exp)
 {
-  register double __val;
+    register double result;
 #ifdef __GNUC__
-  __asm __volatile__
-    ("fscale"
-     : "=t" (__val) : "0" (__x), "u" ((double) __y));
+#if defined(__clang__)
+    asm ("fild %[exp]\n"
+         "fscale\n"
+         "fstp %%st(1)\n"
+         : [result] "=t" (result)
+         : [value] "0" (value), [exp] "m" (exp));
 #else
-  register double __dy = (double)__y;
+    asm ("fscale"
+        : "=t" (result)
+         : "0" (value), "u" ((double)exp)
+         : "1");
+#endif
+#else /* !__GNUC__ */
+  register double __dy = (double)exp;
   __asm
   {
     fld __dy
-    fld __x
+    fld value
     fscale
-    fstp __val
+    fstp result
   }
-#endif /*__GNUC__*/
-  return __val;
+#endif /* !__GNUC__ */
+  return result;
 }
+