Index: uspace/lib/math/generic/internal.h
===================================================================
--- uspace/lib/math/generic/internal.h	(revision 09ab0a9afc9379f1604c0fd75cac2d9287ba022c)
+++ uspace/lib/math/generic/internal.h	(revision 048a6e9c127d74bfa46a05fbda6db15033ceea86)
@@ -31,4 +31,118 @@
 #define MATH_INTERNAL_H_
 
+#include <stdint.h>
+
+#if __BE__
+
+typedef union
+{
+	double value;
+	struct
+	{
+		uint32_t msw;
+		uint32_t lsw;
+	} parts;
+	uint64_t word;
+} ieee_double_shape_type;
+
+#endif
+
+#if __LE__
+
+typedef union
+{
+	double value;
+	struct
+	{
+		uint32_t lsw;
+		uint32_t msw;
+	} parts;
+	uint64_t word;
+} ieee_double_shape_type;
+
+#endif
+
+#define EXTRACT_WORDS(ix0,ix1,d)                                \
+do {                                                                \
+  ieee_double_shape_type ew_u;                                        \
+  ew_u.value = (d);                                                \
+  (ix0) = ew_u.parts.msw;                                        \
+  (ix1) = ew_u.parts.lsw;                                        \
+} while (0)
+
+/* Get the more significant 32 bit int from a double.  */
+#ifndef GET_HIGH_WORD
+# define GET_HIGH_WORD(i,d)                                        \
+do {                                                                \
+  ieee_double_shape_type gh_u;                                        \
+  gh_u.value = (d);                                                \
+  (i) = gh_u.parts.msw;                                                \
+} while (0)
+#endif
+
+/* Get the less significant 32 bit int from a double.  */
+#ifndef GET_LOW_WORD
+# define GET_LOW_WORD(i,d)                                        \
+do {                                                                \
+  ieee_double_shape_type gl_u;                                        \
+  gl_u.value = (d);                                                \
+  (i) = gl_u.parts.lsw;                                                \
+} while (0)
+#endif
+
+/* Get all in one, efficient on 64-bit machines.  */
+#ifndef EXTRACT_WORDS64
+# define EXTRACT_WORDS64(i,d)                                        \
+do {                                                                \
+  ieee_double_shape_type gh_u;                                        \
+  gh_u.value = (d);                                                \
+  (i) = gh_u.word;                                                \
+} while (0)
+#endif
+
+/* Set a double from two 32 bit ints.  */
+#ifndef INSERT_WORDS
+# define INSERT_WORDS(d,ix0,ix1)                                \
+do {                                                                \
+  ieee_double_shape_type iw_u;                                        \
+  iw_u.parts.msw = (ix0);                                        \
+  iw_u.parts.lsw = (ix1);                                        \
+  (d) = iw_u.value;                                                \
+} while (0)
+#endif
+
+/* Get all in one, efficient on 64-bit machines.  */
+#ifndef INSERT_WORDS64
+# define INSERT_WORDS64(d,i)                                        \
+do {                                                                \
+  ieee_double_shape_type iw_u;                                        \
+  iw_u.word = (i);                                                \
+  (d) = iw_u.value;                                                \
+} while (0)
+#endif
+
+/* Set the more significant 32 bits of a double from an int.  */
+#ifndef SET_HIGH_WORD
+#define SET_HIGH_WORD(d,v)                                        \
+do {                                                                \
+  ieee_double_shape_type sh_u;                                        \
+  sh_u.value = (d);                                                \
+  sh_u.parts.msw = (v);                                                \
+  (d) = sh_u.value;                                                \
+} while (0)
+#endif
+
+/* Set the less significant 32 bits of a double from an int.  */
+#ifndef SET_LOW_WORD
+# define SET_LOW_WORD(d,v)                                        \
+do {                                                                \
+  ieee_double_shape_type sl_u;                                        \
+  sl_u.value = (d);                                                \
+  sl_u.parts.lsw = (v);                                                \
+  (d) = sl_u.value;                                                \
+} while (0)
+#endif
+
+
 float __math_base_sin_32(float);
 float __math_base_cos_32(float);
