aboutsummaryrefslogtreecommitdiff
path: root/src/llvm.cff
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2022-08-25 06:13:58 +0200
committerlemon <lsof@mailbox.org>2022-08-25 06:13:58 +0200
commit033e0fc64415dcaebf15ec26f743e8916fc0aa03 (patch)
treea851cfa66289e9a3f8f8b3d01a0731606763298b /src/llvm.cff
parent4f479ac68028a89c8e545f72335642c42a5c4efe (diff)
iswitch
Diffstat (limited to 'src/llvm.cff')
-rw-r--r--src/llvm.cff23
1 files changed, 23 insertions, 0 deletions
diff --git a/src/llvm.cff b/src/llvm.cff
index e64d2e3..9ad67a2 100644
--- a/src/llvm.cff
+++ b/src/llvm.cff
@@ -883,6 +883,29 @@ fn genstmt(f *Fn, block *Block, st *Stmt) void {
let retty = f.ty.u.Fn.ret;
gen("\tret %t %v\n", retty, convert(f, retty, e));
}
+ case ISwitch *sw;
+ static swid int = {};
+ let id = swid++;
+ let test = genexpr(f, &sw.ex);
+ gen("\tswitch %t %v, label %%ISx%d [", test.ty, test);
+ foreach (c, i, sw.cs) {
+ foreach_ptr (ex, _, c.es) {
+ let t = convert(f, test.ty, ex);
+ gen(" %t %v, label %%IS%d.%d ", t.ty, t, id, i);
+ }
+ }
+ gen(" ]\n");
+ foreach (c, i, sw.cs) {
+ gen("IS%d.%d: ", id, i);
+ genblock(f, c.t);
+ gen("\tbr label %%ISe%d\n", id);
+ }
+ gen("ISx%d: ", id);
+ genblock(f, sw.f);
+ gen("\tbr label %%ISe%d\n", id);
+ gen("ISe%d: ", id);
+ nop();
+
case else
assert(#f, "stmt? %d", st.u.#tag);
}