shithub: scc

Download patch

ref: e5e6cd22621169df9a8cc696500c64de3740b835
parent: 56cb1396d9f421006f2907dc4d504127f8ed0e1d
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Wed Nov 3 18:56:02 EDT 2021

cc2/qbe: Move casts in assignation to sethi()

Some basic transformations are done in sethi(), and the
cast transfornation in assignment fit in that category.
When the lhs has a cast it implies a cast in the rhs,
because the value to store must be transformed to the
type forced in the cast of the lhs.

--- a/src/cmd/cc/cc2/target/qbe/cgen.c
+++ b/src/cmd/cc/cc2/target/qbe/cgen.c
@@ -556,7 +556,6 @@
 	case OCAST:
 		return cast(tp, rhs(l, &aux1), ret);
 	case OASSIG:
-		/* TODO: Do this transformations in sethi */
 		switch (np->u.subop) {
 		case OINC:
 			op = OADD;
@@ -578,15 +577,6 @@
 			aux2.right = np->right;
 			aux2.left = np->left;
 			r = rhs(&aux2, &aux1);
-
-			if (l->op == OCAST) {
-				aux3.type = l->left->type;
-				aux3.op = OCAST;
-				aux3.left = r;
-				aux3.right = NULL;
-				r = &aux3;
-				l = l->left;
-			}
 		case 0:
 			if (l->complex >= r->complex) {
 				lhs(l, &aux2);
@@ -683,6 +673,7 @@
 Node *
 sethi(Node *np)
 {
+	int op;
 	Node *lp, *rp;
 
 	if (!np)
@@ -700,6 +691,21 @@
 	case OCONST:
 		np->address = 11;
 		break;
+	case OASSIG:
+		op = np->u.subop;
+		if (op != OINC && op != ODEC) {
+			if (lp->op == OCAST) {
+				Node *tmp = node(OCAST);
+				tmp->type = lp->left->type;
+				tmp->left = rp;
+				tmp->right = NULL;
+				rp = tmp;
+				tmp = lp;
+				lp = lp->left;
+				delnode(tmp);
+			}
+		}
+		goto binary;
 	case OCPL:
 		assert(np->type.flags & INTF);
 		np->op = OBXOR;