diff options
| author | 2022-08-25 10:38:08 +0200 | |
|---|---|---|
| committer | 2022-08-25 10:38:08 +0200 | |
| commit | 128c854f4ecb5f158cce3d91bb266ab000f27d4b (patch) | |
| tree | 3cf34279e1d325f3f5a83a5524fe3c23462f3b98 /src | |
| parent | c511c1a189cf0df60487c286caced0b251104859 (diff) | |
add cond switch
Diffstat (limited to 'src')
| -rw-r--r-- | src/llvm.cff | 26 | ||||
| -rw-r--r-- | src/parse.cff | 2 |
2 files changed, 27 insertions, 1 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); diff --git a/src/parse.cff b/src/parse.cff index 2ac15ba..dc3cad3 100644 --- a/src/parse.cff +++ b/src/parse.cff @@ -2309,9 +2309,9 @@ fn pstcswitch(P *Parser, loc Loc) Stmt { c.test = parseexpr(P); lexexpect(P, ';'); c.t = parseblock0(P); + cs->push(c); } - return { loc, :CSwitch { cs->move(P.alloc), f }}; } |