aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2022-08-24 18:13:58 +0200
committerlemon <lsof@mailbox.org>2022-08-24 18:13:58 +0200
commit12e1b45da9b79247f4655332c298c08a2ad5c9b4 (patch)
tree387dd065694312a2fcad11be2d2b7d1f3bd75e66
parentc2c317bf1c0f4c0b76b396a7d33f8c6362d1d300 (diff)
do-while
-rw-r--r--examples/life.cff4
-rw-r--r--src/llvm.cff13
2 files changed, 15 insertions, 2 deletions
diff --git a/examples/life.cff b/examples/life.cff
index cbdd3e0..8b58cf4 100644
--- a/examples/life.cff
+++ b/examples/life.cff
@@ -64,9 +64,9 @@ fn init(b *Board) void {
extern fn usleep(u32) void;
extern fn main() void {
init(&board);
- for ;; {
+ do {
draw(&board);
usleep(100);
next(&board);
- }
+ } while #t;
}
diff --git a/src/llvm.cff b/src/llvm.cff
index 4644ee5..5772f76 100644
--- a/src/llvm.cff
+++ b/src/llvm.cff
@@ -784,6 +784,19 @@ fn genstmt(f *Fn, block *Block, st *Stmt) void {
gen("Brk%d:",loop.id);
nop();
+ case DoWhile loop;
+ gen("\tbr label %%Next%d\n", loop.id);
+ gen("Next%d:", loop.id);
+ nop();
+ genblock(f, loop.body);
+ gen("\tbr label %%Cont%d\n", loop.id);
+ gen("Cont%d:", loop.id);
+ nop();
+ gen("\tbr i1 %v, label %%Next%d, label %%Brk%d\n",
+ llvmbool(f, &loop.test), loop.id, loop.id);
+ gen("Brk%d:",loop.id);
+ nop();
+
case For loop;
genblock(f, loop.ini);
gen("\tbr label %%Cont%d\n", loop.id);