Ilya Zakharevich on Sun, 10 Nov 2002 01:16:56 -0800


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Re: sizeof(long) > sizeof(long*)?


On Mon, Nov 04, 2002 at 08:07:31PM +0100, Bill Allombert wrote:
> On Fri, Nov 01, 2002 at 12:13:16AM -0800, Ilya Zakharevich wrote:
> > On which architectures can PARI run with sizeof(long) > sizeof(long*)?
> > I tested, and it does not work on x86.
> 
> None, as far as I know.
> None of the 11 architectures I have access to exhibit this behaviour.

This patch kinda-allows compiling with GEN = long long*.  The result
of make bench is

* Testing objets        for gp-sta..TIME=480
* Testing analyz        for gp-sta..TIME=540
* Testing number        for gp-sta..TIME=760
* Testing polyser       for gp-sta..BUG [0]
* Testing linear        for gp-sta..TIME=470
* Testing elliptic      for gp-sta..TIME=590
* Testing sumiter       for gp-sta..TIME=800
* Testing graph         for gp-sta..TIME=190
* Testing program       for gp-sta..BUG [360]
* Testing trans         for gp-sta..TIME=960
* Testing nfields       for gp-sta..BUG [0]

with program failing due to install() issues, and polyser and nfields
being manually killed due to (apparent) infinite loops.  It is out of
my league to debug these problems - I get lost in the labirinth of
small undocumented functions with zillions of undocumented arguments.
[The polyser loop happens in polroots(x^5-5*x^2-5*x-5) - dft() is
called again and again with increasing precision.]

As I might guess, the current test suite may touch only circa 5% of
the branches in the core, so the success of many tests is not a *very*
good indication.

In addition to long long, the patch also fixes one memory overrun (in
vpariputs()), and wrong prototypes (see paridecl.h).

Before applying the patch, a massive replace should be made, e.g., by
running (pfind is available from my directory 'scripts' on CPAN):

pfind src '/\.[ch]$/' '=~ s/\b(unsigned\s+|u)long\b/PARI_uword/g'
pfind src '/\.[ch]$/' '=~ s/\blong\b/PARI_word/g'
pfind src '/\.[ch]$/' '=~ s/\b(\d+|0[0-7]+|0x[\da-fA-F])(U?)L\b/as_${2}WORD($1)/g'
pfind src '/\.[ch]$/'  '=~ s/(%[.0-9]*)l([ux])\"/$1\"UW${2}f/g'
pfind src '/\.[ch]$/'  '=~ s/(%[.0-9]*)l([d])\"/$1\"IW${2}f/g'
pfind src '/\.[ch]$/'  '=~ s/(%[.0-9]*)l([ux])/$1\"UW${2}f\"/g'
pfind src '/\.[ch]$/'  '=~ s/(%[.0-9]*)l([d])/$1\"IW${2}f\"/g'

See also the first XXXX comment in the text of the patch (for
gaussmoduloall()).  I'm not absolutely sure, but it may be
little-endian specific.  Two others XXXX's are for some incredibly
fishy misuse of GENs - but I expect it to work with long long too.

Enjoy,
Ilya

diff -pru pari-word-new2/src/basemath/alglin1.c pari-word-new1/src/basemath/alglin1.c
--- pari-word-new2/src/basemath/alglin1.c	Sun Nov 10 01:03:48 2002
+++ pari-word-new1/src/basemath/alglin1.c	Sun Nov 10 00:26:24 2002
@@ -777,13 +777,14 @@ isscalarmat(GEN x, GEN s)
 
   for (j=1; j<=nco; j++)
   {
-    GEN *col = (GEN*) x[j];
+    GEN col = VEC_elt(x,j);
+
     for (i=1; i<=nco; i++)
       if (i == j)
       {
-        if (!gegal(col[i],s)) return 0;
+        if (!gegal(VEC_elt(col, i),s)) return 0;
       }
-      else if (!gcmp0(col[i])) return 0;
+      else if (!gcmp0(VEC_elt(col,i))) return 0;
   }
   return 1;
 }
@@ -799,9 +800,9 @@ isdiagonal(GEN x)
 
   for (j=1; j<=nco; j++)
   {
-    GEN *col = (GEN*) x[j];
+    GEN col = VEC_elt(x,j);
     for (i=1; i<=nco; i++)
-      if (i!=j && !gcmp0(col[i])) return 0;
+      if (i!=j && !gcmp0(VEC_elt(col,i))) return 0;
   }
   return 1;
 }
@@ -1928,7 +1929,7 @@ deplin(GEN x0)
 {
   pari_sp av = avma;
   PARI_word i,j,k,t,nc,nl;
-  GEN x,y,piv,q,c,l,*d,*ck,*cj;
+  GEN x,y,piv,q,c,l,d,ck,cj;
 
   t = typ(x0);
   if (t == t_MAT) x = dummycopy(x0);
@@ -1939,22 +1940,22 @@ deplin(GEN x0)
   }
   nc = lg(x)-1; if (!nc) err(talker,"empty matrix in deplin");
   nl = lg(x[1])-1;
-  d = (GEN*)cgetg(nl+1,t_VEC); /* pivot list */
+  d = cgetg(nl+1,t_VEC); /* pivot list */
   c = cgetg(nl+1, t_VECSMALL);
   l = cgetg(nc+1, t_VECSMALL); /* not initialized */
-  for (i=1; i<=nl; i++) { d[i] = gun; c[i] = 0; }
+  for (i=1; i<=nl; i++) { d[i] = un; c[i] = 0; }
   ck = NULL; /* gcc -Wall */
   for (k=1; k<=nc; k++)
   {
-    ck = (GEN*)x[k];
+    ck = VEC_elt(x,k);
     for (j=1; j<k; j++)
     {
-      cj = (GEN*)x[j]; piv = d[j]; q = gneg(ck[l[j]]);
+      cj = VEC_elt(x,j); piv = VEC_elt(d,j); q = gneg(VEC_elt(ck,l[j]));
       for (i=1; i<=nl; i++)
-        if (i != l[j]) ck[i] = gadd(gmul(piv, ck[i]), gmul(q, cj[i]));
+        if (i != l[j]) ck[i] = ladd(gmul(piv, VEC_elt(ck,i)), gmul(q, VEC_elt(cj,i)));
     }
 
-    i = gauss_get_pivot_NZ((GEN)ck, NULL, c, 1);
+    i = gauss_get_pivot_NZ(ck, NULL, c, 1);
     if (i > nl) break;
 
     d[k] = ck[i];
@@ -1963,11 +1964,11 @@ deplin(GEN x0)
   if (k > nc) { avma = av; return zerocol(nc); }
   if (k == 1) { avma = av; return gscalcol_i(gun,nc); }
   y = cgetg(nc+1,t_COL);
-  y[1] = (PARI_word)ck[ l[1] ];
-  for (q=d[1],j=2; j<k; j++)
+  y[1] = ck[ l[1] ];
+  for (q=VEC_elt(d,1),j=2; j<k; j++)
   {
-    y[j] = lmul(ck[ l[j] ], q);
-    q = gmul(q, d[j]);
+    y[j] = lmul(VEC_elt(ck, l[j]), q);
+    q = gmul(q, VEC_elt(d,j));
   }
   y[j] = lneg(q);
   for (j++; j<=nc; j++) y[j] = zero;
@@ -3152,7 +3153,7 @@ det(GEN a)
   a = dummycopy(a); s = 1;
   for (pprec=gun,i=1; i<nbco; i++,pprec=p)
   {
-    GEN *ci, *ck, m, p1;
+    GEN ci, ck, m, p1;
     int diveuc = (gcmp1(pprec)==0);
 
     p = gcoeff(a,i,i);
@@ -3163,10 +3164,10 @@ det(GEN a)
       swap(a[k], a[i]); s = -s;
       p = gcoeff(a,i,i);
     }
-    ci = (GEN*)a[i];
+    ci = VEC_elt(a,i);
     for (k=i+1; k<=nbco; k++)
     {
-      ck = (GEN*)a[k]; m = (GEN)ck[i];
+      ck = VEC_elt(a,k); m = VEC_elt(ck,i);
       if (gcmp0(m))
       {
         if (gcmp1(p))
@@ -3177,9 +3178,9 @@ det(GEN a)
         else
           for (j=i+1; j<=nbco; j++)
           {
-            p1 = gmul(p,ck[j]);
+            p1 = gmul(p,VEC_elt(ck,j));
             if (diveuc) p1 = mydiv(p1,pprec);
-            ck[j] = p1;
+            VEC_elt_set(ck,j, p1);
           }
       }
       else
@@ -3187,16 +3188,16 @@ det(GEN a)
         m = gneg_i(m);
         for (j=i+1; j<=nbco; j++)
         {
-          p1 = gadd(gmul(p,ck[j]), gmul(m,ci[j]));
+          p1 = gadd(gmul(p,VEC_elt(ck,j)), gmul(m,VEC_elt(ci,j)));
           if (diveuc) p1 = mydiv(p1,pprec);
-          ck[j] = p1;
+          VEC_elt_set(ck, j, p1);
         }
       }
       if (low_stack(lim,stack_lim(av,2)))
       {
         GEN *gptr[2]; gptr[0]=&a; gptr[1]=&pprec;
         if(DEBUGMEM>1) err(warnmem,"det. col = %"IWdf,i);
-        gerepilemany(av,gptr,2); p = gcoeff(a,i,i); ci = (GEN*)a[i];
+        gerepilemany(av,gptr,2); p = gcoeff(a,i,i); ci = VEC_elt(a,i);
       }
     }
     if (DEBUGLEVEL > 7) msgtimer("det, col %"IWdf" / %"IWdf,i,nbco-1);
@@ -3210,7 +3211,7 @@ det(GEN a)
  * If ptu1 != NULL, put in *ptu1 a Z-basis of the homogeneous system
  */
 static GEN
-gaussmoduloall(GEN M, GEN D, GEN Y, GEN *ptu1)
+gaussmoduloall(GEN M, GEN D, GEN Y, GEN ptu1)
 {
   pari_sp av = avma, tetpil;
   PARI_word n,m,i,j,lM;
@@ -3262,7 +3263,9 @@ gaussmoduloall(GEN M, GEN D, GEN Y, GEN 
   else
   {
     GEN *gptr[2];
-    *ptu1=gcopy(u1); gptr[0]=ptu1; gptr[1]=&x;
+    *ptu1=lcopy(u1);
+    /* XXXX This pointer conversion assumes low-endian! */
+    gptr[0]=(GEN*)ptu1; gptr[1]=&x;
     gerepilemanysp(av,tetpil,gptr,2);
   }
   return x;
@@ -3277,7 +3280,7 @@ matsolvemod0(GEN M, GEN D, GEN Y, PARI_w
   if (!flag) return gaussmoduloall(M,D,Y,NULL);
 
   av=avma; y = cgetg(3,t_VEC);
-  p1 = gaussmoduloall(M,D,Y, (GEN*)y+2);
+  p1 = gaussmoduloall(M,D,Y, y+2);
   if (p1==gzero) { avma=av; return gzero; }
   y[1] = (PARI_word)p1; return y;
 }
diff -pru pari-word-new2/src/basemath/alglin2.c pari-word-new1/src/basemath/alglin2.c
--- pari-word-new2/src/basemath/alglin2.c	Sun Nov 10 01:03:48 2002
+++ pari-word-new1/src/basemath/alglin2.c	Sun Nov 10 00:26:24 2002
@@ -28,7 +28,7 @@ Foundation, Inc., 59 Temple Place - Suit
 /*******************************************************************/
 
 GEN
-charpoly0(GEN x, int v, PARI_word flag)
+charpoly0(GEN x, PARI_word v, PARI_word flag)
 {
   if (v<0) v = 0;
   switch(flag)
@@ -2246,9 +2246,9 @@ mynegi(GEN x)
 }
 
 static void
-Minus(PARI_word j, GEN **lambda)
+Minus(PARI_word j, PARI_word n, GEN **lambda)
 {
-  PARI_word k, n = lg(lambda);
+  PARI_word k;
 
   for (k=1  ; k<j; k++) lambda[j][k] = mynegi(lambda[j][k]);
   for (k=j+1; k<n; k++) lambda[k][j] = mynegi(lambda[k][j]);
@@ -2296,25 +2296,25 @@ findi(GEN M)
 }
 
 static PARI_word
-findi_normalize(GEN Aj, GEN B, PARI_word j, GEN **lambda)
+findi_normalize(GEN Aj, GEN B, PARI_word j, PARI_word n, GEN **lambda)
 {
   PARI_word r = findi(Aj);
   if (r && signe(Aj[r]) < 0)
   {
     neg_col(Aj); if (B) neg_col((GEN)B[j]);
-    Minus(j,lambda);
+    Minus(j,n,lambda);
   }
   return r;
 }
 
 static void
-reduce2(GEN A, GEN B, PARI_word k, PARI_word j, PARI_word *row, GEN **lambda, GEN *D)
+reduce2(GEN A, GEN B, PARI_word k, PARI_word j, PARI_word n, PARI_word *row, GEN **lambda, GEN *D)
 {
   GEN q;
   PARI_word i, row0, row1;
 
-  row[0] = row0 = findi_normalize((GEN)A[j], B,j,lambda);
-  row[1] = row1 = findi_normalize((GEN)A[k], B,k,lambda);
+  row[0] = row0 = findi_normalize((GEN)A[j], B,j,n,lambda);
+  row[1] = row1 = findi_normalize((GEN)A[k], B,k,n,lambda);
   if (row0)
     q = truedvmdii(gcoeff(A,row0,k), gcoeff(A,row0,j), NULL);
   else if (absi_cmp(shifti(lambda[k][j], 1), D[j]) > 0)
@@ -2399,20 +2399,24 @@ hnflll_i(GEN A, GEN *ptB, int remove)
   pari_sp av = avma, lim = stack_lim(av,3);
   PARI_word m1 = 1, n1 = 1; /* alpha = m1/n1. Maybe 3/4 here ? */
   PARI_word row[2], do_swap,i,n,k;
-  GEN z,B, **lambda, *D;
+  GEN z,B, lambda1, D1, **lambda, *D;
 
   if (typ(A) != t_MAT) err(typeer,"hnflll");
   n = lg(A);
   A = ZM_copy(fix_rows(A));
   B = ptB? idmat(n-1): NULL;
-  D = (GEN*)cgetg(n+1,t_VEC); lambda = (GEN**) cgetg(n,t_MAT);
-  D++;
+  D1 = cgetg(n+1,t_VEC); lambda1 = cgetg(n,t_MAT);
+  D = (GEN*)(D1+1);
+  lambda = ((GEN**)(lambda1+1))-1;
   for (i=0; i<n; i++) D[i] = gun;
-  for (i=1; i<n; i++) lambda[i] = (GEN*)zerocol(n-1);
+  for (i=1; i<n; i++) {
+      lambda[i] = ((GEN*)(cgetg(n,t_COL)+1))-1;
+      for (k=1; k<n; k++) lambda[i][k]=gzero;
+  }
   k = 2;
   while (k < n)
   {
-    reduce2(A,B,k,k-1,row,lambda,D);
+    reduce2(A,B,k,k-1,n,row,lambda,D);
     if (row[0])
       do_swap = (!row[1] || row[0] <= row[1]);
     else if (!row[1])
@@ -2433,7 +2437,7 @@ hnflll_i(GEN A, GEN *ptB, int remove)
     {
       for (i=k-2; i; i--)
       {
-        reduce2(A,B,k,i,row,lambda,D);
+        reduce2(A,B,k,i,n,row,lambda,D);
         if (low_stack(lim, stack_lim(av,3)))
         {
           GEN b = (GEN)(D-1);
@@ -2453,7 +2457,7 @@ hnflll_i(GEN A, GEN *ptB, int remove)
     }
   }
   /* handle trivial case: return negative diag coeff otherwise */
-  if (n == 2) (void)findi_normalize((GEN)A[1], B,1,lambda);
+  if (n == 2) (void)findi_normalize((GEN)A[1], B,1,n,lambda);
   A = fix_rows(A);
   if (remove)
   {
diff -pru pari-word-new2/src/basemath/arith2.c pari-word-new1/src/basemath/arith2.c
--- pari-word-new2/src/basemath/arith2.c	Sun Nov 10 01:03:48 2002
+++ pari-word-new1/src/basemath/arith2.c	Sun Nov 10 00:26:26 2002
@@ -1032,7 +1032,7 @@ divisors(GEN n)
 {
   pari_sp tetpil,av=avma;
   PARI_word i,j,l;
-  GEN *d,*t,*t1,*t2,*t3, nbdiv,e;
+  GEN d, t, t1, t2, t3, nbdiv,e;
   
   if (typ(n) != t_MAT || lg(n) != 3) n = auxdecomp(n,1);
 
@@ -1046,13 +1046,13 @@ divisors(GEN n)
   }
   if (is_bigint(nbdiv) || (itos(nbdiv) & ~LGBITS))
     err(talker, "too many divisors (more than %"IWdf")", LGBITS - 1);
-  d = t = (GEN*) cgetg(itos(nbdiv)+1,t_VEC);
+  d = t = cgetg(itos(nbdiv)+1,t_VEC);
   *++d = gun;
   for (i=1; i<l; i++)
     for (t1=t,j=e[i]; j; j--,t1=t2)
       for (t2=d,t3=t1; t3<t2; )
-	*++d = mulii(*++t3, (GEN)n[i]);
-  tetpil=avma; return gerepile(av,tetpil,sort((GEN)t));
+	*++d = (PARI_word)mulii((GEN)*++t3, (GEN)n[i]);
+  tetpil=avma; return gerepile(av,tetpil,sort(t));
 }
 
 static GEN
diff -pru pari-word-new2/src/basemath/bibli1.c pari-word-new1/src/basemath/bibli1.c
--- pari-word-new2/src/basemath/bibli1.c	Sun Nov 10 01:03:48 2002
+++ pari-word-new1/src/basemath/bibli1.c	Sun Nov 10 00:26:26 2002
@@ -340,19 +340,19 @@ lll_finish(GEN h,GEN fl,PARI_word flag)
 static void
 Zupdate_col(PARI_word k, PARI_word l, GEN q, PARI_word K, GEN h)
 {
-  GEN *hl, *hk;
+  GEN hl, hk;
   PARI_word i;
 
   if (!h) return;
-  hl = (GEN*)h[l]; hk = (GEN*)h[k];
+  hl = VEC_elt(h,l); hk = VEC_elt(h,k);
   if (is_pm1(q))
   {
     if (signe(q) > 0)
-      for (i=1;i<=K;i++) { if (signe(hl[i])) hk[i] = addii(hk[i],hl[i]); }
+      for (i=1;i<=K;i++) { if (signe(hl[i])) hk[i] = laddii(VEC_elt(hk,i),VEC_elt(hl,i)); }
     else
-      for (i=1;i<=K;i++) { if (signe(hl[i])) hk[i] = subii(hk[i],hl[i]); }
+      for (i=1;i<=K;i++) { if (signe(hl[i])) hk[i] = lsubii(VEC_elt(hk,i),VEC_elt(hl,i)); }
   } else
-      for (i=1;i<=K;i++) if (signe(hl[i])) hk[i] = addii(hk[i],mulii(q,hl[i]));
+      for (i=1;i<=K;i++) if (signe(hl[i])) hk[i] = laddii(VEC_elt(hk,i),mulii(q,VEC_elt(hl,i)));
 }
 
 /* L[k,] += q * L[l,], l < k */
diff -pru pari-word-new2/src/basemath/bibli2.c pari-word-new1/src/basemath/bibli2.c
--- pari-word-new2/src/basemath/bibli2.c	Sun Nov 10 01:03:48 2002
+++ pari-word-new1/src/basemath/bibli2.c	Sun Nov 10 00:26:26 2002
@@ -79,7 +79,7 @@ grando0(GEN x, PARI_word n, PARI_word do
 /**                                                               **/
 /*******************************************************************/
 #ifdef LONG_IS_64BIT
-# define SQRTVERYBIGINT 3037000500   /* ceil(sqrt(VERYBIGINT)) */
+# define SQRTVERYBIGINT as_UWORD(3037000500)   /* ceil(sqrt(VERYBIGINT)) */
 #else
 # define SQRTVERYBIGINT 46341
 #endif
@@ -533,13 +533,13 @@ GEN
 vecbinome(PARI_word n)
 {
   PARI_word d = (n + 1)/2, k;
-  GEN bin = cgetg(n+2, t_VEC), *C;
-  C = (GEN*)(bin + 1); /* C[k] = binomial(n, k) */
-  C[0] = gun;
+  GEN bin = cgetg(n+2, t_VEC), C;
+  C = bin + 1; /* C[k] = binomial(n, k) */
+  C[0] = un;
   for (k=1; k <= d; k++)
   {
     pari_sp av = avma;
-    C[k] = gerepileuptoint(av, diviiexact(mulsi(n-k+1, C[k-1]), stoi(k)));
+    VEC_elt_set(C, k, gerepileuptoint(av, diviiexact(mulsi(n-k+1, VEC_elt(C,k-1)), stoi(k))));
   }
   for (   ; k <= n; k++) C[k] = C[n - k];
   return bin;
diff -pru pari-word-new2/src/basemath/gen2.c pari-word-new1/src/basemath/gen2.c
--- pari-word-new2/src/basemath/gen2.c	Sun Nov 10 01:03:50 2002
+++ pari-word-new1/src/basemath/gen2.c	Sun Nov 10 00:26:26 2002
@@ -424,6 +424,12 @@ lexcmp_vec_mat(GEN x, GEN y)
   return lexcmp_scal_vec(x,y);
 }
 
+PARI_word
+lexcmp_l(GEN x, GEN y)
+{
+  return lexcmp(x, y);
+}
+
 /* as gcmp for vector/matrices, using lexicographic ordering on components */
 int
 lexcmp(GEN x, GEN y)
diff -pru pari-word-new2/src/basemath/polarit1.c pari-word-new1/src/basemath/polarit1.c
--- pari-word-new2/src/basemath/polarit1.c	Sun Nov 10 01:03:50 2002
+++ pari-word-new1/src/basemath/polarit1.c	Sun Nov 10 00:40:26 2002
@@ -694,62 +694,62 @@ try_pow(GEN w0, GEN pol, GEN p, GEN q, P
  *  t[0],t[1]...t[k-1] the k factors, normalized
  */
 static void
-split(PARI_word m, GEN *t, PARI_word d, GEN p, GEN q, PARI_word r, GEN S)
+split(PARI_word m, GEN t, PARI_word d, GEN p, GEN q, PARI_word r, GEN S)
 {
   PARI_word ps, l, v, dv;
   pari_sp av0, av;
   GEN w,w0;
 
-  dv=degpol(*t); if (dv==d) return;
+  dv=degpol((PARI_word2GEN)*t); if (dv==d) return;
   v=varn(*t); av0=avma; ps = p[2];
   for(av=avma;;avma=av)
   {
     if (ps==2)
     {
-      w0 = w = FpXQ_pow(polx[v], stoi(m-1), *t, gdeux); m += 2;
+      w0 = w = FpXQ_pow(polx[v], stoi(m-1), (PARI_word2GEN)*t, gdeux); m += 2;
       for (l=1; l<d; l++)
         w = gadd(w0, spec_FpXQ_pow(w, p, S));
     }
     else
     {
-      w = FpX_res(stopoly(m,ps,v),*t, p);
-      m++; w = try_pow(w,*t,p,q,r);
+      w = FpX_res(stopoly(m,ps,v),(PARI_word2GEN)*t, p);
+      m++; w = try_pow(w,(PARI_word2GEN)*t,p,q,r);
       if (!w) continue;
       w = ZX_s_add(w, -1);
     }
-    w = FpX_gcd(*t,w, p);
+    w = FpX_gcd((PARI_word2GEN)*t,w, p);
     l = degpol(w); if (l && l!=dv) break;
   }
   w = FpX_normalize(w, p);
   w = gerepileupto(av0, w);
-  l /= d; t[l]=FpX_div(*t,w,p); *t=w;
+  l /= d; t[l]=(GEN2PARI_word)FpX_div((PARI_word2GEN)*t,w,p); *t=(GEN2PARI_word)w;
   split(m,t+l,d,p,q,r,S);
   split(m,t,  d,p,q,r,S);
 }
 
 static void
-splitgen(GEN m, GEN *t, PARI_word d, GEN  p, GEN q, PARI_word r)
+splitgen(GEN m, GEN t, PARI_word d, GEN  p, GEN q, PARI_word r)
 {
   PARI_word l, v, dv;
   pari_sp av;
   GEN w;
 
-  dv=degpol(*t); if (dv==d) return;
-  v=varn(*t); m=setloop(m); m=incpos(m);
+  dv=degpol((PARI_word2GEN)*t); if (dv==d) return;
+  v=varn((PARI_word2GEN)*t); m=setloop(m); m=incpos(m);
   av=avma;
   for(;; avma=av, m=incpos(m))
   {
-    w = FpX_res(stopoly_gen(m,p,v),*t, p);
-    w = try_pow(w,*t,p,q,r);
+    w = FpX_res(stopoly_gen(m,p,v),(PARI_word2GEN)*t, p);
+    w = try_pow(w,(PARI_word2GEN)*t,p,q,r);
     if (!w) continue;
     w = ZX_s_add(w,-1);
-    w = FpX_gcd(*t,w, p); l=degpol(w);
+    w = FpX_gcd((PARI_word2GEN)*t,w, p); l=degpol(w);
     if (l && l!=dv) break;
 
   }
   w = FpX_normalize(w, p);
   w = gerepileupto(av, w);
-  l /= d; t[l]=FpX_div(*t,w,p); *t=w;
+  l /= d; t[l]=(GEN2PARI_word)FpX_div((PARI_word2GEN)*t,w,p); *t=(GEN2PARI_word)w;
   splitgen(m,t+l,d,p,q,r);
   splitgen(m,t,  d,p,q,r);
 }
@@ -809,11 +809,11 @@ factcantor0(GEN f, GEN pp, PARI_word fla
   PARI_word i, j, k, d, e, vf, p, nbfact;
   pari_sp tetpil, av = avma;
   GEN ex,y,f2,g,g1,u,v,pd,q;
-  GEN *t;
+  GEN t;
 
   if (!(d = factmod_init(&f, pp, &p))) { avma=av; return trivfact(); }
   /* to hold factors and exponents */
-  t = (GEN*)cgetg(d+1,t_VEC); ex = new_chunk(d+1);
+  t = cgetg(d+1,t_VEC); ex = new_chunk(d+1);
   vf=varn(f); e = nbfact = 1;
   for(;;)
   {
@@ -852,13 +852,13 @@ factcantor0(GEN f, GEN pp, PARI_word fla
         if (flag)
         {
           if (flag > 1) return NULL;
-          for ( ; nbfact<j; nbfact++) { t[nbfact]=(GEN)d; ex[nbfact]=e*k; }
+          for ( ; nbfact<j; nbfact++) { t[nbfact]=d; ex[nbfact]=e*k; }
         }
         else
         {
           PARI_word r;
           g = FpX_normalize(g, pp);
-          t[nbfact]=g; q = subis(pd,1); /* also ok for p=2: unused */
+          VEC_elt_set(t, nbfact, g); q = subis(pd,1); /* also ok for p=2: unused */
           r = vali(q); q = shifti(q,-r);
          /* le premier parametre est un entier variable m qui sera
           * converti en un polynome w dont les coeff sont ses digits en
@@ -877,7 +877,8 @@ factcantor0(GEN f, GEN pp, PARI_word fla
       }
       if (du)
       {
-        t[nbfact] = flag? (GEN)du: FpX_normalize(u, pp);
+        /* XXXX VEC_elt_set() ??? A horrible mix... */
+ 	t[nbfact] = flag? du: (GEN2PARI_word)FpX_normalize(u, pp);
         ex[nbfact++]=e*k;
       }
     }
@@ -898,13 +899,14 @@ factcantor0(GEN f, GEN pp, PARI_word fla
   if (flag)
     for (j=1; j<nbfact; j++)
     {
-      u[j] = lstoi((PARI_word)t[j]);
+      /* XXXX VEC_elt_set() ??? A horrible mix... */
+      u[j] = lstoi(t[j]);
       v[j] = lstoi(ex[j]);
     }
   else
     for (j=1; j<nbfact; j++)
     {
-      u[j] = (PARI_word)FpX(t[j], pp);
+      VEC_elt_set(u,j, FpX(VEC_elt(t,j), pp));
       v[j] = lstoi(ex[j]);
     }
   return gerepile(av,tetpil,y);
@@ -1175,11 +1177,12 @@ FqX_rand(PARI_word d1, PARI_word v, GEN 
 }
 
 #define set_irred(i) { if ((i)>ir) swap(t[i],t[ir]); ir++;}
+#define lset_irred(i) { if ((i)>ir) lswap(t[i],t[ir]); ir++;}
 
 PARI_word
-FpX_split_berlekamp(GEN *t, GEN p)
+FpX_split_berlekamp(GEN t, GEN p)
 {
-  GEN u = *t, a,b,po2,vker,pol;
+  GEN u = (PARI_word2GEN)*t, a,b,po2,vker,pol;
   PARI_word N = degpol(u), d, i, ir, L, la, lb, ps, vu = varn(u);
   pari_sp av0 = avma;
 
@@ -1218,17 +1221,17 @@ FpX_split_berlekamp(GEN *t, GEN p)
     }
     for (i=ir; i<L && L<d; i++)
     {
-      a = t[i]; la = degpol(a);
-      if (la == 1) { set_irred(i); }
+      a = (PARI_word2GEN)t[i]; la = degpol(a);
+      if (la == 1) { lset_irred(i); }
       else if (la == 2)
       {
         GEN r = quadsolvemod(a,p,1);
         if (r)
         {
-          t[i] = deg1pol_i(gun, subii(p,r), vu); r = otherroot(a,r,p);
-          t[L] = deg1pol_i(gun, subii(p,r), vu); L++;
+          t[i] = (GEN2PARI_word)deg1pol_i(gun, subii(p,r), vu); r = otherroot(a,r,p);
+          t[L] = (GEN2PARI_word)deg1pol_i(gun, subii(p,r), vu); L++;
         }
-        set_irred(i);
+        lset_irred(i);
       }
       else
       {
@@ -1240,8 +1243,8 @@ FpX_split_berlekamp(GEN *t, GEN p)
         if (lb && lb < la)
         {
           b = FpX_normalize(b, p);
-          t[L] = FpX_div(a,b,p);
-          t[i]= b; L++;
+          t[L] = (GEN2PARI_word)FpX_div(a,b,p);
+          t[i] = (GEN2PARI_word)b; L++;
         }
         else avma = av;
       }
@@ -1325,11 +1328,11 @@ factmod0(GEN f, GEN pp)
 {
   PARI_word i, j, k, e, p, N, nbfact, d;
   pari_sp av = avma, tetpil;
-  GEN pps2,ex,y,f2,p1,g1,u, *t;
+  GEN pps2,ex,y,f2,p1,g1,u, t;
 
   if (!(d = factmod_init(&f, pp, &p))) { avma=av; return trivfact(); }
   /* to hold factors and exponents */
-  t = (GEN*)cgetg(d+1,t_VEC); ex = cgetg(d+1,t_VECSMALL);
+  t = cgetg(d+1,t_VEC); ex = cgetg(d+1,t_VECSMALL);
   e = nbfact = 1;
   pps2 = shifti(pp,-1);
 
@@ -1351,7 +1354,7 @@ factmod0(GEN f, GEN pp)
       N = degpol(u);
       if (N)
       {
-        t[nbfact] = FpX_normalize(u,pp);
+        VEC_elt_set(t, nbfact, FpX_normalize(u,pp));
         d = (N==1)? 1: FpX_split_berlekamp(t+nbfact, pp);
         for (j=0; j<d; j++) ex[nbfact+j] = e*k;
         nbfact += d;
@@ -1364,13 +1367,14 @@ factmod0(GEN f, GEN pp)
     for (i=2; i<j; i++) f[i] = f2[p*(i-2)+2];
   }
   tetpil=avma; y=cgetg(3,t_VEC);
-  setlg((GEN)t, nbfact);
+  setlg(t, nbfact);
   setlg(ex, nbfact);
-  y[1]=lcopy((GEN)t);
+  y[1]=lcopy(t);
   y[2]=lcopy(ex);
   (void)sort_factor(y,cmpii);
   return gerepile(av,tetpil,y);
 }
+
 GEN
 factmod(GEN f, GEN pp)
 {
diff -pru pari-word-new2/src/basemath/polarit2.c pari-word-new1/src/basemath/polarit2.c
--- pari-word-new2/src/basemath/polarit2.c	Sun Nov 10 01:03:50 2002
+++ pari-word-new1/src/basemath/polarit2.c	Sun Nov 10 00:26:26 2002
@@ -625,7 +625,7 @@ Mignotte_bound(GEN S)
   p1 = N2; if (gcmp(C, p1) < 0) C = p1;
   for (i = 1; i < d; i++)
   {
-    p1 = gadd(gmul((GEN)bin[i], N2), (GEN)binlS[i+1]);
+    p1 = gadd(gmul(VEC_elt(bin,i), N2), VEC_elt(binlS, i+1));
     if (gcmp(C, p1) < 0) C = p1;
   }
   return C;
diff -pru pari-word-new2/src/basemath/trans1.c pari-word-new1/src/basemath/trans1.c
--- pari-word-new2/src/basemath/trans1.c	Sun Nov 10 01:03:50 2002
+++ pari-word-new1/src/basemath/trans1.c	Sun Nov 10 00:26:26 2002
@@ -22,7 +22,7 @@ Foundation, Inc., 59 Temple Place - Suit
 
 #ifdef LONG_IS_64BIT
 # define C31 (9223372036854775808.0) /* VERYBIGINT * 1.0 */
-# define SQRTVERYBIGINT 3037000500   /* ceil(sqrt(VERYBIGINT)) */
+# define SQRTVERYBIGINT as_UWORD(3037000500) /* ceil(sqrt(VERYBIGINT)) */
 # define CBRTVERYBIGINT 2097152      /* ceil(cbrt(VERYBIGINT)) */
 #else
 # define C31 (2147483648.0)
diff -pru pari-word-new2/src/headers/paricast.h pari-word-new1/src/headers/paricast.h
--- pari-word-new2/src/headers/paricast.h	Sun Nov 10 01:03:28 2002
+++ pari-word-new1/src/headers/paricast.h	Sun Nov 10 00:26:26 2002
@@ -17,229 +17,244 @@ Foundation, Inc., 59 Temple Place - Suit
 #  undef lround
 #endif
 
-#define mael(ma,x1,x2) ( ((GEN) ((GEN)(ma))[x1]) [x2])
-#define mael2 mael
-#define mael3(ma,x1,x2,x3) ( ((GEN) mael2((ma),(x1),(x2))) [x3])
-#define mael4(ma,x1,x2,x3,x4) ( ((GEN) mael3((ma),(x1),(x2),(x3))) [x4])
-#define mael5(ma,x1,x2,x3,x4,x5) (\
-  ((GEN) mael4((ma),(x1),(x2),(x3),(x4))) [x5] \
-)
-#define gmael (GEN) mael
-#define gmael2 (GEN) mael
-#define gmael3 (GEN) mael3
-#define gmael4 (GEN) mael4
-#define gmael5 (GEN) mael5
-
-#define coeff(a,i,j)  ( ( (GEN) ( (GEN) (a))[j]) [i])
-#define gcoeff(a,i,j) ((GEN)coeff((a),(i),(j)))
-
-#define labsi   (PARI_word)absi
-#define labsr   (PARI_word)absr
-#define lach    (PARI_word)gach
-#define lacos   (PARI_word)gacos
-#define ladd    (PARI_word)gadd
-#define laddii  (PARI_word)addii
-#define laddir  (PARI_word)addir
-#define laddis  (PARI_word)addis
-#define laddmat (PARI_word)gaddmat
-#define laddrr  (PARI_word)addrr
-#define laddrs  (PARI_word)addrs
-#define laddsi  (PARI_word)addsi
-#define laddsmat (PARI_word)gaddsmat
-#define laddsr  (PARI_word)addsr
-#define ladj    (PARI_word)adj
-#define larg    (PARI_word)garg
-#define lash    (PARI_word)gash
-#define lasin   (PARI_word)gasin
-#define lassmat (PARI_word)assmat
-#define latan   (PARI_word)gatan
-#define lath    (PARI_word)gath
-#define lbezout (PARI_word)bezout
-#define lbinome (PARI_word)binome
-#define lcaract (PARI_word)caract
-#define lcaradj (PARI_word)caradj
-#define lceil   (PARI_word)gceil
-#define lch     (PARI_word)gch
-#define lchangevar (PARI_word)changevar
-#define lclone  (PARI_word)gclone
-#define lco8    (PARI_word)co8
-#define lconcat (PARI_word)concat
-#define lconj   (PARI_word)gconj
-#define lcontent (PARI_word)content
-#define lcopy   (PARI_word)gcopy
-#define lcos    (PARI_word)gcos
-#define lcvtoi  (PARI_word)gcvtoi
-#define lderiv  (PARI_word)deriv
-#define ldet    (PARI_word)det
-#define ldet2   (PARI_word)det2
-#define ldeuc   (PARI_word)gdeuc
-#define ldiscsr (PARI_word)discsr
+/* These four assume that v is of type GEN; n n1 n2 are 1-based indices */
+#define VEC_elt(v,n)		((PARI_word2GEN) ((v)[n]))
+#define MAT_elt(v,n1,n2)	VEC_elt( VEC_elt((v),(n1)), (n2) )
+#define VEC_elt_set(v,n,g)	((v)[n] = (GEN2PARI_word)(g))
+#define MAT_elt_set(v,n1,n2,g)	VEC_elt_set( VEC_elt((v),(n1)), (n2), (g) )
+
+/* These two assume that v may be of a type PARI_word too */
+#define VEC_elt_conv(v,n)	VEC_elt((PARI_word2GEN)(v), (n))
+#define MAT_elt_conv(v,n1,n2)	MAT_elt((PARI_word2GEN)(v), (n1), (n2))
+
+/* Deep accessors with analogues which return PARI_word */
+#define gmael			MAT_elt_conv
+#define mael(ma,x1,x2)		(VEC_elt_conv(ma,x1)[x2])
+
+/* More synonims... */
+#define mael2			mael
+#define gmael2			MAT_elt_conv
+
+#define coeff(v,n1,n2)		mael((v),(n2),(n1))
+#define gcoeff(v,n1,n2)		MAT_elt_conv((v),(n2),(n1))
+
+#define mael3(ma,x1,x2,x3)	(MAT_elt_conv((ma),(x1),(x2))[x3])
+#define gmael3(ma,x1,x2,x3)	VEC_elt( MAT_elt_conv((ma),(x1),(x2)), (x3) )
+
+
+#define mael4(ma,x1,x2,x3,x4)	gmael3((ma),(x1),(x2),(x3))[x4]
+#define gmael4(ma,x1,x2,x3,x4)	VEC_elt( gmael3((ma),(x1),(x2),(x3)), x4)
+
+#define mael5(ma,x1,x2,x3,x4,x5) gmael4((ma),(x1),(x2),(x3),(x4))[x5]
+#define gmael5(m,x1,x2,x3,x4,x5) VEC_elt( gmael4((m),(x1),(x2),(x3),(x4)), x5)
+
+#define labsi   (GEN2PARI_word)absi
+#define labsr   (GEN2PARI_word)absr
+#define lach    (GEN2PARI_word)gach
+#define lacos   (GEN2PARI_word)gacos
+#define ladd    (GEN2PARI_word)gadd
+#define laddii  (GEN2PARI_word)addii
+#define laddir  (GEN2PARI_word)addir
+#define laddis  (GEN2PARI_word)addis
+#define laddmat (GEN2PARI_word)gaddmat
+#define laddrr  (GEN2PARI_word)addrr
+#define laddrs  (GEN2PARI_word)addrs
+#define laddsi  (GEN2PARI_word)addsi
+#define laddsmat (GEN2PARI_word)gaddsmat
+#define laddsr  (GEN2PARI_word)addsr
+#define ladj    (GEN2PARI_word)adj
+#define larg    (GEN2PARI_word)garg
+#define lash    (GEN2PARI_word)gash
+#define lasin   (GEN2PARI_word)gasin
+#define lassmat (GEN2PARI_word)assmat
+#define latan   (GEN2PARI_word)gatan
+#define lath    (GEN2PARI_word)gath
+#define lbezout (GEN2PARI_word)bezout
+#define lbinome (GEN2PARI_word)binome
+#define lcaract (GEN2PARI_word)caract
+#define lcaradj (GEN2PARI_word)caradj
+#define lceil   (GEN2PARI_word)gceil
+#define lch     (GEN2PARI_word)gch
+#define lchangevar (GEN2PARI_word)changevar
+#define lclone  (GEN2PARI_word)gclone
+#define lco8    (GEN2PARI_word)co8
+#define lconcat (GEN2PARI_word)concat
+#define lconj   (GEN2PARI_word)gconj
+#define lcontent (GEN2PARI_word)content
+#define lcopy   (GEN2PARI_word)gcopy
+#define lcos    (GEN2PARI_word)gcos
+#define lcvtoi  (GEN2PARI_word)gcvtoi
+#define lderiv  (GEN2PARI_word)deriv
+#define ldet    (GEN2PARI_word)det
+#define ldet2   (GEN2PARI_word)det2
+#define ldeuc   (GEN2PARI_word)gdeuc
+#define ldiscsr (GEN2PARI_word)discsr
 /* ldiv is a predefined macro on some AIX versions --GN1997Jan27 */
 #ifdef ldiv
 #undef ldiv
 #endif
-#define ldiv    (PARI_word)gdiv
+#define ldiv    (GEN2PARI_word)gdiv
+
+#define ldivgs  (GEN2PARI_word)gdivgs
+#define ldivii  (GEN2PARI_word)divii
+#define ldivir  (GEN2PARI_word)divir
+#define ldivis  (GEN2PARI_word)divis
+#define ldivmod (GEN2PARI_word)gdivmod
+#define ldivres (GEN2PARI_word)poldivres
+#define ldivri  (GEN2PARI_word)divri
+#define ldivrr  (GEN2PARI_word)divrr
+#define ldivrs  (GEN2PARI_word)divrs
+#define ldivsi  (GEN2PARI_word)divsi
+#define ldivsr  (GEN2PARI_word)divsr
+#define ldvmdii (GEN2PARI_word)dvmdii
+#define ldvmdis (GEN2PARI_word)dvmdis
+#define ldvmdsi (GEN2PARI_word)dvmdsi
+#define lexp    (GEN2PARI_word)gexp
+#define lfibo   (GEN2PARI_word)fibo
+#define lfloor  (GEN2PARI_word)gfloor
+#define lfrac   (GEN2PARI_word)gfrac
+#define lgamd   (GEN2PARI_word)ggamd
+#define lgamma  (GEN2PARI_word)ggamma
+#define lgauss  (GEN2PARI_word)gauss
+#define lgcd    (GEN2PARI_word)ggcd
+#define lgetg   (GEN2PARI_word)cgetg
+#define lgeti   (GEN2PARI_word)cgeti
+#define lgetp   (GEN2PARI_word)cgetp
+#define lgetr   (GEN2PARI_word)cgetr
+#define lgreffe (GEN2PARI_word)greffe
+#define lhilb   (GEN2PARI_word)hilb
+#define licopy  (GEN2PARI_word)icopy
+#define limag   (GEN2PARI_word)gimag
+#define linteg  (GEN2PARI_word)integ
+#define linv    (GEN2PARI_word)ginv
+#define linvmat (GEN2PARI_word)invmat
+#define linvmod (GEN2PARI_word)ginvmod
+#define linvmulmat (GEN2PARI_word)invmulmat
+#define llegendre (GEN2PARI_word)legendre
+#define llift   (GEN2PARI_word)lift
+#define llngamma  (GEN2PARI_word)glngamma
+#define llog    (GEN2PARI_word)glog
+#define lmax    (GEN2PARI_word)gmax
+#define lmin    (GEN2PARI_word)gmin
+#define lmod    (GEN2PARI_word)gmod
+#define lmodii  (GEN2PARI_word)modii
+#define lmodsi  (GEN2PARI_word)modsi
+#define lmodulcp  (GEN2PARI_word)gmodulcp
+#define lmodulo  (GEN2PARI_word)gmodulo
+#define lmpabs  (GEN2PARI_word)mpabs
+#define lmpach  (GEN2PARI_word)mpach
+#define lmpacos (GEN2PARI_word)mpacos
+#define lmpadd  (GEN2PARI_word)mpadd
+#define lmpash  (GEN2PARI_word)mpash
+#define lmpasin (GEN2PARI_word)mpasin
+#define lmpatan (GEN2PARI_word)mpatan
+#define lmpath  (GEN2PARI_word)mpath
+#define lmpaut  (GEN2PARI_word)mpaut
+#define lmpch   (GEN2PARI_word)mpch
+#define lmpcos  (GEN2PARI_word)mpcos
+#define lmpdiv  (GEN2PARI_word)mpdiv
+#define lmpent  (GEN2PARI_word)mpent
+#define lmpeuler (GEN2PARI_word)mpeuler
+#define lmpexp  (GEN2PARI_word)mpexp
+#define lmpexp1 (GEN2PARI_word)mpexp1
+#define lmpfact (GEN2PARI_word)mpfact
+#define lmpgamd (GEN2PARI_word)mpgamd
+#define lmpgamma (GEN2PARI_word)mpgamma
+#define lmpinvmod (GEN2PARI_word)mpinvmod
+#define lmplngamma (GEN2PARI_word)mplngamma
+#define lmplog  (GEN2PARI_word)mplog
+#define lmpmul  (GEN2PARI_word)mpmul
+#define lmpneg  (GEN2PARI_word)mpneg
+#define lmppgcd (GEN2PARI_word)mppgcd
+#define lmppi   (GEN2PARI_word)mppi
+#define lmppsi  (GEN2PARI_word)mppsi
+#define lmpsc1  (GEN2PARI_word)mpsc1
+#define lmpsh   (GEN2PARI_word)mpsh
+#define lmpshift (GEN2PARI_word)mpshift
+#define lmpsin  (GEN2PARI_word)mpsin
+#define lmpsqrt (GEN2PARI_word)mpsqrt
+#define lmpsub  (GEN2PARI_word)mpsub
+#define lmptan  (GEN2PARI_word)mptan
+#define lmpth   (GEN2PARI_word)mpth
+#define lmptrunc (GEN2PARI_word)mptrunc
+#define lmul    (GEN2PARI_word)gmul
+#define lmul2n  (GEN2PARI_word)gmul2n
+#define lmulii  (GEN2PARI_word)mulii
+#define lmulir  (GEN2PARI_word)mulir
+#define lmulis  (GEN2PARI_word)mulis
+#define lmulri  (GEN2PARI_word)mulri
+#define lmulrr  (GEN2PARI_word)mulrr
+#define lmulrs  (GEN2PARI_word)mulrs
+#define lmulsg  (GEN2PARI_word)gmulsg
+#define lmulsi  (GEN2PARI_word)mulsi
+#define lmulsr  (GEN2PARI_word)mulsr
+#define lmulss  (GEN2PARI_word)mulss
+#define lneg    (GEN2PARI_word)gneg
+#define lnegi   (GEN2PARI_word)negi
+#define lnegr   (GEN2PARI_word)negr
+#define lnorm   (GEN2PARI_word)gnorm
+#define lnorml2 (GEN2PARI_word)gnorml2
+#define lopgs2  (GEN2PARI_word)gopgs2
+#define lopsg2  (GEN2PARI_word)gopsg2
+#define lpasc   (GEN2PARI_word)pasc
+#define lpile   (GEN2PARI_word)gerepile
+#define lpilecopy (GEN2PARI_word)gerepilecopy
+#define lpileupto (GEN2PARI_word)gerepileupto
+#define lpileuptoint (GEN2PARI_word)gerepileuptoint
+#define lpoleval (GEN2PARI_word)poleval
+#define lpolgcd (GEN2PARI_word)polgcd
+#define lpowgs  (GEN2PARI_word)gpowgs
+#define lprec   (GEN2PARI_word)gprec
+#define lprimpart (GEN2PARI_word)primpart
+#define lpsi    (GEN2PARI_word)gpsi
+#define lpui    (GEN2PARI_word)gpui
+#define lpuigs  (GEN2PARI_word)gpuigs
+#define lpuissmodulo (GEN2PARI_word)puissmodulo
+#define lquadgen (GEN2PARI_word)quadgen
+#define lquadpoly (GEN2PARI_word)quadpoly
+#define lracine (GEN2PARI_word)racine
+#define lrcopy  (GEN2PARI_word)rcopy
+#define lreal   (GEN2PARI_word)greal
+#define lrecip  (GEN2PARI_word)recip
+#define lred    (GEN2PARI_word)gred
+#define lres    (GEN2PARI_word)gres
+#define lresii  (GEN2PARI_word)resii
+#define lrndtoi (GEN2PARI_word)grndtoi
+#define lroots  (GEN2PARI_word)roots
+#define lround  (GEN2PARI_word)ground
+#define lscalmat (GEN2PARI_word)gscalmat
+#define lscalsmat (GEN2PARI_word)gscalsmat
+#define lsh     (GEN2PARI_word)gsh
+#define lshift  (GEN2PARI_word)gshift
+#define lshifti (GEN2PARI_word)shifti
+#define lshiftr (GEN2PARI_word)shiftr
+#define lsin    (GEN2PARI_word)gsin
+#define lsqr    (GEN2PARI_word)gsqr
+#define lsqri   (GEN2PARI_word)sqri
+#define lsqrt   (GEN2PARI_word)gsqrt
+#define lstoi   (GEN2PARI_word)stoi
+#define lsub    (GEN2PARI_word)gsub
+#define lsubii  (GEN2PARI_word)subii
+#define lsubir  (GEN2PARI_word)subir
+#define lsubis  (GEN2PARI_word)subis
+#define lsubres (GEN2PARI_word)subres
+#define lsubri  (GEN2PARI_word)subri
+#define lsubrr  (GEN2PARI_word)subrr
+#define lsubrs  (GEN2PARI_word)subrs
+#define lsubsi  (GEN2PARI_word)subsi
+#define lsubsr  (GEN2PARI_word)subsr
+#define lsubst  (GEN2PARI_word)gsubst
+#define ltan    (GEN2PARI_word)gtan
+#define ltchebi (GEN2PARI_word)tchebi
+#define lth     (GEN2PARI_word)gth
+#define ltrace  (GEN2PARI_word)gtrace
+#define ltrans  (GEN2PARI_word)gtrans
+#define ltrunc  (GEN2PARI_word)gtrunc
 
-#define ldivgs  (PARI_word)gdivgs
-#define ldivii  (PARI_word)divii
-#define ldivir  (PARI_word)divir
-#define ldivis  (PARI_word)divis
-#define ldivmod (PARI_word)gdivmod
-#define ldivres (PARI_word)poldivres
-#define ldivri  (PARI_word)divri
-#define ldivrr  (PARI_word)divrr
-#define ldivrs  (PARI_word)divrs
-#define ldivsi  (PARI_word)divsi
-#define ldivsr  (PARI_word)divsr
-#define ldvmdii (PARI_word)dvmdii
-#define ldvmdis (PARI_word)dvmdis
-#define ldvmdsi (PARI_word)dvmdsi
-#define lexp    (PARI_word)gexp
-#define lfibo   (PARI_word)fibo
-#define lfloor  (PARI_word)gfloor
-#define lfrac   (PARI_word)gfrac
-#define lgamd   (PARI_word)ggamd
-#define lgamma  (PARI_word)ggamma
-#define lgauss  (PARI_word)gauss
-#define lgcd    (PARI_word)ggcd
-#define lgetg   (PARI_word)cgetg
-#define lgeti   (PARI_word)cgeti
-#define lgetp   (PARI_word)cgetp
-#define lgetr   (PARI_word)cgetr
-#define lgreffe (PARI_word)greffe
-#define lhilb   (PARI_word)hilb
-#define licopy  (PARI_word)icopy
-#define limag   (PARI_word)gimag
-#define linteg  (PARI_word)integ
-#define linv    (PARI_word)ginv
-#define linvmat (PARI_word)invmat
-#define linvmod (PARI_word)ginvmod
-#define linvmulmat (PARI_word)invmulmat
-#define llegendre (PARI_word)legendre
-#define llift   (PARI_word)lift
-#define llngamma  (PARI_word)glngamma
-#define llog    (PARI_word)glog
-#define lmax    (PARI_word)gmax
-#define lmin    (PARI_word)gmin
-#define lmod    (PARI_word)gmod
-#define lmodii  (PARI_word)modii
-#define lmodsi  (PARI_word)modsi
-#define lmodulcp  (PARI_word)gmodulcp
-#define lmodulo  (PARI_word)gmodulo
-#define lmpabs  (PARI_word)mpabs
-#define lmpach  (PARI_word)mpach
-#define lmpacos (PARI_word)mpacos
-#define lmpadd  (PARI_word)mpadd
-#define lmpash  (PARI_word)mpash
-#define lmpasin (PARI_word)mpasin
-#define lmpatan (PARI_word)mpatan
-#define lmpath  (PARI_word)mpath
-#define lmpaut  (PARI_word)mpaut
-#define lmpch   (PARI_word)mpch
-#define lmpcos  (PARI_word)mpcos
-#define lmpdiv  (PARI_word)mpdiv
-#define lmpent  (PARI_word)mpent
-#define lmpeuler (PARI_word)mpeuler
-#define lmpexp  (PARI_word)mpexp
-#define lmpexp1 (PARI_word)mpexp1
-#define lmpfact (PARI_word)mpfact
-#define lmpgamd (PARI_word)mpgamd
-#define lmpgamma (PARI_word)mpgamma
-#define lmpinvmod (PARI_word)mpinvmod
-#define lmplngamma (PARI_word)mplngamma
-#define lmplog  (PARI_word)mplog
-#define lmpmul  (PARI_word)mpmul
-#define lmpneg  (PARI_word)mpneg
-#define lmppgcd (PARI_word)mppgcd
-#define lmppi   (PARI_word)mppi
-#define lmppsi  (PARI_word)mppsi
-#define lmpsc1  (PARI_word)mpsc1
-#define lmpsh   (PARI_word)mpsh
-#define lmpshift (PARI_word)mpshift
-#define lmpsin  (PARI_word)mpsin
-#define lmpsqrt (PARI_word)mpsqrt
-#define lmpsub  (PARI_word)mpsub
-#define lmptan  (PARI_word)mptan
-#define lmpth   (PARI_word)mpth
-#define lmptrunc (PARI_word)mptrunc
-#define lmul    (PARI_word)gmul
-#define lmul2n  (PARI_word)gmul2n
-#define lmulii  (PARI_word)mulii
-#define lmulir  (PARI_word)mulir
-#define lmulis  (PARI_word)mulis
-#define lmulri  (PARI_word)mulri
-#define lmulrr  (PARI_word)mulrr
-#define lmulrs  (PARI_word)mulrs
-#define lmulsg  (PARI_word)gmulsg
-#define lmulsi  (PARI_word)mulsi
-#define lmulsr  (PARI_word)mulsr
-#define lmulss  (PARI_word)mulss
-#define lneg    (PARI_word)gneg
-#define lnegi   (PARI_word)negi
-#define lnegr   (PARI_word)negr
-#define lnorm   (PARI_word)gnorm
-#define lnorml2 (PARI_word)gnorml2
-#define lopgs2  (PARI_word)gopgs2
-#define lopsg2  (PARI_word)gopsg2
-#define lpasc   (PARI_word)pasc
-#define lpile   (PARI_word)gerepile
-#define lpilecopy (PARI_word)gerepilecopy
-#define lpileupto (PARI_word)gerepileupto
-#define lpileuptoint (PARI_word)gerepileuptoint
-#define lpoleval (PARI_word)poleval
-#define lpolgcd (PARI_word)polgcd
-#define lpowgs  (PARI_word)gpowgs
-#define lprec   (PARI_word)gprec
-#define lprimpart (PARI_word)primpart
-#define lpsi    (PARI_word)gpsi
-#define lpui    (PARI_word)gpui
-#define lpuigs  (PARI_word)gpuigs
-#define lpuissmodulo (PARI_word)puissmodulo
-#define lquadgen (PARI_word)quadgen
-#define lquadpoly (PARI_word)quadpoly
-#define lracine (PARI_word)racine
-#define lrcopy  (PARI_word)rcopy
-#define lreal   (PARI_word)greal
-#define lrecip  (PARI_word)recip
-#define lred    (PARI_word)gred
-#define lres    (PARI_word)gres
-#define lresii  (PARI_word)resii
-#define lrndtoi (PARI_word)grndtoi
-#define lroots  (PARI_word)roots
-#define lround  (PARI_word)ground
-#define lscalmat (PARI_word)gscalmat
-#define lscalsmat (PARI_word)gscalsmat
-#define lsh     (PARI_word)gsh
-#define lshift  (PARI_word)gshift
-#define lshifti (PARI_word)shifti
-#define lshiftr (PARI_word)shiftr
-#define lsin    (PARI_word)gsin
-#define lsqr    (PARI_word)gsqr
-#define lsqri   (PARI_word)sqri
-#define lsqrt   (PARI_word)gsqrt
-#define lstoi   (PARI_word)stoi
-#define lsub    (PARI_word)gsub
-#define lsubii  (PARI_word)subii
-#define lsubir  (PARI_word)subir
-#define lsubis  (PARI_word)subis
-#define lsubres (PARI_word)subres
-#define lsubri  (PARI_word)subri
-#define lsubrr  (PARI_word)subrr
-#define lsubrs  (PARI_word)subrs
-#define lsubsi  (PARI_word)subsi
-#define lsubsr  (PARI_word)subsr
-#define lsubst  (PARI_word)gsubst
-#define ltan    (PARI_word)gtan
-#define ltchebi (PARI_word)tchebi
-#define lth     (PARI_word)gth
-#define ltrace  (PARI_word)gtrace
-#define ltrans  (PARI_word)gtrans
-#define ltrunc  (PARI_word)gtrunc
-
-#define zero    (PARI_word)gzero
-#define un      (PARI_word)gun
-#define deux    (PARI_word)gdeux
-#define lhalf   (PARI_word)ghalf
-#define lpolx   (PARI_word)polx
-#define lpolun  (PARI_word)polun
+#define zero    (GEN2PARI_word)gzero
+#define un      (GEN2PARI_word)gun
+#define deux    (GEN2PARI_word)gdeux
+#define lhalf   (GEN2PARI_word)ghalf
+#define lpolx   (GEN2PARI_word)polx
+#define lpolun  (GEN2PARI_word)polun
 
diff -pru pari-word-new2/src/headers/paricom.h pari-word-new1/src/headers/paricom.h
--- pari-word-new2/src/headers/paricom.h	Sun Nov 10 01:03:34 2002
+++ pari-word-new1/src/headers/paricom.h	Sun Nov 10 00:26:26 2002
@@ -30,6 +30,17 @@ Foundation, Inc., 59 Temple Place - Suit
  * [ avoid "dangling else" problem in macros ] */
 #define STMT_START	do
 #define STMT_END	while (0)
+
+#ifndef PeRl_CaTiFy
+#  define PeRl_CaTiFy(a, b)	a ## b	
+#  define PeRl_StGiFy(a)	#a
+/* the additional level of indirection enables these macros to be
+ * used as arguments to other macros.  See K&R 2nd ed., page 231. */
+#  define CAT2(a,b)	PeRl_CaTiFy(a,b)
+#  define StGiFy(a)	PeRl_StGiFy(a)
+#  define STRINGIFY(a)	PeRl_StGiFy(a)
+#endif
+
 /*=====================================================================*/
 /* CATCH(numer) {
  *   recovery 
@@ -118,12 +129,12 @@ extern int new_galois_format;
 #endif
 
 #ifdef LONG_IS_64BIT
-#  define VERYBIGINT (as_WORD(9223372036854775807)) /* 2^63-1 */
-#  define EXP220 (as_WORD(1099511627776))          /* 2^40   */
+#  define VERYBIGINT as_WORD(9223372036854775807) /* 2^63-1 */
+#  define EXP220 as_WORD(1099511627776)          /* 2^40   */
 #  define BIGINT (2147483647)              /* 2^31-1 */
 #else
-#  define VERYBIGINT (as_WORD(2147483647)) /* 2^31-1 */
-#  define EXP220 (as_WORD(1048576))       /* 2^20   */
+#  define VERYBIGINT as_WORD(2147483647) /* 2^31-1 */
+#  define EXP220 as_WORD(1048576)       /* 2^20   */
 #  define BIGINT (32767)          /* 2^15-1 */
 #endif
 
diff -pru pari-word-new2/src/headers/paridecl.h pari-word-new1/src/headers/paridecl.h
--- pari-word-new2/src/headers/paridecl.h	Sun Nov 10 01:03:28 2002
+++ pari-word-new1/src/headers/paridecl.h	Sun Nov 10 00:26:26 2002
@@ -115,7 +115,7 @@ GEN     caract2(GEN p, GEN x, int v);
 GEN     caradj(GEN x, PARI_word v, GEN *py);
 GEN     caradj0(GEN x, PARI_word v);
 GEN     carhess(GEN x, PARI_word v);
-GEN     charpoly0(GEN x, int v,PARI_word flag);
+GEN     charpoly0(GEN x, PARI_word v,PARI_word flag);
 GEN     conjvec(GEN x,PARI_word prec);
 GEN     gconj(GEN x);
 GEN     gnorm(GEN x);
@@ -884,6 +884,7 @@ int     gsigne(GEN x);
 GEN     gtolist(GEN x);
 PARI_word    gtolong(GEN x);
 int     lexcmp(GEN x, GEN y);
+PARI_word     lexcmp_l(GEN x, GEN y);
 GEN     listconcat(GEN list1, GEN list2);
 GEN     listcreate(PARI_word n);
 GEN     listinsert(GEN list, GEN object, PARI_word index);
@@ -1029,7 +1030,7 @@ void    freeall(void);
 GEN     gcopy(GEN x);
 GEN     gcopy_i(GEN x, PARI_word lx);
 GEN     gerepile(pari_sp ltop, pari_sp lbot, GEN q);
-void    gerepileall(PARI_uword av, int n, ...);
+void    gerepileall(pari_sp av, int n, ...);
 GEN     gerepilecopy(pari_sp av, GEN x);
 void    gerepilemany(pari_sp av, GEN* g[], int n);
 void    gerepilemanycoeffs(pari_sp av, GEN x, int n);
diff -pru pari-word-new2/src/headers/parigen.h pari-word-new1/src/headers/parigen.h
--- pari-word-new2/src/headers/parigen.h	Sun Nov 10 01:03:34 2002
+++ pari-word-new1/src/headers/parigen.h	Sun Nov 10 00:26:26 2002
@@ -19,7 +19,7 @@ typedef PARI_word *GEN;
 typedef int (*QSCOMP)(const void *, const void *);
 
 #ifdef ULONG_NOT_DEFINED
-  typedef PARI_uword PARI_uword;
+  typedef PARI_uword PARI_uword_t;
 #endif
 
 #ifdef __M68K__
@@ -90,8 +90,8 @@ typedef int (*QSCOMP)(const void *, cons
 #define  SIGNSHIFT (LGEFnumBITS+VARNnumBITS)
 
 #define EXPOBITS    ((as_UWORD(1)<<EXPOnumBITS)-1)
-#define SIGNBITS    (0xffffUL << SIGNSHIFT)
-#define  TYPBITS    (0xffffUL <<  TYPSHIFT)
+#define SIGNBITS    (as_UWORD(0xffff) << SIGNSHIFT)
+#define  TYPBITS    (as_UWORD(0xffff) <<  TYPSHIFT)
 #define PRECPBITS   (~VALPBITS)
 #define LGBITS      ((as_UWORD(1)<<LGnumBITS)-1)
 #define LGEFINTBITS LGBITS
@@ -113,44 +113,44 @@ typedef int (*QSCOMP)(const void *, cons
 #define _evallg(x)    (x)
 #define _evallgef(x)  (x)
 
-#define typ(x)        ((((PARI_uword)(x))&1)? (PARI_word)t_SMALL: (PARI_word)(((PARI_uword) ((GEN) (x))[0]) >> TYPSHIFT))
+#define typ(x)        ((((GEN2PARI_uword)(x))&1)? (PARI_word)t_SMALL: (PARI_word)(((PARI_uword) ((PARI_word2GEN) (x))[0]) >> TYPSHIFT))
 #define settyp(x,s)   (((GEN)(x))[0]=\
                         (((GEN)(x))[0]&(~TYPBITS)) | evaltyp(s))
-#define smalltos(x)   (((PARI_word)(x))>>1)
+#define smalltos(x)   (((PARI_uword)(x))>>1)
 
-#define isclone(x)    (((GEN) (x))[0] & CLONEBIT)
+#define isclone(x)    (((PARI_word2GEN) (x))[0] & CLONEBIT)
 #define setisclone(x) (((GEN) (x))[0] |= CLONEBIT)
 #define unsetisclone(x) (((GEN) (x))[0] &= (~CLONEBIT))
 
-#define lg(x)         ((((PARI_uword)(x))&1)?as_WORD(1): ((PARI_word) (((GEN) (x))[0] & LGBITS)))
-#define setlg(x,s)    (((GEN)(x))[0]=\
-                        (((GEN)(x))[0]&(~LGBITS)) | evallg(s))
-
-#define signe(x)      (((PARI_word) ((GEN) (x))[1]) >> SIGNSHIFT)
-#define setsigne(x,s) (((GEN)(x))[1]=\
-                        (((GEN)(x))[1]&(~SIGNBITS)) | evalsigne(s))
-
-#define lgef(x)       (((GEN) (x))[1] & LGEFBITS)
-#define setlgef(x,s)  (((GEN)(x))[1]=\
-                        (((GEN)(x))[1]&(~LGEFBITS)) | evallgef(s))
-
-#define lgefint(x)      (((GEN) (x))[1] & LGEFINTBITS)
-#define setlgefint(x,s) (((GEN)(x))[1]=\
-                          (((GEN)(x))[1]&(~LGEFINTBITS)) | evallgefint(s))
-
-#define expo(x)       ((PARI_word) ((((GEN) (x))[1] & EXPOBITS) - HIGHEXPOBIT))
-#define setexpo(x,s)  (((GEN)(x))[1]=\
-		       (((GEN)(x))[1]&(~EXPOBITS)) | evalexpo(s))
-
-#define valp(x)       ((PARI_word) ((((GEN)(x))[1] & VALPBITS) - HIGHVALPBIT))
-#define setvalp(x,s)  (((GEN)(x))[1]=\
-		       (((GEN)(x))[1]&(~VALPBITS)) | evalvalp(s))
-
-#define precp(x)      ((PARI_word) (((PARI_uword) ((GEN) (x))[1]) >> PRECPSHIFT))
-#define setprecp(x,s) (((GEN)(x))[1]=\
-		       (((GEN)(x))[1]&(~PRECPBITS)) | evalprecp(s))
-
-#define varn(x)       ((((GEN) (x))[1]&VARNBITS) >> VARNSHIFT)
-#define setvarn(x,s)  (((GEN)(x))[1]=\
-		       (((GEN)(x))[1]&(~VARNBITS)) | evalvarn(s))
+#define lg(x)         ((((GEN2PARI_uword)(x))&1)?as_WORD(1): ((PARI_word) (((PARI_word2GEN) (x))[0] & LGBITS)))
+#define setlg(x,s)    (((PARI_word2GEN)(x))[0]=\
+                        (((PARI_word2GEN)(x))[0]&(~LGBITS)) | evallg(s))
+
+#define signe(x)      (((PARI_word) ((PARI_word2GEN) (x))[1]) >> SIGNSHIFT)
+#define setsigne(x,s) (((PARI_word2GEN)(x))[1]=\
+                        (((PARI_word2GEN)(x))[1]&(~SIGNBITS)) | evalsigne(s))
+
+#define lgef(x)       (((PARI_word2GEN) (x))[1] & LGEFBITS)
+#define setlgef(x,s)  (((PARI_word2GEN)(x))[1]=\
+                        (((PARI_word2GEN)(x))[1]&(~LGEFBITS)) | evallgef(s))
+
+#define lgefint(x)      (((PARI_word2GEN) (x))[1] & LGEFINTBITS)
+#define setlgefint(x,s) (((PARI_word2GEN)(x))[1]=\
+                          (((PARI_word2GEN)(x))[1]&(~LGEFINTBITS)) | evallgefint(s))
+
+#define expo(x)       ((PARI_word) ((((PARI_word2GEN) (x))[1] & EXPOBITS) - HIGHEXPOBIT))
+#define setexpo(x,s)  (((PARI_word2GEN)(x))[1]=\
+		       (((PARI_word2GEN)(x))[1]&(~EXPOBITS)) | evalexpo(s))
+
+#define valp(x)       ((PARI_word) ((((PARI_word2GEN)(x))[1] & VALPBITS) - HIGHVALPBIT))
+#define setvalp(x,s)  (((PARI_word2GEN)(x))[1]=\
+		       (((PARI_word2GEN)(x))[1]&(~VALPBITS)) | evalvalp(s))
+
+#define precp(x)      ((PARI_word) (((PARI_uword) ((PARI_word2GEN) (x))[1]) >> PRECPSHIFT))
+#define setprecp(x,s) (((PARI_word2GEN)(x))[1]=\
+		       (((PARI_word2GEN)(x))[1]&(~PRECPBITS)) | evalprecp(s))
+
+#define varn(x)       ((((PARI_word2GEN) (x))[1]&VARNBITS) >> VARNSHIFT)
+#define setvarn(x,s)  (((PARI_word2GEN)(x))[1]=\
+		       (((PARI_word2GEN)(x))[1]&(~VARNBITS)) | evalvarn(s))
 
diff -pru pari-word-new2/src/headers/paristio.h pari-word-new1/src/headers/paristio.h
--- pari-word-new2/src/headers/paristio.h	Sun Nov 10 01:03:28 2002
+++ pari-word-new1/src/headers/paristio.h	Sun Nov 10 00:26:26 2002
@@ -20,7 +20,7 @@ typedef struct {
 } pari_timer;
 
 typedef unsigned char *byteptr;
-typedef PARI_uword pari_sp;
+typedef unsigned long pari_sp;
 
 typedef struct stackzone
 {
@@ -68,9 +68,9 @@ extern char    *errmessage[], *current_p
 #define is_universal_constant(x) ((GEN)(x) >= gzero && (GEN)(x) <= gi)
 
 #define copyifstack(x,y)  STMT_START {pari_sp _t=(pari_sp)(x); \
-  (y)=(_t>=bot &&_t<top)? lcopy((GEN)_t): (PARI_word)_t;} STMT_END
+  (y)=(_t>=bot &&_t<top)? lcopy((GEN)_t): (GEN2PARI_word)_t;} STMT_END
 #define icopyifstack(x,y) STMT_START {pari_sp _t=(pari_sp)(x); \
-  (y)=(_t>=bot &&_t<top)? licopy((GEN)_t): (PARI_word)_t;} STMT_END
+  (y)=(_t>=bot &&_t<top)? licopy((GEN)_t): (GEN2PARI_word)_t;} STMT_END
 #define isonstack(x) ((pari_sp)(x)>=bot && (pari_sp)(x)<top)
 
 /* Define this to (1) locally (in a given file, NOT here) to check
diff -pru pari-word-new2/src/headers/parisys.h pari-word-new1/src/headers/parisys.h
--- pari-word-new2/src/headers/parisys.h	Sat Jun  8 17:22:42 2002
+++ pari-word-new1/src/headers/parisys.h	Sun Nov 10 00:26:26 2002
@@ -15,6 +15,18 @@ Foundation, Inc., 59 Temple Place - Suit
 
 /* This files contains macros depending on system and compiler    */
 
+#if defined(PARIWORD_IS_LONG_LONG)
+#  include <machine/endian.h>
+/* How to convert 'L'-type function argument to 2 'G'-type arguments */
+#  if BYTE_ORDER == LITTLE_ENDIAN
+#    define WORD_TO_GENs_LOWER	0
+#    define WORD_TO_GENs_UPPER	1
+#  else
+#    define WORD_TO_GENs_LOWER	1
+#    define WORD_TO_GENs_UPPER	2
+#  endif
+#endif
+
 #ifndef LITTLE_ENDIAN_64
 #  define   LITTLE_ENDIAN_64 12345678
 #endif
diff -pru pari-word-new2/src/headers/paritype.h pari-word-new1/src/headers/paritype.h
--- pari-word-new2/src/headers/paritype.h	Tue Mar 19 04:11:48 2002
+++ pari-word-new1/src/headers/paritype.h	Sun Nov 10 00:26:26 2002
@@ -13,6 +13,64 @@ Check the License for details. You shoul
 with the package; see the file 'COPYING'. If not, write to the Free Software
 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
 
+/* IWdf:
+ *	This symbol defines the format string used for printing a WORD
+ *	as a signed decimal integer.
+ */
+/* UWuf:
+ *	This symbol defines the format string used for printing a UWORD
+ *	as an unsigned decimal integer.
+ */
+/* UWof:
+ *	This symbol defines the format string used for printing a UWORD
+ *	as an unsigned octal integer.
+ */
+/* UWxf:
+ *	This symbol defines the format string used for printing a UWORD
+ *	as an unsigned hexadecimal integer in lowercase abcdef.
+ */
+/* UWXf:
+ *	This symbol defines the format string used for printing a UWORD
+ *	as an unsigned hexadecimal integer in uppercase ABCDEF.
+ */
+
+#ifndef PARIWORD_IS_LONG_LONG
+typedef long PARI_word;
+typedef unsigned long PARI_uword;
+#define as_WORD_suf L
+#define as_UWORD_suf UL
+#define GEN2PARI_word	PARI_word
+#define GEN2PARI_uword	PARI_uword
+#define PARI_word2GEN	GEN		/* May be used with GEN and PARI_word */
+
+#define	IWdf		"ld"		/**/
+#define	UWuf		"lu"		/**/
+#define	UWof		"lo"		/**/
+#define	UWxf		"lx"		/**/
+#define	UWXf		"lX"		/**/
+
+#else
+typedef long long PARI_word;
+typedef unsigned long long PARI_uword;
+#define LONG_IS_64BIT
+#define as_WORD_suf LL
+#define as_UWORD_suf ULL
+/* These symbols may be put inside () to perform a sensible conversion */
+#define GEN2PARI_word	PARI_word)(long
+#define GEN2PARI_uword	PARI_uword)(long
+#define PARI_word2GEN	GEN)(long	/* May be used with GEN and PARI_word */
+
+#define	IWdf		"Ld"		/**/
+#define	UWuf		"Lu"		/**/
+#define	UWof		"Lo"		/**/
+#define	UWxf		"Lx"		/**/
+#define	UWXf		"LX"		/**/
+
+#endif
+
+#define as_WORD(val)		CAT2(val,as_WORD_suf)
+#define as_UWORD(val)		CAT2(val,as_UWORD_suf)
+
 /* DO NOT REORDER THESE
  * actual values can be changed, but don't forget to adapt
  *  - lontyp/lontyp2 in gen2.c
diff -pru pari-word-new2/src/language/anal.c pari-word-new1/src/language/anal.c
--- pari-word-new2/src/language/anal.c	Sun Nov 10 01:03:50 2002
+++ pari-word-new1/src/language/anal.c	Sun Nov 10 00:26:26 2002
@@ -1395,11 +1395,12 @@ readstring_i(char *s, char **ptbuf, char
   return s;
 }
 
-static GEN
+static GEN*
 any_string()
 {
   PARI_word n = 0, len = 16;
-  GEN res = new_chunk(len + 1);
+  GEN r = new_chunk(len + 1);
+  GEN* res = (GEN*)r;
 
   while (*analyseur)
   {
@@ -1408,15 +1409,17 @@ any_string()
       analyseur++;
     else
     {
-      res[n++] = (PARI_word)expr();
+      res[n++] = expr();
       if (br_status) err(breaker,"here (print)");
     }
     if (n == len)
     {
       PARI_word newlen = len << 1;
       GEN p1 = new_chunk(newlen + 1);
-      for (n = 0; n < len; n++) p1[n] = res[n];
-      res = p1; len = newlen;
+      GEN *pp = (GEN*)p1;
+
+      for (n = 0; n < len; n++) pp[n] = res[n];
+      res = pp; len = newlen;
     }
   }
   res[n] = 0; /* end the sequence with NULL */
@@ -1710,10 +1713,26 @@ num_derivU(GEN p, GEN *arg, gp_args *f)
   return gerepileupto(av, gmul(gsub(b,a), eps));
 }
 
-#define DFT_VAR (GEN)-as_WORD(1)
+#define DFT_VAR -as_WORD(1)
 #define DFT_GEN (GEN)NULL
 #define _ARGS_ argvec[0], argvec[1], argvec[2], argvec[3],\
-               argvec[4], argvec[5], argvec[6], argvec[7], argvec[8]
+               argvec[4], argvec[5], argvec[6], argvec[7], argvec[8] _ARGS_EXTRA
+
+#ifndef PARIWORD_IS_LONG_LONG
+#  define WORD_2ARGVECT_inc_ind(argvec,i,w)	((argvec)[(i)++] = (GEN)(w))
+#  define _ARGS_EXTRA
+#  define _ARGS_C	9
+#else
+#  define WORD_2ARGVECT_inc_ind(argvec,i,w)		\
+  STMT_START {						\
+    PARI_word _w = w;					\
+    ((argvec)[(i)+WORD_TO_GENs_LOWER] = (PARI_word2GEN)((_w)&LOWMASK));	\
+    ((argvec)[(i)+WORD_TO_GENs_UPPER] = (PARI_word2GEN)((_w)>>BITS_IN_HALFULONG));	\
+    i += 2;	\
+  } STMT_END
+#  define _ARGS_EXTRA	, argvec[9], argvec[10], argvec[11], argvec[12]
+#  define _ARGS_C	14		/* 4 more args for 4 PARI_words */
+#endif
 
 static GEN
 identifier(void)
@@ -1785,8 +1804,8 @@ identifier(void)
     unsigned int ret, noparen, has_pointer=0;
     PARI_word fake;
     void *call = ep->value;
-    GEN argvec[9];
-    matcomp *init[9];
+    GEN argvec[_ARGS_C];
+    matcomp *init[_ARGS_C];
     char *flags = NULL;
 
     deriv = (*analyseur == '\'' && analyseur[1] == '(') && analyseur++;
@@ -1816,7 +1835,7 @@ identifier(void)
       argvec[i++] = expr();
       if (br_status) err(breaker,"here (argument reading)");
     }
-    if (*s == 'p') { argvec[i++] = (GEN) prec; s++; }
+    if (*s == 'p') { WORD_2ARGVECT_inc_ind(argvec, i, prec); s++; }
 
     while (*s && *s != '\n')
       switch (*s++)
@@ -1827,10 +1846,10 @@ identifier(void)
           break;
 
 	case 'L': /* PARI_word */
-	  match_comma(); argvec[i++] = (GEN) readlong(); break;
+	  match_comma(); WORD_2ARGVECT_inc_ind(argvec, i, readlong()); break;
 
 	case 'n': /* var number */
-	  match_comma(); argvec[i++] = (GEN) readvar(); break;
+	  match_comma(); WORD_2ARGVECT_inc_ind(argvec, i, readvar()); break;
 
         case 'S': /* symbol */
 	  match_comma(); mark.symbol=analyseur;
@@ -1898,19 +1917,19 @@ identifier(void)
 	      if (!flags)
 		  err(talker, "not enough flags in string function signature");
 	      flags++;
-	      argvec[i] = (GEN) parse_option_string((char*)(argvec[i] + 1),
-			  flags, PARSEMNU_ARG_WHITESP | PARSEMNU_TEMPL_TERM_NL,
-			  NULL, NULL);
+	      WORD_2ARGVECT_inc_ind(argvec, i, 
+				    parse_option_string((char*)(argvec[i] + 1),
+							flags, PARSEMNU_ARG_WHITESP | PARSEMNU_TEMPL_TERM_NL,
+							NULL, NULL));
 	  } else
-	      argvec[i] = (GEN)itos(argvec[i]);
-	  i++;
+	      WORD_2ARGVECT_inc_ind(argvec, i, itos(argvec[i]));
           break;
 
 	case 's': /* expanded string; empty arg yields "" */
 	  match_comma();
 	  if (*s == '*') /* any number of string objects */
           {
-            argvec[i++] = any_string();
+            argvec[i++] = (GEN)any_string();
             s++; break;
           }
 
@@ -1924,7 +1943,7 @@ identifier(void)
           break;
 
 	case 'p': /* precision */
-	  argvec[i++] = (GEN) prec; break;
+	  WORD_2ARGVECT_inc_ind(argvec, i, prec); break;
 
 	case '=':
 	  match('='); matchcomma = 0; break;
@@ -1937,7 +1956,7 @@ identifier(void)
               case '&':
               case 'I':
               case 'V': argvec[i++]=DFT_GEN; s++; break;
-              case 'n': argvec[i++]=DFT_VAR; s++; break;
+              case 'n': WORD_2ARGVECT_inc_ind(argvec, i, DFT_VAR); s++; break;
               default:
                 oldanalyseur = analyseur;
                 analyseur = s; matchcomma = 0;
@@ -1957,7 +1976,7 @@ identifier(void)
 	  break;
 
 	 case 'P': /* series precision */
-	   argvec[i++] = (GEN) precdl; break;
+	   WORD_2ARGVECT_inc_ind(argvec, i, precdl); break;
 
 	 case 'f': /* Fake *PARI_word argument */
 	   argvec[i++] = (GEN) &fake; break;
@@ -1975,7 +1994,7 @@ identifier(void)
 	 default: err(bugparier,"identifier (unknown code)");
       }
 #if 0 /* uncomment if using purify: unitialized read otherwise */
-    for ( ; i<9; i++) argvec[i]=NULL;
+    for ( ; i<_ARGS_C; i++) argvec[i]=NULL;
 #endif
     if (deriv)
     {
diff -pru pari-word-new2/src/language/anal.h pari-word-new1/src/language/anal.h
--- pari-word-new2/src/language/anal.h	Sun Nov 10 01:03:46 2002
+++ pari-word-new1/src/language/anal.h	Sun Nov 10 00:26:26 2002
@@ -40,7 +40,7 @@ typedef struct GENbin {
   GEN x; /* binary copy of x */
   GEN base; /* base address of p->x */
 } GENbin;
-#define GENbase(p) ((GEN)p+3)
+#define GENbase(p) ((GEN)(p+1))
 
 void shiftaddress(GEN x, PARI_word dec);
 GENbin* copy_bin(GEN x);
@@ -161,7 +161,7 @@ extern void *PARI_stack_limit;
 #define EpNEW     101
 #define EpUSER    100
 
-#define NOT_CREATED_YET ((entree *)as_WORD(0x1)) /* for check_new_fun */
+#define NOT_CREATED_YET ((entree *)0x1L) /* for check_new_fun */
 #define initial_value(ep) ((ep)+1)
 
 /* blocs */
diff -pru pari-word-new2/src/language/es.c pari-word-new1/src/language/es.c
--- pari-word-new2/src/language/es.c	Sun Nov 10 01:03:50 2002
+++ pari-word-new1/src/language/es.c	Sun Nov 10 00:26:26 2002
@@ -277,7 +277,7 @@ vpariputs(char* format, va_list args)
     if (l < 0) l = bufsize<<1; else if (l < bufsize) break;
     free(buf); bufsize++;
   }
-  buf[bufsize] = 0; /* just in case */
+  buf[bufsize-1] = 0; /* just in case */
 #else
   buf = gpmalloc(bufsize);
   (void)vsprintf(buf,str,args); /* pray it does fit */
diff -pru pari-word-new2/src/language/init.c pari-word-new1/src/language/init.c
--- pari-word-new2/src/language/init.c	Sun Nov 10 01:03:52 2002
+++ pari-word-new1/src/language/init.c	Sun Nov 10 00:26:26 2002
@@ -1428,6 +1428,9 @@ shiftaddress(GEN x, PARI_word dec)
       else
       {
         x[i] += dec;
+#ifdef PARIWORD_IS_LONG_LONG
+        x[i] = (GEN2PARI_word)(PARI_word2GEN)(x[i]);
+#endif
         shiftaddress((GEN)x[i], dec);
       }
     }
@@ -1452,12 +1455,15 @@ bin_copy(GENbin *p)
 {
   GEN x,y,base;
   PARI_word dx,len;
+  long shift;
 
   x   = p->x; if (!x) { free(p); return gzero; }
   len = p->len;
   base= p->base; dx = x - base;
   y = (GEN)memcpy((void*)new_chunk(len), (void*)GENbase(p), len*sizeof(PARI_word));
-  y += dx; shiftaddress(y, (y-x)*sizeof(PARI_word));
+  y += dx;
+  shift = (y-x)*sizeof(PARI_word);	/* Cannot use long long: gcc 2.8.1... */
+  shiftaddress(y, ((char*)y) - ((char*)x));
   free(p); return y;
 }
 
@@ -1644,7 +1650,7 @@ gerepile(pari_sp av, pari_sp tetpil, GEN
   GEN ll,a,b;
 
   if (dec==0) return q;
-  if ((PARI_word)dec<0) err(talker,"lbot>ltop in gerepile");
+  if (av < tetpil) err(talker,"lbot>ltop in gerepile");
 
   if ((pari_sp)q >= avma && (pari_sp)q < tetpil)
     q = (GEN) (((pari_sp)q) + dec);
@@ -2165,7 +2171,7 @@ entree functions_basic[]={
 {"kronecker",2,(void*)gkronecker,4,"GG"},
 {"lcm",99,(void*)glcm0,4,"GDG"},
 {"length",10,(void*)glength,2,"lG"},
-{"lex",20,(void*)lexcmp,1,"lGG"},
+{"lex",20,(void*)lexcmp_l,1,"lGG"},
 {"lift",99,(void*)lift0,2,"GDn"},
 {"lindep",99,(void*)lindep0,8,"GD0,L,p"},
 {"listcreate",11,(void*)listcreate,8,"L"},
diff -pru pari-word-new2/src/language/sumiter.c pari-word-new1/src/language/sumiter.c
--- pari-word-new2/src/language/sumiter.c	Sun Nov 10 01:03:30 2002
+++ pari-word-new1/src/language/sumiter.c	Sun Nov 10 00:39:46 2002
@@ -202,7 +202,7 @@ fordiv(GEN a, entree *ep, char *ch)
  *   fl = 2:        a1 <  ... <  an
  */
 typedef struct {
-  GEN *a, *m, *M;
+  GEN a, *m, *M;
   PARI_word n,fl;
   char *ch;
 } fvdat;
@@ -211,28 +211,28 @@ typedef struct {
 static void
 fvloop(PARI_word i, fvdat *d)
 {
-  d->a[i] = d->m[i];
+  VEC_elt_set(d->a, i, d->m[i]);
   if (d->fl && i > 1)
   {
-    GEN p1 = gsub(d->a[i], d->a[i-1]);
+    GEN p1 = gsub(VEC_elt(d->a, i), VEC_elt(d->a, i-1));
     if (gsigne(p1) < 0)
-      d->a[i] = gadd(d->a[i], gceil(gneg_i(p1)));
-    if (d->fl == 2 && gegal(d->a[i], d->a[i-1]))
-      d->a[i] = gadd(d->a[i], gun);
+      VEC_elt_set(d->a,i, gadd(VEC_elt(d->a,i), gceil(gneg_i(p1))));
+    if (d->fl == 2 && gegal(VEC_elt(d->a, i), VEC_elt(d->a, i-1)))
+      VEC_elt_set(d->a, i, gadd(VEC_elt(d->a, i), gun));
   }
   if (i+1 == d->n)
-    while (gcmp(d->a[i], d->M[i]) <= 0)
+    while (gcmp(VEC_elt(d->a,i), d->M[i]) <= 0)
     {
       pari_sp av = avma; (void)lisseq(d->ch); avma = av;
       if (loop_break()) { d->n = 0; return; }
-      d->a[i] = gadd(d->a[i], gun);
+      VEC_elt_set(d->a, i, gadd(VEC_elt(d->a,i), gun));
     }
   else
-    while (gcmp(d->a[i], d->M[i]) <= 0)
+    while (gcmp(VEC_elt(d->a,i), d->M[i]) <= 0)
     {
       pari_sp av = avma; fvloop(i+1, d); avma = av;
       if (!d->n) return;
-      d->a[i] = gadd(d->a[i], gun);
+      VEC_elt_set(d->a, i, gadd(VEC_elt(d->a,i), gun));
     }
 }
 
@@ -240,31 +240,31 @@ fvloop(PARI_word i, fvdat *d)
 static void
 fvloop_i(PARI_word i, fvdat *d)
 {
-  d->a[i] = setloop(d->m[i]);
+  VEC_elt_set(d->a, i, setloop(d->m[i]));
   if (d->fl && i > 1)
   {
-    int c = cmpii(d->a[i], d->a[i-1]);
+    int c = cmpii(VEC_elt(d->a,i), VEC_elt(d->a, i-1));
     if (c < 0)
     {
-      d->a[i] = setloop(d->a[i-1]);
+      VEC_elt_set(d->a, i, setloop(VEC_elt(d->a, i-1)));
       c = 0;
     }
     if (c == 0 && d->fl == 2)
-      d->a[i] = incloop(d->a[i]);
+      VEC_elt_set(d->a, i, incloop(VEC_elt(d->a, i)));
   }
   if (i+1 == d->n)
-    while (gcmp(d->a[i], d->M[i]) <= 0)
+    while (gcmp(VEC_elt(d->a, i), d->M[i]) <= 0)
     {
       pari_sp av = avma; (void)lisseq(d->ch); avma = av;
       if (loop_break()) { d->n = 0; return; }
-      d->a[i] = incloop(d->a[i]);
+      VEC_elt_set(d->a, i, incloop(VEC_elt(d->a,i)));
     }
   else
-    while (gcmp(d->a[i], d->M[i]) <= 0)
+    while (gcmp(VEC_elt(d->a, i), d->M[i]) <= 0)
     {
       pari_sp av = avma; fvloop_i(i+1, d); avma = av;
       if (!d->n) return;
-      d->a[i] = incloop(d->a[i]);
+      VEC_elt_set(d->a, i, incloop(VEC_elt(d->a,i)));
     }
 }
 
@@ -279,7 +279,7 @@ forvec(entree *ep, GEN x, char *c, PARI_
   if (flag<0 || flag>2) err(flagerr);
   d->n = lg(x);
   d->ch = c;
-  d->a = (GEN*)cgetg(d->n,t_VEC); push_val(ep, (GEN)d->a);
+  d->a = cgetg(d->n,t_VEC); push_val(ep, d->a);
   if (d->n == 1) (void)lisseq(d->ch);
   else
   {
@@ -289,15 +289,15 @@ forvec(entree *ep, GEN x, char *c, PARI_
     d->M = (GEN*)cgetg(d->n,t_VEC);
     for (i=1; i<d->n; i++)
     {
-      GEN *e = (GEN*) x[i];
+      GEN e = VEC_elt(x, i);
       tx = typ(e);
       if (! is_vec_t(tx) || lg(e)!=3)
 	err(talker,"not a vector of two-component vectors in forvec");
-      if (gcmp(e[1],e[2]) > 0) d->n = 0;
+      if (gcmp(VEC_elt(e, 1), VEC_elt(e,2)) > 0) d->n = 0;
       if (typ(e[1]) != t_INT) t = t_REAL;
       /* in case x is an ep->value and lisexpr(d->ch) kills it, have to copy */
-      d->m[i] = gcopy(e[1]);
-      d->M[i] = gcopy(e[2]);
+      d->m[i] = gcopy(VEC_elt(e,1));
+      d->M[i] = gcopy(VEC_elt(e,2));
     }
     if (t == t_INT) fvloop_i(1, d); else fvloop(1, d);
   }
diff -pru pari-word-new2/src/modules/elliptic.c pari-word-new1/src/modules/elliptic.c
--- pari-word-new2/src/modules/elliptic.c	Sun Nov 10 01:03:42 2002
+++ pari-word-new1/src/modules/elliptic.c	Sun Nov 10 00:26:26 2002
@@ -1979,7 +1979,7 @@ apell(GEN e, GEN p)
 #  define TEMPC 46337
 #  define TEMPMAX as_UWORD(16777215)
 #else
-#  define TEMPC 3037000493
+#  define TEMPC as_UWORD(3037000493)
 #  define TEMPMAX as_UWORD(4294967295)
 #endif
 
diff -pru pari-word-new2/src/modules/subfield.c pari-word-new1/src/modules/subfield.c
--- pari-word-new2/src/modules/subfield.c	Sun Nov 10 01:03:52 2002
+++ pari-word-new1/src/modules/subfield.c	Sun Nov 10 00:26:26 2002
@@ -507,22 +507,22 @@ GEN
 TR_pol(GEN P, GEN c)
 {
   pari_sp av = avma, lim;
-  GEN Q, *R;
+  GEN Q, R;
   PARI_word i, k, n;
   
   if (!signe(P) || gcmp0(c)) return gcopy(P);
   Q = dummycopy(P);
-  R = (GEN*)(Q+2); n = degpol(P);
+  R = Q+2; n = degpol(P);
   lim = stack_lim(av, 2);
   if (gcmp1(c))
   {
     for (i=1; i<=n; i++)
     {
-      for (k=n-i; k<n; k++) R[k] = gadd(R[k], R[k+1]);
+      for (k=n-i; k<n; k++) VEC_elt_set(R, k, gadd(VEC_elt(R,k), VEC_elt(R,k+1)));
       if (low_stack(lim, stack_lim(av,2)))
       {
         if(DEBUGMEM>1) err(warnmem,"TR_POL(1), i = %"IWdf"/%"IWdf, i,n);
-        Q = gerepilecopy(av, Q); R = (GEN*)Q+2;
+        Q = gerepilecopy(av, Q); R = Q+2;
       }
     }
   }
@@ -530,11 +530,11 @@ TR_pol(GEN P, GEN c)
   {
     for (i=1; i<=n; i++)
     {
-      for (k=n-i; k<n; k++) R[k] = gsub(R[k], R[k+1]);
+      for (k=n-i; k<n; k++) VEC_elt_set(R, k, gsub(VEC_elt(R,k), VEC_elt(R,k+1)));
       if (low_stack(lim, stack_lim(av,2)))
       {
         if(DEBUGMEM>1) err(warnmem,"TR_POL(-1), i = %"IWdf"/%"IWdf, i,n);
-        Q = gerepilecopy(av, Q); R = (GEN*)Q+2;
+        Q = gerepilecopy(av, Q); R = Q+2;
       }
     }
   }
@@ -542,11 +542,11 @@ TR_pol(GEN P, GEN c)
   {
     for (i=1; i<=n; i++)
     {
-      for (k=n-i; k<n; k++) R[k] = gadd(R[k], gmul(c, R[k+1]));
+      for (k=n-i; k<n; k++) VEC_elt_set(R, k, gadd(VEC_elt(R, k), gmul(c, VEC_elt(R, k+1))));
       if (low_stack(lim, stack_lim(av,2)))
       {
         if(DEBUGMEM>1) err(warnmem,"TR_POL, i = %"IWdf"/%"IWdf, i,n);
-        Q = gerepilecopy(av, Q); R = (GEN*)Q+2;
+        Q = gerepilecopy(av, Q); R = Q+2;
       }
     }
   }