scc

simple c99 compiler
git clone git://git.simple-cc.org/scc
Log | Files | Refs | Submodules | README | LICENSE

commit 4f7d9870d96a7c5f536584b96763d0909116644a
parent 8addc23ae4c1b201b63690f1ec7d99aa92a6eaf7
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date:   Fri, 20 Jan 2023 00:47:57 +0100

cc2-qbe: Add rhs_rhs() and lhs_rhs()

These functions help to use the sethi numbers when it is needed.

Diffstat:
Msrc/cmd/cc/cc2/target/qbe/cgen.c | 60++++++++++++++++++++++++++++++++++++------------------------
1 file changed, 36 insertions(+), 24 deletions(-)

diff --git a/src/cmd/cc/cc2/target/qbe/cgen.c b/src/cmd/cc/cc2/target/qbe/cgen.c @@ -548,6 +548,38 @@ assignop(Type *tp) } } +static void +rhs_rhs(Node **lp, Node **rp) +{ + Node *l = *lp, *r = *rp; + + if (l->complex >= r->complex) { + l = rhs(l); + r = rhs(r); + } else { + r = rhs(r); + l = rhs(l); + } + + *lp = l, *rp = r; +} + +static void +lhs_rhs(Node **lp, Node **rp) +{ + Node *l = *lp, *r = *rp; + + if (l->complex >= r->complex) { + l = lhs(l); + r = rhs(r); + } else { + r = rhs(r); + l = lhs(l); + } + + *lp = l, *rp = r; +} + static Node * assign(Node *np) { @@ -563,7 +595,7 @@ assign(Node *np) case ODEC: op = OSUB; post_oper: - l = lhs(l); + lhs_rhs(&l, &r); ret = load(&l->type, l); aux.op = op; aux.left = ret; @@ -575,13 +607,7 @@ assign(Node *np) /* assign abbreviation */ assert(l->type.size == r->type.size); if (r->type.size < 4) { - if (l->complex >= r->complex) { - l = lhs(l); - r = rhs(r); - } else { - r = rhs(r); - l = lhs(l); - } + lhs_rhs(&l, &r); aux.op = np->u.subop; aux.left = load(&r->type, l); aux.right = r; @@ -598,13 +624,7 @@ assign(Node *np) aux.address = np->address; r = sethi(&aux); case 0: - if (l->complex >= r->complex) { - l = lhs(l); - r = rhs(r); - } else { - r = rhs(r); - l = lhs(l); - } + lhs_rhs(&l, &r); ret = r; break; } @@ -681,15 +701,7 @@ rhs(Node *np) size = tp->size == 8; isfloat = (tp->flags & FLOATF) != 0; op = opbin[isfloat][size][np->op][sign]; - - if (l->complex >= r->complex) { - l = rhs(l); - r = rhs(r); - } else { - r = rhs(r); - l = rhs(l); - } - + rhs_rhs(&l, &r); tmp = tmpnode(tp); code(op, tmp, l, r); return tmp;