]> Cypherpunks repositories - gostls13.git/commitdiff
added bitclear operators &^ and &^=
authorKen Thompson <ken@golang.org>
Thu, 12 Mar 2009 02:59:35 +0000 (19:59 -0700)
committerKen Thompson <ken@golang.org>
Thu, 12 Mar 2009 02:59:35 +0000 (19:59 -0700)
R=r
OCL=26152
CL=26152

src/cmd/gc/const.c
src/cmd/gc/go.h
src/cmd/gc/go.y
src/cmd/gc/lex.c
src/cmd/gc/mparith2.c
src/cmd/gc/subr.c
src/cmd/gc/walk.c

index 85d8a1ded577aa1cd77c2e4e54b70525f38286b9..116341cdf4c6f1910e3d00c3cdd1a9c8556043b2 100644 (file)
@@ -314,6 +314,9 @@ evconst(Node *n)
        case TUP(OAND, Wlitint):
                mpandfixfix(xval, nr->val.u.xval);
                break;
+       case TUP(OANDNOT, Wlitint):
+               mpandnotfixfix(xval, nr->val.u.xval);
+               break;
        case TUP(OXOR, Wlitint):
                mpxorfixfix(xval, nr->val.u.xval);
                break;
index dd57981961adc278074ed36c197eb5219fac7901..c87cf05ef159ee06423762e39587ad152e737436 100644 (file)
@@ -314,7 +314,7 @@ enum
        OANDAND,
        OEQ, ONE, OLT, OLE, OGE, OGT,
        OADD, OSUB, OOR, OXOR,
-       OMUL, ODIV, OMOD, OLSH, ORSH, OAND,
+       OMUL, ODIV, OMOD, OLSH, ORSH, OAND, OANDNOT,
        OINC, ODEC,     // placeholders - not used
        OFUNC,
        OLABEL,
@@ -610,6 +610,7 @@ void        mpdivmodfixfix(Mpint *q, Mpint *r, Mpint *n, Mpint *d);
 void   mpdivfract(Mpint *a, Mpint *b);
 void   mpnegfix(Mpint *a);
 void   mpandfixfix(Mpint *a, Mpint *b);
+void   mpnotandfixfix(Mpint *a, Mpint *b);
 void   mplshfixfix(Mpint *a, Mpint *b);
 void   mporfixfix(Mpint *a, Mpint *b);
 void   mprshfixfix(Mpint *a, Mpint *b);
index 7635e163c073eb9c28e9050b840d9a9f288b1e58..87e8e53f784cf1ae2a492ff2e103d44567402273 100644 (file)
@@ -25,7 +25,7 @@
 %token <sym>           LNIL LTRUE LFALSE LIOTA
 
 %token                 LOROR LANDAND LEQ LNE LLE LLT LGE LGT
-%token                 LLSH LRSH LINC LDEC LCOMM
+%token                 LLSH LRSH LINC LDEC LCOMM LANDNOT
 %token                 LIGNORE
 
 /*
@@ -87,7 +87,7 @@
 %left                  LCOMM
 %left                  LEQ LNE LLE LGE LLT LGT
 %left                  '+' '-' '|' '^'
-%left                  '*' '/' '%' '&' LLSH LRSH
+%left                  '*' '/' '%' '&' LLSH LRSH LANDNOT
 
 /*
  * resolve { vs condition in favor of condition
@@ -766,6 +766,10 @@ expr:
        {
                $$ = nod(OAND, $1, $3);
        }
+|      expr LANDNOT expr
+       {
+               $$ = nod(OANDNOT, $1, $3);
+       }
 |      expr LLSH expr
        {
                $$ = nod(OLSH, $1, $3);
index 179d0518e099feee0592056374688f8bfbc47deb..23717d3417be7dfeea5afe8c4d4fdb0d90b5dedb 100644 (file)
@@ -654,6 +654,15 @@ l0:
                        c = LANDAND;
                        goto lx;
                }
+               if(c1 == '^') {
+                       c = LANDNOT;
+                       c1 = getc();
+                       if(c1 == '=') {
+                               c = OANDNOT;
+                               goto asop;
+                       }
+                       break;
+               }
                if(c1 == '=') {
                        c = OAND;
                        goto asop;
index f7c2ea2c2b7cd518f2cbe9a483e08d905bf60bdf..622a7c58dd3bbd1c89218f66507e137577c7fc27 100644 (file)
@@ -406,6 +406,40 @@ mpandfixfix(Mpint *a, Mpint *b)
        }
 }
 
+void
+mpandnotfixfix(Mpint *a, Mpint *b)
+{
+       int i;
+       long x, *a1, *b1;
+
+       if(a->ovf || b->ovf) {
+               warn("ovf in mpandnotfixfix");
+               mpmovecfix(a, 0);
+               a->ovf = 1;
+               return;
+       }
+       if(a->neg) {
+               a->neg = 0;
+               mpneg(a);
+       }
+       if(b->neg)
+               mpneg(b);
+
+       a1 = &a->a[0];
+       b1 = &b->a[0];
+       for(i=0; i<Mpprec; i++) {
+               x = *a1 & ~*b1++;
+               *a1++ = x;
+       }
+
+       if(b->neg)
+               mpneg(b);
+       if(x & Mpsign) {
+               a->neg = 1;
+               mpneg(a);
+       }
+}
+
 void
 mpxorfixfix(Mpint *a, Mpint *b)
 {
index bfc090a2c2dc8d973c15fc1d43eebada67ba081f..723937b2d026a5b91d2cbab44db9a4702245de8a 100644 (file)
@@ -643,6 +643,7 @@ opnames[] =
        [OADDR]         = "ADDR",
        [OADD]          = "ADD",
        [OANDAND]       = "ANDAND",
+       [OANDNOT]       = "ANDNOT",
        [OAND]          = "AND",
        [OARRAY]        = "ARRAY",
        [OASOP]         = "ASOP",
index 4652a75f8ceed5875a3dcd7b51ca1bcf1c79c406..b8821e6f70ee74649e80a60590e3cfbf4af229b1 100644 (file)
@@ -667,6 +667,7 @@ loop:
 
        case OMOD:
        case OAND:
+       case OANDNOT:
        case OOR:
        case OXOR:
        case OANDAND:
@@ -700,6 +701,20 @@ loop:
                        goto badt;
 
                switch(n->op) {
+               case OANDNOT:
+                       n->op = OAND;
+                       n->right = nod(OCOM, n->right, N);
+                       n->right->type = n->right->left->type;
+                       break;
+
+               case OASOP:
+                       if(n->etype == OANDNOT) {
+                               n->etype = OAND;
+                               n->right = nod(OCOM, n->right, N);
+                               n->right->type = n->right->left->type;
+                               break;
+                       }
+
                case OEQ:
                case ONE:
                case OLT:
@@ -707,11 +722,11 @@ loop:
                case OGE:
                case OGT:
                case OADD:
-               case OASOP:
                        if(istype(n->left->type, TSTRING)) {
                                indir(n, stringop(n, top));
                                goto ret;
                        }
+                       break;
                }
                break;
 
@@ -1070,6 +1085,7 @@ loop:
        case OLSH:
        case ORSH:
        case OAND:
+       case OANDNOT:
        case OOR:
        case OXOR:
        case OMOD: