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,
--
⑨