aboutsummaryrefslogtreecommitdiff
path: root/src/llvm.cff
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2022-08-25 10:38:08 +0200
committerlemon <lsof@mailbox.org>2022-08-25 10:38:08 +0200
commit128c854f4ecb5f158cce3d91bb266ab000f27d4b (patch)
tree3cf34279e1d325f3f5a83a5524fe3c23462f3b98 /src/llvm.cff
parentc511c1a189cf0df60487c286caced0b251104859 (diff)
add cond switch
Diffstat (limited to 'src/llvm.cff')
-rw-r--r--src/llvm.cff26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/llvm.cff b/src/llvm.cff
index b0111fe..81fe056 100644
--- a/src/llvm.cff
+++ b/src/llvm.cff
@@ -954,6 +954,32 @@ fn genstmt(f *Fn, block *Block, st *Stmt) void {
gen("\tbr label %%ESe%d\n", id);
gen("ESe%d: ", id);
nop();
+
+ case CSwitch *sw;
+ static swid int = {};
+ let id = swid++;
+
+
+ if sw.cs.#len == 0 {
+ gen("\tbr label %%CSx%d\n", id);
+ }
+ foreach (c, i, sw.cs) {
+ let t = llvmbool(f, &c.test);
+ gen("\tbr i1 %v, label %%CST%d.%d, label %%CSF%d.%d\n", t, id, i, id, i);
+ gen("CST%d.%d: ", id, i);
+ genblock(f, c.t);
+ gen("\tbr label %%CSe%d\n", id);
+ gen("CSF%d.%d: ", id, i);
+ if i == sw.cs.#len - 1 {
+ gen("\tbr label %%CSx%d\n", id);
+ }
+ }
+ gen("CSx%d: ", id);
+ genblock(f, sw.f);
+ gen("\tbr label %%CSe%d\n", id);
+ gen("CSe%d: ", id);
+ nop();
+
case else
assert(#f, "stmt? %d", st.u.#tag);