diff options
Diffstat (limited to 'src/llvm.cff')
| -rw-r--r-- | src/llvm.cff | 26 |
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); |