ref: 0a32c4a074ed8411162f5d26b24dcf3206ba3bd6
parent: e915714cbfee3ac1d5bcfcbb3cda56939f64821e
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Tue Jun 7 05:19:17 EDT 2016
[cc2-qbe] Add assign() in cgen.c We need to do assigments like temporal step in some of the operations of the nodes, so having this function can make the code simpler.
--- a/cc2/arch/qbe/cgen.c
+++ b/cc2/arch/qbe/cgen.c
@@ -289,6 +289,32 @@
return np->right = cgen(tmp);
}
+static Node *
+assign(Node *to, Node *from)
+{
+ Type *tp = &to->type;
+ int op;
+
+ switch (tp->size) {
+ case 1:
+ op = ASSTB;
+ break;
+ case 2:
+ op = ASSTH;
+ break;
+ case 4:
+ op = (tp->flags & INTF) ? ASSTW : ASSTS;
+ break;
+ case 8:
+ op = (tp->flags & INTF) ? ASSTL : ASSTD;
+ break;
+ default:
+ abort();
+ }
+ code(op, to, from, NULL);
+ return from;
+}
+
/* TODO: Fix "memory leaks" */
Node *
cgen(Node *np)
@@ -379,24 +405,7 @@
abort();
case OASSIG:
abbrev(np);
- switch (tp->size) {
- case 1:
- op = ASSTB;
- break;
- case 2:
- op = ASSTH;
- break;
- case 4:
- op = (tp->flags & INTF) ? ASSTW : ASSTS;
- break;
- case 8:
- op = (tp->flags & INTF) ? ASSTL : ASSTD;
- break;
- default:
- abort();
- }
- code(op, np->left, load(np, LOADR), NULL);
- return np->right;
+ return assign(np->left, load(np, LOADR));
case OCOMMA:
return np->right;
case OCALL: