shithub: scc

Download patch

ref: 73ea23b4798899eeb1aec7d9e19b594f8000c016
parent: 53e36437d86d46131b359596f1e62ff9f3166a0b
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Sun Aug 10 19:46:33 EDT 2014

Add bit logical operations to cc2

--- a/cc2/cc2.h
+++ b/cc2/cc2.h
@@ -73,6 +73,9 @@
 #define ODIV      '/'
 #define OSHL      'l'
 #define OSHR      'r'
+#define OBAND     '&'
+#define OBOR      '|'
+#define OBXOR     '^'
 
 extern void error(unsigned nerror, ...);
 extern void genaddable(Node *list[]);
--- a/cc2/cgen.c
+++ b/cc2/cgen.c
@@ -125,8 +125,9 @@
 
 	switch (np->op) {
 	case OINC:
-	case OADD: case OASSIG: case OMOD: case ODIV:
+	case OADD: case OSUB:  case OASSIG: case OMOD: case ODIV:
 	case OSHL: case OSHR:
+	case OBAND: case OBOR: case OBXOR:
 		break;
 	default:
 		abort();
@@ -194,6 +195,7 @@
 	case OINC:
 	case OASSIG: case OADD: case OSUB: case OMOD: case ODIV:
 	case OSHL:   case OSHR:
+	case OBAND:  case OBOR: case OBXOR:
 		xaddable(lp);
 		xaddable(rp);
 		break;
--- a/cc2/parser.c
+++ b/cc2/parser.c
@@ -243,6 +243,25 @@
 	}
 }
 
+static void
+assignment(char *token)
+{
+	Node *np = newnode();
+
+	np->right = pop();
+	np->left = pop();
+	np->op = *token;
+	switch (*++token) {
+	case OADD: case OSUB: case OINC:  case OMOD: case ODIV:
+	case OSHL: case OSHR: case OBAND: case OBOR: case OBXOR:
+		np->subop = *++token;
+	default:
+		np->type = gettype(token);
+		break;
+	}
+	push(np);
+}
+
 static void (*optbl[])(char *) = {
 	['+'] = operator,
 	['%'] = operator,
@@ -249,9 +268,12 @@
 	['-'] = operator,
 	['*'] = operator,
 	['/'] = operator,
-	[':'] = operator,
 	['l'] = operator,
 	['r'] = operator,
+	['&'] = operator,
+	['|'] = operator,
+	['^'] = operator,
+	[':'] = assignment,
 	[';'] = increment,
 	['A'] = variable,
 	['T'] = variable,
--