From df61decee5095479f4760f36027a445d8d792373 Mon Sep 17 00:00:00 2001 From: Quentin Carbonneaux Date: Fri, 24 Feb 2017 15:52:56 -0500 Subject: start a new simplification pass --- simpl.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 simpl.c (limited to 'simpl.c') diff --git a/simpl.c b/simpl.c new file mode 100644 index 0000000..384a8da --- /dev/null +++ b/simpl.c @@ -0,0 +1,46 @@ +#include "all.h" + +static void +elimext(Ins *i, int ext, Fn *fn) +{ + Tmp *t; + Use *u; + + assert(rtype(i->to) == RTmp); + t = &fn->tmp[i->to.val]; + for (u=t->use; u<&t->use[t->nuse]; u++) + if (u->type == UIns + && u->u.ins->op == ext + && (u->u.ins->cls == i->cls || i->cls == Kl)) { + u->u.ins->op = Ocopy; + elimext(u->u.ins, ext, fn); + } +} + +/* requires & preserves uses */ +void +simpl(Fn *fn) +{ + Blk *b; + Ins *i; + int ext; + + for (b=fn->start; b; b=b->link) + for (i=b->ins; i<&b->ins[b->nins]; i++) + switch (i->op) { + case Oloadsb: + case Oloadub: + case Oloadsh: + case Oloaduh: + ext = Oextsb + (i->op - Oloadsb); + goto Elimext; + case Oextsb: + case Oextub: + case Oextsh: + case Oextuh: + ext = i->op; + Elimext: + elimext(i, ext, fn); + break; + } +} -- cgit 1.4.1