aboutsummaryrefslogtreecommitdiff
path: root/amd64/emit.c
diff options
context:
space:
mode:
Diffstat (limited to 'amd64/emit.c')
-rw-r--r--amd64/emit.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/amd64/emit.c b/amd64/emit.c
index 6cf37ec..7290a80 100644
--- a/amd64/emit.c
+++ b/amd64/emit.c
@@ -576,6 +576,43 @@ emitins(Ins i, E *e)
case Odbgloc:
emitdbgloc(i.arg[0].val, i.arg[1].val, e->f);
break;
+ case Oxselieq:
+ case Oxseline:
+ case Oxselisge:
+ case Oxselisgt:
+ case Oxselisle:
+ case Oxselislt:
+ case Oxseliuge:
+ case Oxseliugt:
+ case Oxseliule:
+ case Oxseliult:
+ case Oxselfeq:
+ case Oxselfge:
+ case Oxselfgt:
+ case Oxselfle:
+ case Oxselflt:
+ case Oxselfne:
+ case Oxselfo:
+ case Oxselfuo:
+ {
+ // TODO - how to do this "properly"?
+ static char *F0[] = {
+ "z", "nz", "ge", "g", "le", "l", "ae", "a", "be", "b",
+ "nz", "ae", "a", "be", "b", "nz", "p", "np"
+ };
+ static char *F1[] = {
+ "nz", "z", "l", "le", "g", "ge", "b", "be", "a", "ae",
+ "z", "b", "be", "a", "ae", "z", "p", "np"
+ };
+ char ins[16];
+ sprintf(ins, "cmov%s %%1, %%=", F1[i.op-Oxselieq]);
+ if (req(i.to, i.arg[1]))
+ sprintf(ins, "cmov%s %%0, %%=", F0[i.op-Oxselieq]);
+ else if (!req(i.to, i.arg[0]))
+ emitf("mov %0, %=", &i, e);
+ emitf(ins, &i, e);
+ break;
+ }
}
}