]> www.ginac.de Git - cln.git/blobdiff - src/integer/elem/cl_I_square.cc
Use paths relative the `src' directory in the #include directives.
[cln.git] / src / integer / elem / cl_I_square.cc
index 64aaf02165d48ed3df167c54fe75bafb8e88873a..3474a408d839db82d98101ef16aa240ce52c99a3 100644 (file)
@@ -1,7 +1,7 @@
 // square().
 
 // General includes.
-#include "cl_sysdep.h"
+#include "base/cl_sysdep.h"
 
 // Specification.
 #include "cln/integer.h"
@@ -9,9 +9,9 @@
 
 // Implementation.
 
-#include "cl_I.h"
-#include "cl_DS.h"
-#include "cl_low.h"
+#include "integer/cl_I.h"
+#include "base/digitseq/cl_DS.h"
+#include "base/cl_low.h"
 
 namespace cln {
 
@@ -21,19 +21,25 @@ const cl_I square (const cl_I& x)
   // x Fixnum -> direkt multiplizieren
   // sonst: zu DS machen, multiplizieren.
       if (fixnump(x))
-        { var sint32 x_ = FN_to_L(x);
-          // Werte direkt multiplizieren:
-          var uint32 hi;
-          var uint32 lo;
-          mulu32((uint32)x_,(uint32)x_,hi=,lo=); // erst unsigned multiplizieren
-          if (x_ < 0) { hi -= 2*(uint32)x_; } // dann Korrektur für Vorzeichen
-          return L2_to_I(hi,lo);
+        { var sintV x_ = FN_to_V(x);
+          #if (cl_value_len > 32)
+          // nur falls x ein Integer mit höchstens 32 Bit ist:
+          if ((uintV)((sintV)sign_of(x_) ^ x_) < bit(31))
+          #endif
+            {
+              // Werte direkt multiplizieren:
+              var uint32 hi;
+              var uint32 lo;
+              mulu32((uint32)x_,(uint32)x_,hi=,lo=); // erst unsigned multiplizieren
+              if (x_ < 0) { hi -= 2*(uint32)x_; } // dann Korrektur für Vorzeichen
+              return L2_to_I(hi,lo);
+            }
         }
       CL_ALLOCA_STACK;
       var const uintD* xMSDptr;
       var uintC xlen;
       var const uintD* xLSDptr;
-      I_to_NDS_nocopy(x, xMSDptr = , xlen = , xLSDptr = , cl_false,);
+      I_to_NDS_nocopy(x, xMSDptr = , xlen = , xLSDptr = , false,);
       var uintD* ergMSDptr;
       var uintC erglen = 2*xlen;
       var uintD* ergLSDptr;